While we are currently implementing RevenueCat for our (currently free) app, we found following articles.
Due to platform limitations, purchases will be transferred as soon as you call `configure`
https://www.revenuecat.com/docs/restoring-purchases#google-play-on-android
the subscription will be considered inactive since the app stores weren't able to charge the customer for a renewal.
https://community.revenuecat.com/general-questions-7/how-does-revenuecat-manage-ios-subscription-events-such-as-entered-grace-period-entered-new-billing-retry-renewal-from-billing-retry-and-so-on-484
when the renewal comes in, the SDK posts the receipt to our backend, but at this point, you’re an anonymous user. So the backend is transferring the receipt
https://community.revenuecat.com/sdks-51/app-ids-transferring-subscriptions-to-anonymous-users-1171
From these, we imagined following scenario. (Later I found out that similar case has happened and posted in Android app, but had no replies at all: https://community.revenuecat.com/sdks-51/subscription-not-transferred-when-using-another-device-with-same-account-1559)
- User 1 installs and starts an app on one’s iPhone with Apple ID
A1
. - RevenueCat SDK
configure
creates anonymous app user IDrc1
. - User 1 signed up. User 1’s account has unique user ID,
c1
. - RevenueCat SDK
login
s with custom app user IDc1
.c1
andrc1
is now merged. - User 1 subscribes monthly plan with
A1
.c1
now has active product = entitlement = subscription and receipt fromA1
. - A month later,
A1
is under a billing issue, failing to make renewal. c1
Enters New Billing Retry, and receipt fromA1
is now inactive.- User 1 installs and starts the app on one’s iPad. Of course this iPad is paired with Apple ID
A1
. - RevenueCat SDK
configure
creates anonymous app user IDrc2
. - At this point, User 1’s billing issue on
A1
has resolved. - User 1 signs in with
c1
.
(“Transfer if there are no active subscription” is selected.)
I believe following will happen in iPad:
- RevenueCat SDK
configure
will create anonymous app user IDrc2
. - RevenueCat SDK gets updated receipt from
A1
. It has Renewal From Billing Retry event. - RevenueCat SDK will report new receipt under
app_user_id
rc2
. - Since its last state was not active, The receipt from
A1
will be transferred fromc1
torc2
. - When User 1
login
s withc1
, receipt inrc2
cannot be re-transferred (blocked by “transfer if...”) nor merged (c1
has one alias already). Subscription is gone. - The only way to resolve this issue is to manually transfer entitlement from
rc2
toc1
(but how?)
Am I correct?
If I am correct, I don’t think this is some extreme edge case. Billing Retry period is 60 days, anything can happen. Actually you don’t even need additional iPad to reproduce this: just reinstalling or resetting the app from iPhone and not-signing-in until renewal will be enough.
What can I do to prevent this?