How do I implement Restore Purchases with RevenueCat in Flutter?
Call Purchases.restorePurchases() when the user taps a "Restore" button, then re-check entitlements. If the restored entitlement is active, unlock the paywall immediately.
Why it matters
App Store Review Guideline 3.1.1 requires a Restore Purchases mechanism for any subscription app. Missing it is one of the most common first-round rejections.
How to do it
-
Add a Restore button on your paywall
TextButton(onPressed: _restore, child: Text('Restore Purchases'))— visible, not hidden in a menu. -
Call RevenueCat
final info = await Purchases.restorePurchases();— returns a CustomerInfo with the restored entitlements. -
Check the entitlement
if (info.entitlements.all['pro']?.isActive == true) { unlock(); } -
Handle the "nothing to restore" case
If no active entitlement is returned, show a message: "No previous purchase found." Not an error — expected behaviour for users who never purchased.
-
Show a toast on success
Silent success confuses users. Confirm the restore visibly.
Common mistakes
- Not showing a Restore button at all (auto-rejection).
- Making Restore require the user to type their receipt.
- Silently failing when there is nothing to restore.
Frequently asked
- Do I need Restore Purchases for a one-time purchase (non-consumable)?
- Yes. Same requirement.
- What if the user is on a different Apple ID?
- The restore returns nothing — that is expected. The user has to sign in with the Apple ID that made the purchase.