03 · Ingresos
Vincula las ventas de Stripe Checkout con sus visitas
Dos pequeños cambios donde tu servidor crea la sesión: el ID del visitante en los metadatos, y el ID de la sesión en tu página de éxito.
01Pasa el ID del visitante en los metadatos
Donde tu servidor crea la Checkout Session, lee la cookie _tally_vid y pásala como tally_visitor_id en metadata. Para una suscripción, pásala también en subscription_data.metadata, para que sus renovaciones sigan al primer pago. En modo de pago (payment), omite subscription_data: Stripe solo lo acepta para suscripciones.
// Express with cookie-parser (app.use(require('cookie-parser')())), where you create
// the Checkout Session; stripe = require('stripe')(process.env.STRIPE_SECRET_KEY).
app.post('/checkout', async (req, res) => {
const visitorId = req.cookies['_tally_vid'];
const metadata = visitorId ? { 'tally_visitor_id': visitorId } : {};
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
line_items: [{ price: 'price_123', quantity: 1 }],
success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
metadata,
// Renewals read the subscription's metadata. In payment mode, leave this line out.
subscription_data: { metadata },
});
res.redirect(303, session.url);
});
// app/api/checkout/route.ts
import { cookies } from 'next/headers';
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST() {
const visitorId = (await cookies()).get('_tally_vid')?.value;
const metadata: Record<string, string> = visitorId ? { 'tally_visitor_id': visitorId } : {};
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
line_items: [{ price: 'price_123', quantity: 1 }],
success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
metadata,
// Renewals read the subscription's metadata. In payment mode, leave this line out.
subscription_data: { metadata },
});
return Response.json({ url: session.url });
}
# Flask, where you create the Checkout Session (stripe.api_key is your secret key).
import stripe
from flask import redirect, request
@app.post("/checkout")
def checkout():
visitor_id = request.cookies.get("_tally_vid")
metadata = {"tally_visitor_id": visitor_id} if visitor_id else {}
session = stripe.checkout.Session.create(
mode="subscription",
line_items=[{"price": "price_123", "quantity": 1}],
success_url="https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}",
metadata=metadata,
# Renewals read the subscription's metadata. In payment mode, leave this line out.
subscription_data={"metadata": metadata},
)
return redirect(session.url, code=303)
# Rails: app/controllers/checkouts_controller.rb (Stripe.api_key is your secret key).
class CheckoutsController < ApplicationController
def create
visitor_id = cookies['_tally_vid']
metadata = visitor_id ? { 'tally_visitor_id' => visitor_id } : {}
session = Stripe::Checkout::Session.create(
mode: 'subscription',
line_items: [{ price: 'price_123', quantity: 1 }],
success_url: 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
metadata: metadata,
# Renewals read the subscription's metadata. In payment mode, leave this line out.
subscription_data: { metadata: metadata }
)
redirect_to session.url, allow_other_host: true, status: :see_other
end
end
<?php
// Where you create the Checkout Session (stripe/stripe-php).
$stripe = new \Stripe\StripeClient(getenv('STRIPE_SECRET_KEY'));
$visitorId = $_COOKIE['_tally_vid'] ?? null;
$metadata = $visitorId ? ['tally_visitor_id' => $visitorId] : [];
$session = $stripe->checkout->sessions->create([
'mode' => 'subscription',
'line_items' => [['price' => 'price_123', 'quantity' => 1]],
'success_url' => 'https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}',
'metadata' => $metadata,
// Renewals read the subscription's metadata. In payment mode, leave this line out.
'subscription_data' => ['metadata' => $metadata],
]);
header('Location: ' . $session->url, true, 303);
02Conserva el ID de la sesión en tu página de éxito
Añade ?session_id={CHECKOUT_SESSION_ID} a success_url (a return_url para Checkout embebido), con la dirección de tu propia página. Stripe rellena el ID de la sesión, y el snippet de esa página lo envía, así que el pago queda vinculado aunque no se haya podido leer la cookie. También sirve un parámetro checkout_session_id.
https://yoursite.com/thanks?session_id={CHECKOUT_SESSION_ID}04Comprueba que funciona
¿Falta algo o no coincide con lo que ves? Escribe a support@tallybyoutpost.com y dinos qué página.