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 {},
)