DocumentaciónStripe Checkout

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.

Mostrar el código para

// 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.

URL de éxito
https://yoursite.com/thanks?session_id={CHECKOUT_SESSION_ID}

03En un sitio sin cookies

Sin cookie no hay ID que poner en los metadatos, así que la página de éxito es la forma en que un pago encuentra su visita. Un visitante sin cookies dura un día, así que vincula el pago con la visita de ese día.

04Comprueba que funciona

¿Falta algo o no coincide con lo que ves? Escribe a support@tallybyoutpost.com y dinos qué página.