What the rejection says
Guideline 3.1.1 – Business – Payments – In-App Purchase
We noticed that your app includes or accesses paid digital content, services, or functionality by means other than in-app purchase.
What Apple actually means
The core rule: “If you want to unlock features or functionality within your app (by way of example: subscriptions, in-game currencies, game levels, access to premium content, or unlocking a full version), you must use in-app purchase. Apps may not use their own mechanisms to unlock content or functionality, such as license keys, augmented reality markers, QR codes, cryptocurrencies and cryptocurrency wallets, etc.”
Two exceptions matter:
- Physical goods and real-world services (3.1.3(e)): “If your app enables people to purchase physical goods or services that will be consumed outside of the app, you must use purchase methods other than in-app purchase.” Food delivery, rides, tickets, physical products: use Stripe or Apple Pay.
- The US storefront: Apple’s rules against in-app buttons, external links or calls to action that point to other purchase methods explicitly don’t apply in the United States storefront. Outside the US, apps generally can’t include those unless they hold a specific StoreKit External Purchase Link entitlement for that region.
Why AI-built apps hit it so often
- Web SaaS templates. Lovable, Bolt and Replit apps are built as web apps with Stripe Checkout for “Upgrade to Pro”. Wrapped into iOS unchanged, that is exactly what 3.1.1 prohibits.
- Credit systems for AI features bought on the web and spent in the app, with no IAP option.
- Paywalls that open an in-app browser to a Stripe page. Outside the US, that is a call to action to another purchase method.
- IAP added but not reviewable. Products exist in App Store Connect but aren’t visible or don’t load in the build, which becomes a 2.1(b) rejection.
How to fix it
- Decide per product: is it digital (IAP) or physical/real-world (Stripe or Apple Pay)?
- Create the IAP products in App Store Connect: subscriptions with a group, or consumables for credits. Complete the metadata and the review screenshot for each.
- Implement StoreKit directly, or via RevenueCat for Expo and Flutter apps, and grant the same entitlement on your backend that a Stripe purchase does.
- Validate purchases server-side so the entitlement can’t be faked from the client.
- Show subscription terms before purchase: price, period, what’s included, and links to terms and privacy (3.1.2).
- Include Restore Purchases.
- For US-only link-outs, make sure the link or button only appears in the US storefront and doesn’t mislead about price.
- Test in the sandbox with the TestFlight build and tell the reviewer where the paywall is.
What to write back to App Review
Hello App Review,
Paid features are now unlocked exclusively through in-app purchase
([product IDs]). The paywall can be reached at [path]. Restore Purchases
is available at Settings > Subscription.
Physical orders [if any] continue to use Apple Pay / card entry in
accordance with 3.1.3(e).
How we handle a 3.1.1
We map every paid feature to IAP or an allowed exception, implement StoreKit or RevenueCat, connect it to your existing Stripe entitlements so web and iOS users get the same access, and set up the products and review metadata in App Store Connect.
Questions
Can I keep Stripe for my web app and use IAP in the iOS app?
What changed in the US?
My app sells physical products or bookings. Do I need IAP?
Can users unlock features with a license key or code?
Last reviewed 2026-09-23. Guideline quotes are from Apple’s App Review Guidelines; Apple can change them at any time.

