Guideline 3.1.2 Rejection: How to Fix Your Subscription Paywall for App Review

DavidDavid September 25, 2026 9 min read
A smartphone lying face-up on a dark walnut desk beside a small brass balance scale with a single coin on one pan, a folded blank cream paper card, and a matte black fountain pen in moody warm window light
Original image, App Store Launch Club

What a Guideline 3.1.2 rejection actually means

A Guideline 3.1.2 rejection means App Review looked at your auto-renewable subscription and found it does not meet Apple's Subscriptions rule. Apple files 3.1.2 in the Business chapter, right after 3.1.1 (In-App Purchase), and it has three lettered clauses: 3.1.2(a) Permissible uses, 3.1.2(b) Upgrades and Downgrades, and 3.1.2(c) Subscription Information. The rejection you get names the clause, and for a typical indie app built with Expo and RevenueCat it is (c) far more often than the other two. 3.1.2(c) says that before asking a customer to subscribe you should clearly describe what the user gets for the price, and that you must communicate the requirements in Schedule 2 of the Apple Developer Program License Agreement. In plain terms: your paywall is missing a required disclosure, or your listing is missing a required link.

This is a different failure from 3.1.1. A 3.1.1 rejection means you unlocked something without in-app purchase at all. A 3.1.2 rejection means you are using in-app purchase correctly and the subscription itself is wired, but the screen that sells it does not say enough, says it in the wrong proportion, or is missing a way back in for existing subscribers. That is why it is so common on a first submission: the RevenueCat integration works in sandbox, the purchase completes, and the builder never checks the screen against the disclosure list because nothing crashed. If your rejection cites 3.1.1 instead, [the Guideline 3.1.1 rejection post](/blog/app-store-rejection-guideline-3-1-1) covers that case.

The clause map: which 3.1.2 rejection you got

The lettered clause in your rejection tells you where the fix lives. Read it before you touch anything.

The three Guideline 3.1.2 clauses and what each one targets

ClauseWhat it targetsWhere the fix lives
3.1.2(a) Permissible usesWhat a subscription may be: it must provide ongoing value, the period must last at least seven days, it must work on all of the user's devices where the app is available, and the user must get what they paid for without extra tasks like posting to social media or checking in a set number of timesYour product setup in App Store Connect and your entitlement logic in the app
3.1.2(b) Upgrades and DowngradesUsers must have a seamless upgrade and downgrade experience and must not be able to accidentally subscribe to two variations of the same thingSubscription group configuration in App Store Connect and the tiers you show on the paywall
3.1.2(c) Subscription InformationBefore asking someone to subscribe you must clearly describe what they get for the price and meet the Schedule 2 disclosures: subscription title, length, price (and price per unit where appropriate), plus Terms of Use and Privacy Policy links accessible in the appThe paywall screen itself, plus the description and privacy policy fields in App Store Connect

Two of these are rare for a first app. 3.1.2(a) usually only bites when a builder ships a subscription shorter than a week, gates paid content behind a share-to-unlock step, or lets a subscription silently stop working on a second device because entitlements are stored locally instead of tied to the account. 3.1.2(b) shows up when monthly and annual are created as two separate subscription groups instead of two products in one group, so a user can end up paying for both. The rest of this post is about 3.1.2(c), because that is where nearly every indie rejection lands.

The Paywall Seven: what your subscription screen must show

Inside App Store Launch Club we run every subscription screen against a list we call the Paywall Seven. It is nothing more than Apple's own disclosure requirements, taken from Guideline 3.1.2(c), Schedule 2 of the developer agreement, and Apple's published subscription guidance, arranged in the order a reviewer reads a screen. If all seven are on the paywall and in the listing, 3.1.2(c) has nothing to cite.

  1. The subscription name, matching the product name you created in App Store Connect.
  2. The length of the subscription: weekly, monthly, or annual, stated on the screen and not only implied by the price.
  3. What the subscriber gets during that period. Apple's own examples are how many issues per month, how much storage, what kind of access. Outcome language is fine, but the scope has to be concrete.
  4. The full renewal price, shown clearly and prominently, and as the most prominent pricing element on the screen. An annual plan has to lead with the annual total. You can show a per-month equivalent or a savings badge, but Apple requires those to sit in a subordinate position and size.
  5. If you offer a free trial or introductory offer, how long it lasts and the exact price billed when it ends, stated together so there is no ambiguity about the first charge.
  6. A way for current subscribers to sign in or restore purchases, on the paywall itself, not buried in settings.
  7. Functional links to your Terms of Use and your Privacy Policy, reachable from the app, and both also present in your App Store metadata.

