Skip to main content
Question

Why did my user need to "restore" their subscription?

  • September 15, 2025
  • 4 replies
  • 63 views

Forum|alt.badge.img+4

My wife opened her installation of the app we are developing yesterday and was directed to the paywall page, even though she has an active subscription. 

I looked at it, very puzzled, and then decided to try the “restore” link in the paywall screen.  After a couple of seconds a dialog box came up indicating the restore was successful and after dismissing it the app functioned as expected. 

My understanding was that the restore link is only necessary when installing the app on a new phone or other similar situation.  This occurred under “normal” conditions. It was very confusing to her and I am worried about users encountering this who are not married to one of the developers. 

Can someone explain to me why this might occur and if there are any steps I can take to avoid it from happening under “normal” circumstances? 

Thank you. 

This post has been closed for comments

4 replies

alejandra-wetsch
RevenueCat Staff
Forum|alt.badge.img+6

Hey ​@philip-johnson-4e5f09

Thank you for reaching out!

There could be a few reasons why this could have happened:​

  • The App User ID changed between sessions. If that’s the case, a restore must happen so that the actual App User ID regains access to the entitlements.
  • Depending on how you’re displaying the Paywall, if the Customer Info is cached with no active entitlements before displaying your Paywall, then you will need to restore to regain access.
  • The Sandbox environment can be flaky, meaning you may need to restore purchases more often than in production.

To better understand what could have happened, could you please share the following: 

  • Code Snippets showing:
    • How you’re checking if a user has an entitlement
    • How you’re displaying your Paywall
  • App User ID that had this issue.
  • Are you calling the logout method when users log out of your app?
  • Did she test with different User IDs or switch their Apple Sandbox Account in between sessions?
  • If you can reproduce and share RevenueCat logs, that would also be much appreciated.

Thank you!


Forum|alt.badge.img+4

Hi ​@alejandra-wetsch,

Thanks for the quick reply!  Some followup:

  • She is a “normal user” (not in sandbox, did not switch accounts, userID did not change)
  • I don’t think the customer info was cached without active entitlements. Although  have caching enabled on the two methods (see below), so I wonder if this could be caused by one cache expiring while the other was not? If so, maybe I should delete the caching?
  • I don’t call the logout method (which I thought was the right way to do it)
  • App User ID: MFkNkBpWKYX3oBlg88REsm8aC3H2
  • I don’t have any logs available to share. This only happened one time, on an actual device (so no logging)

 

Here is the code snippet. I use Riverpod:

https://gist.github.com/philipmjohnson/7eaf62ba59beb89d2e536a71571123e0

Any other ideas?

Thank you!


alejandra-wetsch
RevenueCat Staff
Forum|alt.badge.img+6

Hey ​@philip-johnson-4e5f09

Thank you for providing additional details. Your code looks good! I’m reviewing this internally and will let you know when I have more information! 


alejandra-wetsch
RevenueCat Staff
Forum|alt.badge.img+6

Hey ​@philip-johnson-4e5f09

I appreciate your patience!

After checking the Customer Profile of the App User ID you shared, I can see the following: 

  • The user started a 6-month trial.
  • The user was then granted an offer code that entitled another 6-month trial.
    • This offer was applied as soon as the previous trial expired.
  • The user is currently on a trial period, and the subscription will renew in 5 months.

To answer your initial question, and after checking this internally with the team, we concluded that the reason she needed to restore purchases after returning to the app was that the subscription information on her device was cached from the previous expired trial, while having the offer code activated. As the SDK wasn’t aware of the new trail yet, it considered it as if no entitlement had been granted.

This appears to be an isolated case; however, to prevent this from happening in the future, I recommend calling the invalidateCustomerInfoCache() method after the SDK is configured to ensure that the current Customer Info and entitlements available are the most recent.

I hope this helps!