Guideline 3.1.2: App Rejected for Its Subscription
By Mehdi Azizi
Published , 9 min
Guideline 3.1.2: the billed amount must be the most prominent price on your paywall, with duration, renewal and Terms links. Two real rejections and the fix.
Guideline 3.1.2 covers auto-renewable subscriptions. If Apple cites it, check two things: the amount actually billed must be the most prominent price on your paywall, and both the app and its product page must show the duration, the price, and working links to your Terms of Use and Privacy Policy.
I got this rejection on two of my apps in October 2026: Solys on the 10th, TradaZen on the 12th. Same display both times: a weekly price in big type, the real billed amount in small type. Here's the text of the rule, those two cases, then the checklist I use now. For other reasons, read why Apple rejects an app.
What does guideline 3.1.2 say?
3.1.2, "Subscriptions," sits in section 3 "Business" of the App Review Guidelines, under 3.1 "Payments." That's where the email subject comes from: "Guideline 3.1.2 - Business - Payments - Subscriptions." It has three subsections, and the letter in parentheses tells you where to look.
| Subsection | What Apple requires | Typical rejection |
|---|---|---|
| 3.1.2(a) Permissible uses | Ongoing value, 7 days minimum | Subscription with no evolving content |
| 3.1.2(b) Upgrades and Downgrades | Switch plans without double billing | Two plans paid at the same time |
| 3.1.2(c) Subscription Information | What you get, at what price | Calculated price bigger than billed one |
The text of 3.1.2(c) is short. Before asking someone to subscribe, you must "clearly describe what the user will get for the price." It then points to Schedule 2 of the Apple Developer Program License Agreement. That schedule lists what you must display "clearly and conspicuously":
- the title of the subscription;
- its length;
- its price, and the price per unit if relevant;
- links to your Privacy Policy and Terms of Use, accessible in the app.
The rule about price size is on Apple's subscriptions page. In the purchase flow, "the amount that will be billed must be the most prominent pricing element in the layout." A monthly equivalent or a savings figure is still allowed, as long as it's secondary and smaller. The same page asks that, for a free trial, you state its length and the price billed when it ends.
The two 3.1.2(c) rejections I got
Solys: €0.38 big, €19.99 small
Solys is my alarm clock that puts your social apps to sleep. On the onboarding paywall, the "Annual" card showed "€0.38/wk" in 21-point bold. Below it, in 15 points: "i.e. €19.99/yr." But €19.99 is what gets charged, not €0.38.
On October 10, 2026, Apple rejected the version citing 3.1.2(c). The message asks that the billed amount be the clearest and most prominent pricing element. Free trial, introductory price and calculated prices must stay subordinate to it. Apple lists its criteria: font, size, color and placement.
I'd kept that display knowingly: an earlier TradaZen version built the same way had been approved. It was a bet, and it cost me a review cycle.
The fix: "€19.99/yr" in big type, "i.e. €0.38/wk" as a gray caption below, in all 30 of the app's languages. Since the paywall lives in the code, I needed a new build before resubmitting.
TradaZen: same reason, two days later
TradaZen is my trading simulator. On October 12, 2026, version 1.5.1 was rejected under the same rule. The message mentions a "weekly calculated" price displayed "more clearly and conspicuously than the billed amount": the weekly equivalent was more visible than the billed amount.
My first fix wasn't enough, and I caught it before submitting. I'd shrunk "€0.92/wk" but left it on the right, on the price line. But the weekly plan's card showed its real price in that same column: "€8.99/wk." Both amounts read at the same level. A calculated price sitting in the column of real prices reads as a billed price, even in small type.
The fix I kept: each card shows its billed amount in big type on the right. The weekly price becomes a gray caption below. On the left, just the plan name. At the next review, Apple no longer flagged 3.1.2(c).
The other lessons from this app are in the TradaZen case study.
What Apple rejected, what got through
Here are the real displays, in order, with their outcome.
| Price display | Outcome |
|---|---|
| TradaZen, earlier version: weekly price up front | Approved in a previous review |
| Solys: "€0.38/wk" in bold, "€19.99/yr" below | Rejected 10/10/2026, 3.1.2(c) |
| TradaZen 1.5.1: weekly price more visible than billed amount | Rejected 10/12/2026, 3.1.2(c) |
| TradaZen: weekly price shrunk, but in the price column | Dropped by me before submitting |
| TradaZen: billed amount big on the right, weekly as caption | No longer cited at next review |
| Solys: "€19.99/yr" big, weekly as gray caption | Fixed and resubmitted to Apple |
The first row matters most. An approved review doesn't validate your paywall for the next one. Every version goes back in front of a reviewer, who may read the rule more strictly than the last. The only safe display is the one that follows the text.
The billed amount is the only big price. Any equivalent, weekly, monthly or daily, is a smaller, paler caption, never in its place.
The 3.1.2-compliant paywall checklist
This is the list I now run through on every paywall in my apps, before every submission:
- On each card, the billed amount is the biggest, highest-contrast, best-placed price.
- Any calculated price (weekly, monthly, daily) is a caption, smaller and paler, below the billed amount.
- No calculated price sits in the column where another plan shows its real price.
- The duration is spelled out: "per year," "per week."
- The free trial states its length and the amount billed when the trial ends.
- One sentence says the subscription renews automatically and can be canceled in Apple account settings.
- What the subscription unlocks is written before the purchase button.
- A "Restore Purchases" button is visible on the paywall.
- Links to the Terms of Use and Privacy Policy are on the paywall and actually open.
- If you offer several plans, they're in a single subscription group, as Apple recommends.
- The layout is checked on the smallest iPhone and with the longest price. On TradaZen, I test the price in Vietnamese dong: an amount that wraps to a new line breaks the hierarchy.
If you use RevenueCat paywalls, the RevenueCat documentation gives the same warning: a monthly price variable alone isn't enough if the billed amount and its period don't appear elsewhere. The full setup is in RevenueCat: setting up an in-app subscription, and design mistakes in iOS paywall: 7 beginner mistakes.
Terms and privacy links: in the app and on the product page
The other kind of 3.1.2 rejection targets metadata, not the paywall. Messages posted by developers on Apple's forums spell out where Apple expects them: the Privacy Policy link in the dedicated App Store Connect field, and the Terms of Use (EULA) link in the description or in the EULA field.
The trap comes from the standard agreement. According to App Store Connect Help, if you don't add a custom agreement, Apple's standard one applies and "the license agreement link isn't shown on your App Store product page": no link appears on your page. If you use the standard agreement, it's up to you to put its link in the description, pointing to your terms page or to Apple's standard license agreement.
On my subscription apps, I end the description with two lines, in every language of the product page. Here's the template, adapt it to your offer and your domain:
7-day free trial, then annual or weekly subscription,
cancel anytime.
Terms: https://your-domain.com/terms
Privacy: https://your-domain.com/privacy
Open both links before pasting them: a page that doesn't load counts as a missing link. What the policy must contain is covered in privacy policy for an app, and the rest of the product page on the App Store ASO page.
This one is fixed without a new build: the description and App Store Connect fields are metadata.
3.1.2(a): a subscription must provide ongoing value
The other subsection that gets apps rejected targets the model, not the screen. 3.1.2(a) requires "ongoing value": value that continues over time. The period lasts at least seven days, and the subscription works across all of the user's devices. Subscribers get what they paid for without extra tasks, like posting on social media.
If your app delivers a one-time service, a one-time purchase may fit better. Both models are compared in subscription or one-time purchase.
How to reply to Apple after a 3.1.2 rejection
The conversation happens in your app's App Review section. The process to reply to App Review is the same as for other guidelines. Two cases:
- The problem is in the app (price size, paywall disclosures): you need a new build, like for Solys and TradaZen. The reviewer tests the shipped code, as I explain in the guide on guideline 2.1.
- The problem is on the product page (missing or dead links): you fix the metadata, reply, and the same submission goes back out.
Write in English, plainly: what was wrong, what changed, how to check it. Here's the template I use (replace the build number, prices and flow with yours):
Hello,
Thank you for your review.
Issue: on the paywall, the weekly equivalent price was displayed
more prominently than the billed amount.
Fix in build X:
- Each plan now shows its billed amount (e.g. "€19.99/year")
as the largest price on the card.
- The weekly equivalent is a smaller grey caption below it.
- The paywall states the duration, the auto-renewal, and links
to our Terms of Use and Privacy Policy.
How to verify: launch the app and complete the onboarding.
The paywall appears at the end.
Best regards,
Fix your paywall before your next submission
If your app was just rejected under 3.1.2, the Apple Review Kit helps you find the cited rule, what it requires, and an example fix and reply. Its Claude Code skills also review your paywall and product page before you submit. For a human eye, book an hour with me: we read Apple's message and rework your paywall on your screen. The full process is on the app rejected by Apple page, and subscription setup on the iOS in-app subscription page.
If you're preparing your first release, take the free diagnostic: it puts the steps in order and sends you my Apple anti-rejection checklist. To build a mobile app that makes money from launch day, the iOS Kit dedicates its third step, "plug in the money," to subscriptions and the paywall.
Nobody can guarantee Apple will approve your app. What I can do is help you avoid the 3.1.2(c) rejection I paid for twice.
Frequently asked questions
What does "Guideline 3.1.2 - Business - Payments - Subscriptions" mean?
It's the full title of the subscription rule. It flags a badly prioritized price, missing info on the paywall, a missing link on the product page, or a subscription without ongoing value. The letter in parentheses, for example 3.1.2(c), tells you which subsection is involved.
Can I still show a weekly or monthly price?
Yes. Apple allows a weekly or monthly equivalent, or a savings figure, as long as they stay smaller and less visible than the amount actually billed. In my apps, the equivalent is a gray caption under the billed price, never in the column of real prices.
Do I need a new build after a 3.1.2 rejection?
Yes if the problem is on the paywall, since the reviewer tests the shipped code. No if it's on the product page, like a link missing from the description: you fix the metadata and the same submission goes back out.
Where should I put the Terms of Use (EULA) link?
In the app, on the paywall. On the product page, in the description, or in the App Store Connect EULA field if you have a custom agreement. With Apple's standard agreement, no link shows on your page: add it yourself in the description, in every language.
My paywall was already approved, why is it rejected now?
Because every version goes back through review, sometimes with a different reviewer. A weekly price up front had been approved on TradaZen, then rejected on Solys and on TradaZen in October 2026. Only the text of the rule protects you.