Guideline 3.1.2: Subscriptions
A Guideline 3.1.2 rejection nearly always means one of two things: your paywall does not state all of the subscription terms Apple requires before purchase, or the Terms of Use and privacy policy links are missing, broken, or somewhere the reviewer could not reach them.
It is a paperwork rejection, not a product one. Fix the paywall copy and the links and it goes away, usually without an argument.
How it is usually worded
The header arrives as Guideline 3.1.2 - Business - Payments - Subscriptions, and the body is normally one of these:
- "We were unable to find the following required information in your app: length of subscription, price of subscription, and price per unit if appropriate."
- "Your app's metadata does not include a functional link to the Terms of Use (EULA)."
- "We were unable to restore the purchases made with your app."
What it actually means
Your paywall is a legal disclosure surface, not just a button. Apple's position is that a user must be able to see exactly what they are buying, for how long, at what price, and on what terms, before they tap.
The guideline names the facts it wants disclosed in the app itself:
- the title of the publication or service
- the length of the subscription, including the content or services provided in each period
- the price, and the price per unit where that makes sense (per month on an annual plan, for example)
- a functional link to your Terms of Use, also called the EULA
- a functional link to your privacy policy
Reviewers also expect the renewal behaviour spelled out in plain words: that the subscription renews automatically, that the charge goes to the Apple ID, and that it can be cancelled in Settings. Apple's own subscription documentation asks for this language, so write it even when a reviewer has not yet asked.
Why it triggers
- The paywall shows only a price. Two buttons reading "£4.99 / month" and "£39.99 / year" and nothing else. No period description, no renewal sentence, no links.
- The disclosures exist but are one screen away. Buried behind a "Details" sheet, or under a scroll the reviewer never performed.
- The links do not work. A
Termslabel that is plain text rather than a control, a URL that 404s, a link that opens an in-app web view showing a blank page, or an https URL that only resolves without the www. - App Store Connect fields are empty. The privacy policy URL is required, and if you do not supply your own EULA, Apple's standard licence applies. Reviewers frequently want your own link present in both the app and the App Store description.
- Restore is missing or unreachable. A restore control that only appears once you are signed in fails, because reviewers arrive with no account.
- Introductory offers described loosely. "Free trial" with no statement of what happens at the end, or a trial length that does not match the offer configured in App Store Connect.
How to fix it, in order
- Put the full disclosure block on the paywall itself. Above the fold, visible without scrolling if you can manage it. Name the product, the period, the price, the per-unit price, the renewal behaviour and cancellation route.
- Make Terms and Privacy real, tappable links. Test each one on device, on cellular, from a cold launch. Both should load without a login.
- Add a visible Restore control to the paywall, not just to a settings screen behind authentication. In StoreKit 2,
AppStore.sync(); in the older API,SKPaymentQueue.default().restoreCompletedTransactions(). - Fill the App Store Connect fields. App Information carries the privacy policy URL and the optional custom licence agreement. If you have your own EULA, put it there rather than relying on the description alone.
- Repeat the terms in the App Store description. A short block at the end covering price, period and the two links. This is cheap and it removes a whole class of follow-up.
- Match the trial copy to the configured offer. If App Store Connect says seven days, the paywall says seven days, and says what the price becomes afterwards.
- Localise the block. Every language you list in App Store Connect.
- Buy it yourself with a sandbox account, from a fresh install, without signing in first. That is roughly the path the reviewer takes.
What to send back
Name the change and where it lives. A reply saying "we have updated the paywall" reads as the same build resubmitted.
Thank you for the review. The subscription screen now displays the required information before purchase: the product name, the subscription length and what each period includes, the price and the monthly equivalent for the annual plan, and a statement that the subscription renews automatically until cancelled in Settings. Functional links to our Terms of Use and privacy policy are on the same screen and in the App Store description, and a Restore Purchases control is available on the paywall without signing in. The paywall is reachable from the first screen after launch, with no account required.
If the rejection named restore, add the path: "launch the app, tap Continue on the welcome screen, then tap Restore Purchases at the bottom of the plans list."
When it is really a different guideline
- Purchases routed outside In-App Purchase, or a link to your own web checkout, is 3.1.1.
- The reviewer could not complete the purchase at all, or it crashed, is 2.1.
- Subscribing to something with no ongoing value, or a subscription gating hardware you already own, is judged under the permissible-uses part of 3.1.2.
- No way to delete the account is 5.1.1(v), and it turns up in the same review as often as not.
Restore is sometimes cited under 3.1.1 instead. The fix does not change, so do not argue the number.
AppSubmit checks the App Store Connect privacy policy and licence fields before it submits. A checklist in your repo does the same job.
Source: Apple, App Store Review Guidelines, 3.1.2 (https://developer.apple.com/app-store/review/guidelines/#subscriptions)
Related: apple-guideline-3-1-3-reader-apps, apple-guideline-5-1-1-v-account-deletion, apple-guideline-2-2-beta-testing