Restore purchases

The 'I already paid' button: asks the store for this account's past purchases and re-unlocks them on a fresh install or a new phone.

I already paid, give it backget my subscription on my new phonerestore buttonrestore my purchasere-download what I boughtwhy is it asking me to pay againtransfer subscription to new devicerestore purchace

See it

Live demo coming soon

What it is

Entitlements belong to the store account, not to your app's install. Delete the app, get a new phone, or wipe the device and every local 'isPro = true' flag is gone while the purchase still exists on Apple's or Google's side. Restore purchases is the flow that asks the store for this account's purchase history and re-grants access without charging again.

The requirement is not identical on the two platforms. Apple is the explicit one: guideline 3.1.1 wants a user-initiated restore mechanism for non-consumables and auto-renewable subscriptions, so in practice a plainly labelled button, and a missing one is a routine rejection in the billing category. Google Play leans the other way: the billing library expects your app to query purchases at launch and after sign-in and reinstate entitlements quietly, so on Android a correct app usually restores before the user thinks to ask. Ship the button on both anyway. It is one row, it satisfies Apple, and on Android it gives a confused user something to press instead of emailing you. Put it on the paywall and in settings, label it plainly, and show a clear result either way: 'Purchases restored' or 'No purchases found for this account'.

Two traps. First, consumables (coin packs, one-off credits) are not restorable by design, so back those with your own server if users expect them to survive a reinstall. Second, restore only works within one store account, so a subscription bought on iPhone will not appear on Android. If you promise cross-platform access, you need real accounts and server-side entitlements, with restore linking the purchase to the signed-in user.

Ask AI for it

Implement a restore purchases flow with two distinct paths. Path one is passive reconciliation on every launch and after sign-in: on iOS iterate Transaction.currentEntitlements, on Android call queryPurchasesAsync, and quietly grant whatever is already there without prompting for credentials. Path two is the explicit user action: a plainly labelled 'Restore Purchases' control on both the paywall and the settings screen, which on iOS calls AppStore.sync() first (it is user-initiated, so the sign-in prompt is expected) and only then iterates and verifies Transaction.currentEntitlements, and on Android re-runs the purchase query. Validate each result server-side and grant entitlements idempotently. Show a spinner while it runs, then an explicit outcome: success with what was restored, or a friendly empty state explaining that no purchases were found for this store account and suggesting they check they are signed in with the right one. Handle network failure separately from 'nothing to restore', and make repeated taps safe.

You might have meant

in app purchase store billingsubscription paywallreceipt validationapp review rejection