# Guideline 3.1.1 - In-App Purchase: Missing Restore Purchases Button

**Guideline:** 3.1.1 · **Store:** Apple App Store · **Severity:** low · **Fix difficulty:** easy · **Typical turnaround:** 1-2 hours

Canonical URL: https://appstorereject.com/rejections/apple/3/guideline-311-in-app-purchase-missing-restore-purchases-button

## Description

Apple is rejecting your app because it offers In-App Purchases but does not provide a mechanism for users to restore previously purchased content. This is a hard requirement for any app using non-consumable IAP or auto-renewable subscriptions. The restore function is critical because users switch devices, reinstall apps, and use Family Sharing. Without a visible restore button, users might repurchase content they already own. Apple considers this a consumer protection issue and enforces it consistently. This is almost always a quick fix -- you just need a visible 'Restore Purchases' button or link, typically on the paywall or settings screen, wired to StoreKit's restore functionality. The rejection is mechanical and rarely requires an appeal.

## Common variations

- App does not include a mechanism to restore previously purchased IAP products
- Restore purchases button missing from subscription paywall
- No way for users to restore non-consumable purchases on a new device
- Restore functionality not accessible or discoverable

## Example rejection email

```
Guideline 3.1.1 - Business - Payments - In-App Purchase

We noticed that your app uses in-app purchase products but does not include a mechanism to restore previously purchased in-app purchase products.

Next Steps:
Please add a restore mechanism that allows users to restore previously purchased in-app purchase products.
```

## Resolution steps

## Quick Assessment
- **Risk level:** Low
- **Resolution path:** Fix & Resubmit
- **Typical turnaround:** 1-2 hours

## The Fix

1. **Add a Restore Purchases button** -- Place a clearly labeled 'Restore Purchases' button on your paywall screen and/or in Settings. It should be visible without scrolling.

2. **Wire it to StoreKit** -- Call `AppStore.sync()` (StoreKit 2) or `SKPaymentQueue.default().restoreCompletedTransactions()` (StoreKit 1) when the button is tapped.

3. **Show feedback** -- Display a loading indicator during the restore, then confirm success ('Purchases restored') or inform the user if no purchases were found.

4. **Handle edge cases** -- Account for scenarios where the user has no prior purchases, where the restore fails due to network issues, or where the user is signed into a different Apple ID.

5. **Test thoroughly** -- Use sandbox accounts to verify the restore flow works for all product types (non-consumables, auto-renewable subscriptions).

## Prevention
- Add restore functionality as part of your initial IAP implementation, not as an afterthought
- Include it in your QA checklist for every release
- Place it prominently on the paywall -- do not hide it in a submenu

## Before / after examples

**Before:** Paywall screen shows subscription options and a 'Subscribe' button but no restore option anywhere on the screen
**After:** Paywall screen includes a 'Restore Purchases' link below the subscribe button, which triggers StoreKit restore and shows a confirmation alert
**Why it works:** A visible restore mechanism is mandatory for any app offering non-consumable IAP or subscriptions.

## Common questions

**How long does this typically take to fix?**

Typical turnaround is 1-2 hours (difficulty: easy). After resubmission, most re-reviews complete within 24-48 hours.

---
*Machine-readable source: https://api.appstorereject.com/api/rejections/detail?slug=guideline-311-in-app-purchase-missing-restore-purchases-button*