Fixing 3.1.2(c) in the app: the paywall itself

Open your paywall on a device and read it as a reviewer would, top to bottom, with the Paywall Seven next to you. Most rejected screens fail on three or four items at once because they were designed for conversion first and audited never. The fix is usually layout and copy, not billing logic, which is why it belongs in the same pass as [the paywall screen that converts](/blog/paywall-screen-that-converts): the disclosures Apple requires are also the ones that make a buyer trust the button.

  • Pull the product title and duration from your RevenueCat offering or StoreKit product instead of hard-coding strings, so the screen always matches what App Store Connect will actually charge.
  • Render the localized price from the store object. Apple requires the renewal price to be localized in available currencies, and the product object already carries the right string for the user's storefront.
  • If you show a trial, put the trial length and the post-trial price in the same sentence, directly above or on the purchase button, and make sure the button label does not say "Continue" when it means "Start trial, then pay."
  • Add a visible Restore Purchases action and a sign-in link for existing subscribers on the paywall. RevenueCat's restore call is one line; the rejection comes from it not being on the screen.
  • Put Terms of Use and Privacy Policy links on the paywall footer, opening real, working web pages. A link that 404s or points to a placeholder counts as missing.

Once the screen is corrected, run the purchase and the restore path in sandbox before you build. [How to test in-app purchases in sandbox mode](/blog/how-to-test-in-app-purchases-in-sandbox-mode) covers the sandbox account setup, and [how to set up in-app subscriptions](/blog/how-to-set-up-in-app-subscriptions) has the product and offering wiring if anything upstream of the screen is off.

Fixing 3.1.2(a) and 3.1.2(b) when you actually got those

If your rejection cites (a), check the product and the behavior, not the screen. Confirm the subscription duration you created in App Store Connect is at least a week (Schedule 2 lists weekly, monthly, bi-monthly, tri-monthly, semi-annual, and annual as the allowed cadences). Confirm the entitlement is tied to the user's store account or your own account system so it works on their other devices, which is exactly what RevenueCat's customer identity handles when you use it. Remove any step between paying and getting the content: no follow-us gate, no invite-three-friends unlock, no check-in streak required to keep access.

If your rejection cites (b), open Subscriptions in App Store Connect and make sure every tier of the same service lives in one subscription group, ranked by service level, so the store handles upgrade, downgrade, and crossgrade for you. Two groups for monthly and annual of the same thing is the classic mistake because a user can hold both at once. On the paywall, show the tiers as mutually exclusive options and never present the same plan twice with different labels.

Audit the paywall with Claude Code before you resubmit

The disclosure audit is mechanical enough that Claude Code, running from the desktop app against your Expo project, does the whole pass in one go. Paste the Paywall Seven into the prompt and ask it to check your paywall component against each item, flag every string that is hard-coded instead of read from the product, and confirm the restore and link handlers actually exist and are wired.

  1. Ask Claude Code to list every price, duration, and trial string rendered on the paywall and where each value comes from. Anything hard-coded gets replaced with the product object.
  2. Have it restructure the pricing block so the billed amount is the largest text and any per-month equivalent is rendered smaller and below it.
  3. Ask it to add or verify a Restore Purchases handler and a sign-in link on the paywall, and to wire Terms and Privacy links to the same URLs you put in App Store Connect.
  4. Then walk the screen yourself on a real device with the list in hand. The reviewer will, and one missed item is another round trip.

If you want the broader submission checklist around this, [how to pass Apple App Review](/blog/how-to-pass-apple-app-review) covers the rest of the review, and [the subscription pricing guide](/guides/how-to-price-your-app-subscription) helps you decide the tiers before you lay them out.

TL;DR

A Guideline 3.1.2 rejection is Apple's Subscriptions rule, and for indie apps it is almost always 3.1.2(c): the paywall or the listing is missing a required disclosure. Run the screen against the Paywall Seven - name, length, what is included, full renewal price as the most prominent price, trial length with post-trial price, a restore or sign-in path, and working Terms of Use and Privacy Policy links in the app and in App Store Connect. Fix the layout so the billed amount leads, pull every string from the store product, and put the two links in both places. 3.1.2(a) is about the subscription itself (at least seven days, works on all devices, no extra tasks), and 3.1.2(b) is one subscription group per service so nobody pays twice.

