One person, two devices — not two customers
Your user subscribes on your website. A week later they download your app, sign in — and see the free tier. They paid, but the app doesn't know. So they email you, or worse, pay again.
This happens because most billing setups treat "the web customer" and "the app install" as two different people. Crossdeck doesn't. It treats them as one person on two devices — as long as you tell it who they are. That's the entire capability: entitlements that follow a person, not a device.
Call identify with your own user ID
The moment a user signs in, call identify() with your own user ID — the same ID on every platform. That ID is the thread Crossdeck stitches every device, purchase, and entitlement onto. If your backend calls this person user_847 on the web, call them user_847 in the app too.
// Right after the user signs in — same on web and app.
await Crossdeck.identify("user_847", {
email: "[email protected]",
traits: { name: "Wes", plan: "pro" },
});
// Right after the user signs in — same ID as your web call.
cd?.identify(
userId: "user_847",
email: "[email protected]",
traits: ["name": "Wes", "plan": "pro"]
)
What that one call actually does
Behind that call, Crossdeck links this device to the canonical person user_847. Any subscription attached to them — bought on Stripe through the web, or through the App Store on the phone — now resolves to the same identity. The anonymous activity from before sign-in isn't lost either: Crossdeck was already tracking the device, and it merges that history into user_847 at the moment you identify.
So when the app asks "can this user access Pro?", the answer already accounts for the web purchase. You check it the same way on every platform:
if (Crossdeck.isEntitled("pro")) {
showProFeatures();
}
if cd?.isEntitled("pro") == true {
showProFeatures()
}
The one thing to get right: it only works if the ID matches. If the web sends user_847 and the app sends 847 or an email, Crossdeck sees two people and the access won't carry. Use the same stable ID your backend already uses for that account, on every platform — and it works in both directions (an app purchase grants web access too).
Pro, resolved across platforms
Open the customer in your Crossdeck dashboard. The web Stripe subscription and the iOS install collapse into one person, and the entitlement reads as active on every device they own.
user_847 — Stripe (web) + App Store (iOS) collapsed into one identity. The web purchase grants Pro on the phone, verified.