Crossdeck University
Watch — entitlements following a person across platforms Film in production
0:00 / 0:00
Lesson 1 of 2 · Cross-platform identity

Make subscriptions follow your users across platforms

A user who pays on your website should be Pro the second they open your iOS app — no second purchase, no support ticket. Here's the one rule that makes it happen.

3 min Web · Swift

When you're done: a web subscriber is Pro the moment they open your app.

1 What this is & why it matters

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.

2 How to implement it

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" },
});
3 How the code works, piece by piece

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();
}

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

4 The green result in your dashboard

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.

app.cross-deck.com · customer timeline
pro · active

user_847 — Stripe (web) + App Store (iOS) collapsed into one identity. The web purchase grants Pro on the phone, verified.

You learned the rule that makes entitlements follow a person, not a device: one identify() call with the same ID everywhere, then isEntitled() to gate.