Skip to main content
Solved

Accidentally sharnig subscription between iOS and Android

  • May 12, 2026
  • 3 replies
  • 30 views

Forum|alt.badge.img+3

I have bit of a pickle. You have to have premium to be able to log in to my app, and when you log in I also log the user in with the user id in revenueCat, so I can trace them better. All good there..

 

BUT. I have users that buy premium on Android, and then they use their iPhone - also buying premium. And then they login on the iPhone with the same email as they use on their Android.

It seems to me that the two subscriptions kind of gets merged. What is happening here? Am I setting myself up for pain? 

I’m thinking of adding a prefix to the user id. SO if they buy premium on iPhone and then log in, I actually log them in with ios_theirUserId and android_theitUserId.

But maybe I should just change it so they can log in without Premium and then share the premium status between platforms. I’m not sure what’s happening now. 

Best answer by guilherme

Hey ​@Jymd !

So, every user of your app is a customer tracked by an App User ID

  • either anonymous (auto-generated by the SDK on first launch)
  • or identified (whatever you pass to Purchases.logIn()).

There's always one as you can't have a user without one in RevenueCat:

Customers are referenced by an identifier called an App User ID, which is used as a source of truth for the subscription status of the customer across different devices and platforms.

more context here

So when your Android user buys anonymously and you then call logIn("user_123"), the anonymous customer is aliased into user_123. Same on iOS. Both subs end up under the same user_123 customer, which is the intended design:

A user logged into the same App User ID on different platforms will be considered the same user and can access the entitlements they have purchased on any platform.

more context here

This is how cross-platform entitlement is meant to work. Worth flagging that the link isn't the email itself, it's whatever user_id you pass to logIn() (which we recommend being a UUID or identifier other than email):

Don't set emails as App User IDs

For the above reasons about guessability, and GDPR compliance, we don't recommend using email addresses as App User IDs.

more context here

Which way to go depends on what you want for your users.

For sharing across platforms (the common case, where users pay once and have premium on every device they log into), identify the user in RevenueCat at sign-up / login before gating on premium. Then purchases happen under the identified ID from the start, no anonymous-then-alias behavior, and the cross-platform behavior just works out of the box. Also, your iOS users who already paid on Android wouldn't see the paywall a second time.

For isolated platforms (less common, but definitely valid), the platform-prefix idea would work. The same customer in your system would map to two separate RevenueCat customers (ios_user_123 and android_user_123), and they'd pay separately on each platform. Just be aware most users who own multiple devices could be unhappy paying twice, and it tends to generate refund requests, but as long as you frame it like so it should work indeed.

But most subscription apps go with the first since it matches what users expect across devices.

3 replies

guilherme
RevenueCat Staff
Forum|alt.badge.img+6
  • RevenueCat Staff
  • Answer
  • May 14, 2026

Hey ​@Jymd !

So, every user of your app is a customer tracked by an App User ID

  • either anonymous (auto-generated by the SDK on first launch)
  • or identified (whatever you pass to Purchases.logIn()).

There's always one as you can't have a user without one in RevenueCat:

Customers are referenced by an identifier called an App User ID, which is used as a source of truth for the subscription status of the customer across different devices and platforms.

more context here

So when your Android user buys anonymously and you then call logIn("user_123"), the anonymous customer is aliased into user_123. Same on iOS. Both subs end up under the same user_123 customer, which is the intended design:

A user logged into the same App User ID on different platforms will be considered the same user and can access the entitlements they have purchased on any platform.

more context here

This is how cross-platform entitlement is meant to work. Worth flagging that the link isn't the email itself, it's whatever user_id you pass to logIn() (which we recommend being a UUID or identifier other than email):

Don't set emails as App User IDs

For the above reasons about guessability, and GDPR compliance, we don't recommend using email addresses as App User IDs.

more context here

Which way to go depends on what you want for your users.

For sharing across platforms (the common case, where users pay once and have premium on every device they log into), identify the user in RevenueCat at sign-up / login before gating on premium. Then purchases happen under the identified ID from the start, no anonymous-then-alias behavior, and the cross-platform behavior just works out of the box. Also, your iOS users who already paid on Android wouldn't see the paywall a second time.

For isolated platforms (less common, but definitely valid), the platform-prefix idea would work. The same customer in your system would map to two separate RevenueCat customers (ios_user_123 and android_user_123), and they'd pay separately on each platform. Just be aware most users who own multiple devices could be unhappy paying twice, and it tends to generate refund requests, but as long as you frame it like so it should work indeed.

But most subscription apps go with the first since it matches what users expect across devices.


Forum|alt.badge.img+3
  • Author
  • Member
  • May 15, 2026

Ok, thank you. That was very helpful. 
In my app you can only log in after getting premium. But I will change that. Thank you for a great reply… 


Forum|alt.badge.img+3
  • Author
  • Member
  • May 15, 2026

Another question on this though, just for best practices. If the user logs out in the app (you can use it without being logged in) should I also log them out from revenucat? Or should they stay logged in?

I’m using firebase so I use the firebase user id as the reference when logging them into RC.