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

```python
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:

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