One click connects it; one line makes it match the right person
Connecting Stripe has two halves. The first is one click in the dashboard — a Stripe Connect authorization, no API keys to copy or rotate. That click pulls your customers, products, and past subscriptions into Crossdeck automatically; you don't import anything by hand.
The second half is one line in your checkout code, and it's the half people skip. Without it, a Stripe purchase still arrives — but Crossdeck has no way to tell which of your users bought it, so it lands as a brand-new, anonymous "rail-only" customer that never matches the human who paid. That's an orphaned purchase, and it fails quietly in production. The line below is what prevents it.
Click once, then tell Crossdeck who's buying
In the dashboard, open Payment rails → Stripe → Connect with Stripe, approve in Stripe, and you're connected — Crossdeck discovers your history in the background. Watch the film for the click-through.
Then the one code step. When your server creates a Checkout Session, stamp the buyer's Crossdeck reference into the subscription's metadata:
// the reference is the user you already identify()'d — not a new ID
const crossdeckRef = Crossdeck.getCheckoutReference();
await stripe.checkout.sessions.create({
// …your usual mode, line_items, success_url…
subscription_data: { metadata: { crossdeck_ref: crossdeckRef } },
});
That's the whole integration: a click and a key in metadata. The webhooks, signature checks, and idempotency are handled for you — Stripe Connect fans every event into Crossdeck automatically.
The reference is the identity you already set
getCheckoutReference() doesn't invent anything — it hands back the exact user you passed to identify(). You stamp it onto the subscription as crossdeck_ref. When the purchase webhook arrives, Crossdeck reads that key and attaches the subscription to that exact customer — the same person who's been generating events all along.
Leave the key off and the webhook still lands, but with no one to attach to: Crossdeck mints a fresh rail-only customer instead. The purchase is real, the money is real, but it's stranded on a record that will never line up with the human in your app — and untangling it later is manual work you don't want. So the correctness of this entire rail comes down to one thing: the value you passed to identify(). Get that right (you did, in Identify your users) and every purchase settles onto the right person automatically.
The purchase lands on the right customer
Run a test checkout. The subscription appears on the customer you identified — not a stranger — and the entitlement it grants is active on their record, ready for your gate to read.
user_847's Stripe subscription, matched by crossdeck_ref — and the entitlement it grants is live. No orphan, no manual stitch.