Guideline 3.1.2 is one of the shorter rules App Review will cite, and one of the easier ones to fail on a detail that has nothing to do with your product. Every time we've shipped a paywall at Olnesta Ltd, the checklist has been the same, and it's worth writing down plainly because most rejections we've seen in this area come from a missing element rather than a disagreement about what an app is allowed to charge for.

The short version: on the screen where the user actually taps to buy an auto-renewable subscription, the title of what they're subscribing to, the length of the period, and the price for that period must all be visible on that same screen. Not one tap away, not inside a modal that opens when you tap a small info glyph, not implied by the App Store product page. On the paywall itself, in text the reviewer can read without interacting.

What has to be on the screen

Four things, together, in our experience cover the mechanical requirements. First, the subscription name, meaning what the user is being enrolled in, phrased the same way you describe it elsewhere in the app. Second, the length of the renewal period, stated in words a normal person reads the same way you do: monthly, yearly, weekly. Third, the price the user will be charged, in their local currency as StoreKit returns it, for that period. Fourth, the fact that it auto-renews until cancelled.

Alongside those, the paywall needs a functional link to your Terms of Use and a functional link to your Privacy Policy, and a working Restore Purchases control. These three are non-negotiable in the sense that any one of them being broken or missing is enough for a rejection on its own, independent of anything else about the app. We've had a build come back because a Terms link pointed at a page that had quietly 404'd between submissions. The reviewer taps every link. Assume they will.

Restore Purchases in particular is worth checking on a fresh device signed into a real Apple ID that actually owns the subscription, not only in the simulator. It's the control that lets a paying customer recover their entitlement after reinstalling or switching devices, and if it does nothing or throws, that's the finding. A button labelled Restore that opens a sheet and then silently fails counts as broken.

The intro price trap

The version of 3.1.2 we see teams trip over most often, ourselves included on earlier apps, is the free trial or introductory price presentation. If your paywall shouts "7 DAYS FREE" in a headline and then whispers the renewal price in small grey text below, review will read that as obscuring the real cost. The rule of thumb we use now is that the price the user will actually pay, and the cadence at which they'll pay it, should be at least as prominent as the trial framing. Same weight, same colour contrast, same reading order.

This is one of those places where designing for what the reviewer will notice and designing for a user who won't feel tricked in a month happen to point at the same layout. A customer who clearly saw "then $39.99 per year" before they tapped is a customer less likely to open a refund request or a chargeback later. The App Review outcome and the retention outcome line up.

Practical checks before submission

Before we push a paywall build to TestFlight for external review, we run through the same short list. Open the paywall on a clean install. Confirm the product title, period, and price render from StoreKit and not from a hardcoded string that might have drifted. Tap Terms, tap Privacy, tap Restore, and watch each one do the thing it says. Read the screen out loud and ask whether someone hearing it for the first time would know what they'll be charged, when, and how often. If any part of that sentence is missing from the screen, add it before submitting.

None of this is exotic, and none of it requires reading between the lines of the guideline. It's mostly a matter of treating the paywall as a small standalone document that has to be complete on its own, because that's how it will be read. The apps we've had approved on the first pass are the ones where we stopped thinking of the paywall as marketing surface and started thinking of it as a disclosure surface that happens to also convert.