RejectProofRun the free check

In-app purchases without a "Restore Purchases" path

Check PB-14 · App Store Review Guideline 3.1.1 · Probable rejection · verified 2026-09-16

Why App Review rejects under Guideline 3.1.1

The two mechanical 3.1.1 rejections are a missing Restore Purchases path (required for any non-consumable or subscription) and links to Stripe, PayPal or your website for buying digital content. Both are visible in the binary: the restore call and the words "Restore Purchases" for the first, checkout URLs for the second. Paywall wording (price, period, terms) is the reviewer's call and belongs in your screenshots and listing.

How to fix it

Add a "Restore Purchases" button to your settings or paywall screen — Apple requires it in every app with IAP. RevenueCat: add a button that calls Purchases.shared.restorePurchases(). Swift/StoreKit: AppStore.sync() or SKPaymentQueue.default().restoreCompletedTransactions().

How RejectProof detects it

The scan reads your .ipa in the browser (or locally with npx rejectproof): Info.plist, entitlements, the privacy manifest, embedded frameworks and the executable itself. Check PB-14 reports the exact evidence it found — the key, the symbol, the file or the URL — so you can confirm it in your own project before changing anything. Nothing is uploaded; only a small redacted summary is sent to build the report, and you see it first.

Related Guideline 3.1.1 checks

← All rejection reasons