Every item on that list is something a member of App Store Launch Club has been rejected for at least once, which is how the list got written. Members post a screenshot of their paywall before they submit and someone who has already taken the 3.1.2 round trip reads it against the seven in minutes. Join at applaunchclub.co for $9 a month and get your subscription screen checked before App Review does it for you.

Free app-building tips, straight to your inbox

Short, practical drops on app ideas, validating fast, store listings, and passing app review. No spam, unsubscribe anytime.

Frequently asked questions

What is Guideline 3.1.2 in App Store Review?

Guideline 3.1.2 is Apple's Subscriptions rule in the Business chapter of the App Store Review Guidelines. It has three clauses: 3.1.2(a) Permissible uses, which defines what an auto-renewable subscription may be and how it must behave; 3.1.2(b) Upgrades and Downgrades, which requires a seamless upgrade and downgrade experience with no accidental duplicate subscriptions; and 3.1.2(c) Subscription Information, which requires you to clearly describe what the user gets for the price and to meet the disclosure requirements in Schedule 2 of the Apple Developer Program License Agreement.

What does a paywall have to show to pass Guideline 3.1.2?

Apple's published subscription guidance says the sign-up screen must include the subscription name and duration with the content or services provided, the full renewal price shown clearly and prominently and localized, and a way for current subscribers to sign in or restore purchases. The billed amount must be the most prominent pricing element on the screen. If there is a free trial, the trial length and the price billed after it must be clearly shown. Terms of Use and Privacy Policy links must be in the app and in your App Store metadata.

Where do I put the Terms of Use link for App Store Connect?

The Privacy Policy has its own URL field under App Information in App Store Connect. Terms of Use does not have a dedicated field for most apps, so the standard practice is to include a working Terms of Use link in your app description. If you use a custom EULA instead of Apple's standard license agreement, it goes in the License Agreement section of App Information. In every case the same links also have to be reachable from inside the app, typically on the paywall.

Do I need a new build to fix a Guideline 3.1.2 rejection?

Usually yes, because the fix is on the paywall screen inside the binary: price hierarchy, trial disclosure, restore button, or in-app links. The exception is when the reviewer only cited missing Terms of Use or Privacy Policy links in your App Store metadata. Those are listing fields in App Store Connect, so you can correct them and resubmit the same build.

Can an annual subscription show a per-month price on the paywall?

Yes, but only as a secondary element. Apple's guidance is that the amount actually billed must be the most prominent pricing element. For an annual plan that means the annual total is the headline, and a per-month equivalent or a savings comparison may appear in a smaller, subordinate position. Leading with the monthly equivalent and hiding the annual total in small print is the layout that gets cited.

Does Guideline 3.1.2 apply if I use RevenueCat?

Yes. RevenueCat wires the purchase, restore, and entitlement logic, but Guideline 3.1.2 is about what your screen and your listing disclose, which is still your responsibility. Pull the product title, duration, and localized price from the RevenueCat offering rather than hard-coding them, expose the restore call on the paywall, and add the Terms and Privacy links yourself. The integration does not add those to your UI for you.

Last reviewed by David on September 25, 2026

David

Written by

David

Founder and app builder

Keep reading

App StoreMonetization

App Store Promo Codes vs Offer Codes: How to Give People Free Access to Your Expo App

App Store promo codes give someone a free download of your paid app. Offer codes give someone a free or discounted in-app purchase or subscription. Since March 26, 2026 Apple no longer lets you create promo codes for in-app purchases, so an Expo app with a subscription paywall hands out offer codes, and a paid-up-front app hands out promo codes. Here is what each one does, the limits Apple publishes, how to create them in App Store Connect, and how to redeem them from a RevenueCat paywall.

David 9 min
Read article
Apple App ReviewApp Store

App Store Age Rating Questionnaire: How to Answer It Correctly (4+, 9+, 13+, 16+, 18+)

The App Store age rating questionnaire is the required set of questions in App Store Connect that decides whether your app shows as 4+, 9+, 13+, 16+ or 18+. Apple calculates the rating from your answers, and a handful of capability questions (unrestricted web access, social media, medical information) push a plain utility app up two tiers if you answer them loosely. Here is what each question means, which answers move the rating, and how to fill it in for an Expo app.

David 9 min
Read article

Ready to build it yourself?

Join App Store Launch Club, the #1 community for building and launching apps, for $9/month.

← Back to the blog