Cross-platform subscriptions: how to share entitlements between iOS and Android (without lying to users)
RevenueCat breaks down why ‘one user, two billing systems’ is so messy, and what a sane entitlement sync architecture looks like.
Original article (source): RevenueCat - “Cross-platform subscription state: sharing entitlements between Android and iOS” (Feb 24, 2026)
The actual problem (it’s not a UI edge case)
Users expect: “I paid once, it works everywhere.”
Platforms deliver: two isolated billing universes.
- Google Play Billing can only see Google purchases.
- StoreKit can only see Apple purchases.
- Neither platform has built-in interoperability.
So if you don’t build a bridge, the Android app will happily show a paywall to someone who subscribed on iOS (and vice versa).
Why it’s genuinely hard
RevenueCat’s useful framing: the systems are different at a “philosophy” level, not just API shapes.
A few examples:
- Proof of purchase: Google gives you an opaque purchase token and you ask Google’s API for state. Apple gives you signed transactions (JWS) you verify.
- Real-time subscription events: Google uses Pub/Sub (RTDN). Apple pushes HTTPS notifications (ASN v2). Different plumbing, different payloads.
- Product modelling: Google’s base plans + offers don’t map cleanly onto Apple’s flatter “one product ID per duration” structure.
Translation: if you want one cross-platform “Premium” entitlement, you need a mapping layer and a state machine you can trust.
A pragmatic architecture (if you’re doing it yourself)
The post walks through the minimum viable building blocks:
- Unified user identity (server-side) that both clients can associate purchases with.
- Two verification paths (one per platform) with their own auth and parsing.
- Unified entitlement storage that answers one question consistently: is this user entitled right now?
My editorial take
This is one of those problems that leaks straight into marketing:
- if your store copy implies “works on all your devices”, you’re making a promise your entitlement system must keep
- if support tickets spike around “charged twice”, your conversion rate and reviews take the hit
Tiny win: pick one entitlement (Premium), list every product ID/base plan that should map to it across iOS and Android, then write the exact rule your backend will use when the user logs in on a new device.
Read the original: https://www.revenuecat.com/blog/engineering/cross-platform-subscription/
Want help with ASO?
If you want this implemented for your app, check out our services - or run your workflow in APPlyzer.