Skip to content
Back To School Sale from $619, until 31st October 2026 Book now
appsubmitter.io
Apple App Store Guideline 3.1.2

Guideline 3.1.2 Subscriptions Rejection: How to Fix Your Paywall and Resubmit

Guideline 3.1.2 sets the rules for auto-renewable subscriptions: ongoing value, a period of at least seven days and clear disclosure before anyone subscribes. The most common trigger is missing information – no working Terms of Use (EULA) or Privacy Policy link in the app or in the App Store metadata, or a paywall where the free trial outshines the amount actually billed. The fix: make the billed amount the most prominent price, add functional links in both places and offer Restore Purchases.

By the appsubmitter.io App Specialist Team, updated , 12 min read

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

TriggerWhat the reviewer sees
Missing Terms of Use link in metadataYou 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 appNo 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 headlineAn annual plan advertised by its weekly equivalent while the yearly amount is tiny.
Toggle paywallsA 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 pricesA 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 optionExisting subscribers have no way to sign in or restore on the purchase screen.
No ongoing valueA 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.

ElementWhat review expectsTypical fix
Plan titleA 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"
LengthBilling period visible for each plan"Billed every year" next to the price
Billed amountThe most prominent price on the screen, localized for the user's storefrontRender StoreKit's product.displayPrice, never a hard-coded string
Per-unit priceAllowed, but subordinate in position and size"(equals [weekly price] per week)" in smaller text under the yearly amount
Free trial / intro offerHow 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 includedConcrete benefits"Unlimited exports, 100 GB cloud storage, all templates"
Legal linksFunctional Terms of Use (EULA) and Privacy Policy linksTappable links in the paywall footer
RestoreA way for existing subscribers to restore or sign in"Restore Purchases" button in the footer
Button labelMust not hide that a paid subscription startsTrial-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

  1. 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.
  2. 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).
  3. 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.
  4. Add both links inside the app – on the paywall itself, not only in Settings. With SwiftUI's SubscriptionStoreView, set explicit destinations via subscriptionStorePolicyDestination(url:for:) for .termsOfService and .privacyPolicy; developers have reported the default policy buttons showing a "Terms of Service Unavailable" message when nothing is configured.
  5. 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.
  6. 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?.isEligibleForIntroOffer in StoreKit 2). Each person can redeem one introductory offer per subscription group.
  7. Add Restore Purchases. Call AppStore.sync() only from an explicit button tap – it shows an App Store sign-in prompt – and read entitlements from Transaction.currentEntitlements on launch.
  8. Offer subscription management with AppStore.showManageSubscriptions(in:), so users can switch plans inside one subscription group (3.1.2(b)).
  9. 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.
  10. 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 example originalAppVersion) for people who bought a paid app, or the non-consumable in Transaction.currentEntitlements for 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 to InAppPurchase.instance.restorePurchases(), handle the restored items from purchaseStream, and show the localized ProductDetails.price.
  • React Native: use the store-provided price string and expose restore – for example Purchases.restorePurchases() with RevenueCat or getAvailablePurchases() with react-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.

Hello App Review Team,

Thank you for your feedback on [App Name], version [x.y] (build [number]), regarding Guideline 3.1.2. We have made these changes [keep only the points that apply]:

- In the app: the subscription screen ([path, e.g. Onboarding > Paywall, and Settings > Upgrade]) now shows functional links to our Terms of Use (EULA) and Privacy Policy, plus a "Restore Purchases" button.
- Pricing: the billed amount of each plan ([plan names]) is now the most prominent price. Trial length and the price charged afterwards appear above the purchase button.
- App Store metadata: the App Description now includes a link to the Terms of Use ([URL]) in all localizations ([list]). The Privacy Policy URL in App Privacy is [URL].

Screenshots of the updated subscription screen are attached. Please let us know if anything else is needed.

Best regards,
[Name]
[Company]

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?
Yes. If you don't provide a custom EULA, Apple's standard EULA applies – but the license agreement link is then not shown on your product page. That is why reviewers ask you to add a link to 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?
Add it as a plain URL in the App Description of every localization, or set a custom EULA under App Information > License Agreement. Don't rely on Promotional Text alone: Apple's rejection message asks for the link in the App Description, and Promotional Text can be changed at any time without review. The Privacy Policy URL goes in App Privacy.
What is the minimum subscription length on the App Store?
Guideline 3.1.2(a) requires an auto-renewable subscription period of at least seven days. The shortest duration you can choose in App Store Connect is one week; the others are one, two, three or six months and one year. For shorter access, use a different product type such as a consumable or non-renewing subscription.
Can I show the weekly price of an annual subscription?
Yes, as long as it stays subordinate. Apple says the amount that will be billed must be the most prominent pricing element, so the yearly total must be larger and come first. Advertising "only [weekly price] a week" as the headline is a classic 3.1.2 trigger.
Is a "Start free trial" button still allowed?
It can be, but the billed amount and what happens after the trial must be more prominent than the trial itself. In 2026 developers reported 3.1.2(c) rejections where a "Try for free" button dominated and the renewal price was small. Put "then [price] per year" right above the button in readable type.
Are toggle paywalls still allowed on the App Store?
Since mid-January 2026 developers have reported 3.1.2 rejections for paywalls with a switch that adds or removes a free trial, with App Review calling the design confusing. Replace the toggle with separate, clearly labeled plans that each show their own billed amount and trial terms.
Do I need a new build to fix a 3.1.2 rejection?
Only if the binary is affected. A missing link in the App Description can usually be fixed in App Store Connect and resubmitted with the same build. Changes to links, restore or pricing on the paywall need a new build unless the paywall is configured remotely.
Why was I rejected again although the links are there?
Check every localization of the description, test the links on a device while logged out and confirm the reviewer's paywall variant includes them. If all is in place, reply with screenshots; if the finding repeats, appeal to the App Review Board.

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.

Talk to a real App Specialist

Turn your rejection into an approval

Book a free consultation call or let our App Specialists take over CI/CD, guidance on the fixes and the resubmission. Your app does not have to be 100% ready.

Back To School Sale prices until 31st October 2026. Prices in USD, excl. VAT.