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

  1. Add a Restore button on your paywall

    TextButton(onPressed: _restore, child: Text('Restore Purchases')) — visible, not hidden in a menu.

  2. Call RevenueCat

    final info = await Purchases.restorePurchases(); — returns a CustomerInfo with the restored entitlements.

  3. Check the entitlement

    if (info.entitlements.all['pro']?.isActive == true) { unlock(); }

  4. 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.

  5. 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.

Sources