AffiliateRail docs
APIServer-side attribution

Python

Attribute a Stripe customer from Flask, Django or FastAPI.

Flask shown; Django (request.COOKIES) and FastAPI (request.cookies) differ only in where the cookie dictionary lives.

import json
import os
from urllib.parse import unquote

import stripe
from flask import Flask, jsonify, request

stripe.api_key = os.environ["STRIPE_SECRET_KEY"]
app = Flask(__name__)


def rail_referral(cookies) -> str | None:
    """The click id from the `rail_referral` cookie, or None when the visitor had no referral."""
    raw = cookies.get("rail_referral")
    if not raw:
        return None
    try:
        return json.loads(unquote(raw)).get("clickId")
    except (ValueError, AttributeError):
        return None


@app.post("/signup")
def signup():
    click_id = rail_referral(request.cookies)

    customer = stripe.Customer.create(
        email=request.json["email"],
        metadata={"rail_referral": click_id} if click_id else {},
    )

    # Whatever you create next for this customer (a Subscription, a PaymentIntent for Elements)
    # is attributed, because the customer is.
    return jsonify(customer_id=customer.id)

Putting it on the subscription instead works the same way:

stripe.Subscription.create(
    customer=customer.id,
    items=[{"price": PRICE_ID}],
    metadata={"rail_referral": click_id} if click_id else {},
)