What the rejection typically looks like
Guideline 3.1.2 - Business - Payments - Subscriptions
The submission did not include all the required information for apps offering auto-renewable subscriptions.
The following information needs to be included within the app:
- A functional link to the Terms of Use (EULA)
- A functional link to the privacy policy
The following information needs to be included in the App Store metadata:
- A functional link to the Terms of Use (EULA)
- A functional link to the privacy policy
Next Steps
Update your app and metadata to include the missing information. If you use the standard Apple Terms of Use (EULA), include a link to it in your App Description.
Paraphrased example – the exact wording in your message may differ.
What Guideline 3.1.2 actually requires
Guideline 3.1.2 covers every app selling auto-renewable subscriptions. In the current guidelines (last updated June 8, 2026) it has three parts:
- 3.1.2(a) Permissible uses: you "must provide ongoing value to the customer", and the subscription period "must last at least seven days and be available across all of the user's devices." Apps that trick users into subscribing "under false pretenses" or use bait-and-switch practices are removed, and the developer may be removed from the Apple Developer Program.
- 3.1.2(b) Upgrades and downgrades: switching plans must be seamless, and users should not be able to subscribe to several variations of the same thing by accident.
- 3.1.2(c) Subscription information: "Before asking a customer to subscribe, you should clearly describe what the user will get for the price." It points to Schedule 2 of the Apple Developer Program License Agreement.
Schedule 2, section 3.8(b) of that agreement lists what you must disclose "clearly and conspicuously": the subscription title, its length, its price (and price per unit if appropriate), plus links to your Privacy Policy and Terms of Use that are accessible inside the app.
Apple's auto-renewable subscriptions page spells out what reviewers check on the sign-up screen: the subscription name and duration, the content or services included, the full renewal price shown clearly and localized, and a way for current subscribers to sign in or restore purchases. It also states that your app and your App Store metadata must link to your Terms of Use and Privacy Policy, and that "the amount that will be billed must be the most prominent pricing element in the layout."
Common reasons apps get rejected under 3.1.2
| Trigger | What the reviewer sees |
|---|---|
| Missing Terms of Use link in metadata | You use Apple's standard EULA, but the App Description doesn't link to it. Apple only shows a license agreement link on your product page when you provide a custom EULA. |
| Missing or broken links in the app | No Terms or Privacy links on the paywall, or links that open a 404, a login wall or an empty WebView. |
| Trial louder than the price | "Try for free" in huge type, the renewal price in small grey text. Rejection messages reported by developers say the subscription promotes the free trial "more clearly and conspicuously than the billed amount" and cite 3.1.2(c). |
| Per-unit price as the headline | An annual plan advertised by its weekly equivalent while the yearly amount is tiny. |
| Toggle paywalls | A free-trial switch that quietly swaps the plan behind it (for example, annual without trial versus weekly with trial). Developers reported 3.1.2 rejections for this pattern from mid-January 2026, with App Review calling the design confusing. |
| Hard-coded prices | A price baked into the UI that doesn't match the reviewer's storefront or currency. |
| Unclear content | "Unlock Premium" with no list of what Premium includes. |
| No restore option | Existing subscribers have no way to sign in or restore on the purchase screen. |
| No ongoing value | A subscription for a one-time unlock, such as a single filter pack or removing a watermark. |
Rejected or stuck? Talk to an App Specialist – for free.
Book a free consultation call: we look at your rejection or setup, explain the fastest way forward and tell you honestly whether you need us. Prefer to hand it off? Book our AI-powered + human-powered service and we take care of it.
The compliant paywall, element by element
Audit every screen that starts a purchase: the onboarding paywall, upsell sheets, settings and win-back screens.
| Element | What review expects | Typical fix |
|---|---|---|
| Plan title | A clear name for each plan (it may be the same as the product's display name in App Store Connect) | "Pro Annual", not just "Best value" |
| Length | Billing period visible for each plan | "Billed every year" next to the price |
| Billed amount | The most prominent price on the screen, localized for the user's storefront | Render StoreKit's product.displayPrice, never a hard-coded string |
| Per-unit price | Allowed, but subordinate in position and size | "(equals [weekly price] per week)" in smaller text under the yearly amount |
| Free trial / intro offer | How long the trial lasts and the price billed once it ends, in the purchase flow | "7 days free, then [price] per year. Cancel anytime in Settings." |
| What's included | Concrete benefits | "Unlimited exports, 100 GB cloud storage, all templates" |
| Legal links | Functional Terms of Use (EULA) and Privacy Policy links | Tappable links in the paywall footer |
| Restore | A way for existing subscribers to restore or sign in | "Restore Purchases" button in the footer |
| Button label | Must not hide that a paid subscription starts | Trial-led CTAs ("Try for free") have drawn 3.1.2(c) rejections when they outweigh the price; keep the billed amount more prominent. "Continue" alone hides the commitment. |
Also check what should not be there. Late-appearing or camouflaged close buttons, pre-selected upsells and fake countdowns aren't listed one by one in the guidelines, but App Review can treat them as bait-and-switch under 3.1.2(a) or as a breach of the Developer Code of Conduct (5.6), which says apps should never "trick them into making unwanted purchases".
How to fix a 3.1.2 rejection step by step
- Map the message to the cause. "Did not include all the required information" means links or disclosures; "promotes the free trial ... more clearly and conspicuously than the billed amount" means pricing hierarchy. If App Review attached a screenshot, it shows which screen the reviewer used.
- Fix the Terms of Use in metadata. Using Apple's standard EULA? Add a line such as
Terms of Use: https://www.apple.com/legal/internet-services/itunes/dev/stdeula/(or your own terms URL) to the App Description in every localization. Using your own terms? Go to App Information > General Information > License Agreement > Edit, choose "Apply a custom EULA to all chosen countries or regions", paste it as plain text, select the regions and save (Apple's steps). - Fix the Privacy Policy URL. In App Privacy > Privacy Policy > Edit, enter a public URL that loads without login; it can be localized for every language your app supports. Policy content is covered in our 5.1.1 Data Collection guide.
- Add both links inside the app – on the paywall itself, not only in Settings. With SwiftUI's
SubscriptionStoreView, set explicit destinations viasubscriptionStorePolicyDestination(url:for:)for.termsOfServiceand.privacyPolicy; developers have reported the default policy buttons showing a "Terms of Service Unavailable" message when nothing is configured. - Rebuild the price hierarchy. Make the billed amount (for an annual plan, the yearly total) the biggest price on screen, with weekly equivalents and "save" badges underneath in smaller type. Replace trial toggles with separate, clearly labeled plans.
- Disclose trials and intro offers. Set trials up as introductory offers in App Store Connect (Subscriptions > [group] > [subscription] > Subscription Prices > View all Subscription pricing > Set up Introductory Offer), state the duration and post-trial price, and show the offer only to eligible users (
await product.subscription?.isEligibleForIntroOfferin StoreKit 2). Each person can redeem one introductory offer per subscription group. - Add Restore Purchases. Call
AppStore.sync()only from an explicit button tap – it shows an App Store sign-in prompt – and read entitlements fromTransaction.currentEntitlementson launch. - Offer subscription management with
AppStore.showManageSubscriptions(in:), so users can switch plans inside one subscription group (3.1.2(b)). - Check App Store Connect products. Each subscription needs a localized display name and description plus a review screenshot, and the subscription group needs a localized display name. Your first auto-renewable subscription must be submitted with a new app version, together with its subscription group.
- Test in sandbox or with a StoreKit configuration file, take fresh screenshots, then resubmit and reply to App Review.
Ongoing value, minimum period and other 3.1.2(a) traps
Some 3.1.2 rejections question whether a subscription is the right product type at all.
- One-time value: if users pay repeatedly for something that never changes – a filter pack, ad removal – Apple may ask for a non-consumable instead. Apple's examples of appropriate subscriptions include new game levels, episodic content, multiplayer support, consistent substantive updates, large or continually updated media libraries, software as a service and cloud support.
- Minimum period: auto-renewable durations start at one week (one week; one, two, three or six months; one year). Shorter access needs a different product type.
- All devices: a subscription bought on iPhone must also unlock on iPad and the other devices where the app is available. Read entitlements from StoreKit, not a device-local flag.
- No extra tasks: no social posts, contact uploads or check-in streaks before users get what they paid for.
- Switching to subscriptions: users who already paid for the full app keep it. Check
AppTransaction(for exampleoriginalAppVersion) for people who bought a paid app, or the non-consumable inTransaction.currentEntitlementsfor an in-app unlock, before showing them the new paywall. - Plan structure: put tiers of one service in a single subscription group so users upgrade or downgrade instead of holding two plans.
Since May 2026 Apple also offers monthly subscriptions with a 12-month commitment, launched everywhere except the United States and Singapore. Apple shows customers their completed and remaining payments and sends renewal reminders, but your paywall should still state the monthly amount and the 12-month commitment clearly. For digital goods that aren't subscriptions, see our 3.1.1 In-App Purchase guide.
Flutter, React Native and paywall SDKs
Third-party tooling does not make a paywall compliant on its own.
- Paywall builders (RevenueCat, Adapty, Superwall and similar): footer links and restore buttons are usually configurable per template. Confirm Terms, Privacy and Restore are enabled in every A/B variant and locale the reviewer could see.
- Flutter (
in_app_purchase): wire a visible button toInAppPurchase.instance.restorePurchases(), handle the restored items frompurchaseStream, and show the localizedProductDetails.price. - React Native: use the store-provided price string and expose restore – for example
Purchases.restorePurchases()with RevenueCat orgetAvailablePurchases()withreact-native-iap. - Remote paywalls: freeze the reviewed variant during review – an experiment that hides the price can trigger the same rejection on your next update.
How to respond to App Review
Reply to the rejection in App Store Connect (the App Review page of your app) once the fixes are in place.
- Metadata-only issue (missing link in the description): in most cases you can edit the description and resubmit the same build. Say exactly which localizations you updated.
- Binary issue (paywall links, pricing layout, restore): upload a new build, attach it to the version and resubmit. Name the screen where links and restore appear and add a screenshot.
- You believe you were already compliant: reply with screenshots showing each required element and where to find them. Developers have occasionally seen this rejection repeat although everything was in place; if the reviewer repeats the same finding, appeal to the App Review Board and stay factual.
If your paywall sits behind sign-up or long onboarding, add the path and a demo account to the review notes – see our 2.1 Information Needed guide.
How to prevent 3.1.2 rejections next time
- Treat the paywall as a release artifact: a UI test opens every paywall variant and captures screenshots per locale, so someone can check price hierarchy, trial wording, links and restore before each submission.
- Check links in CI: request your Terms and Privacy URLs on every build and fail on non-200 responses or login redirects.
- Lint metadata: pull App Store descriptions for all localizations (for example via the App Store Connect API) and fail if the Terms of Use URL is missing.
- Change copy deliberately: run new paywall experiments through this checklist, not only through growth goals.
AI-assisted checks quickly compare screenshots and metadata against the disclosure list; a human still judges whether a design could mislead. appsubmitter.io combines both in its CI/CD and submission service. For a second opinion on your paywall before you resubmit, book a free consultation call.
Template: how to reply to App Review
Adapt this template to your situation. Keep it factual, short and specific – and only claim what you have actually changed.
Checklist before you resubmit
- Every paywall shows plan title, billing period and the billed amount as the most prominent price.
- Weekly or monthly equivalents and savings badges are smaller and placed below the billed amount.
- Free trials and introductory offers state their length and the price charged afterwards.
- The paywall lists concretely what the subscription includes.
- Terms of Use (EULA) and Privacy Policy links on the paywall open working pages without login.
- The App Description links to the Terms of Use in every localization, or a custom EULA is set in App Information.
- The Privacy Policy URL in App Privacy loads publicly in every localization.
- Restore Purchases calls AppStore.sync() (or your SDK equivalent) and unlocks active subscriptions.
- No toggle that adds or removes a trial by switching plans, and no hidden or delayed close button.
- Intro offers appear only for eligible users; a subscription bought on iPhone also unlocks on iPad.
- Each subscription has a localized display name, description and review screenshot, and its group has a localized display name in App Store Connect.
Frequently asked questions
Can I use Apple's standard EULA instead of my own Terms of Use?
https://www.apple.com/legal/internet-services/itunes/dev/stdeula/ (or your own terms) to the App Description and to the paywall.Where do I put the Terms of Use link in App Store Connect?
What is the minimum subscription length on the App Store?
Can I show the weekly price of an annual subscription?
Is a "Start free trial" button still allowed?
Are toggle paywalls still allowed on the App Store?
Do I need a new build to fix a 3.1.2 rejection?
Why was I rejected again although the links are there?
Official source: App Store Review Guidelines – 3.1.2 Subscriptions. Store policies change regularly – always check the current version. This guide is independent advice and not affiliated with Apple or Google.