Skip to content
WebViewGold Vibe Coding to App Store
English
Get WebViewGold

App Store rejection

Guideline 3.1.2 (Subscriptions): the paywall details reviewers check and how to add them

Your in-app purchase works, and Apple still rejects the app. 3.1.2 rejections are about what the paywall tells the user before they tap: what they get, how much, how often, that it renews, and how to restore or cancel. All of it is copy and two links.

From $109 one-time per platform, or let our team do it all from $698.

  • Approval guarantee – or money back within 14 days
  • No coding needed
  • One-time payment, free updates
  • 24/7 human support
  • Made in Germany since 2014 · ISO 27001

What 3.1.2 asks of a subscription

Auto-renewable subscriptions must deliver ongoing value, work across the user's devices, and be presented honestly: the paywall must state the subscription's name, its length, the price per period, and that it renews automatically until cancelled. The app and its App Store listing need working links to the terms of use and the privacy policy, and users must be able to restore purchases. Free trials and introductory offers must say what they cost afterwards.

Web pricing pages break several of these at once. A card that says "Pro $9/mo" with a "Start free" button has no period in words, no auto-renew statement, no trial end price, no restore link, and a "Cancel anytime in your dashboard" line that points to Stripe. That is a 3.1.2 rejection even though the RevenueCat purchase itself succeeds.

The paywall checklist reviewers tick off

  • Name of the subscription and what it includes, in a sentence a new user understands.
  • Length of the period in words (monthly, yearly) and the price per period in the user's store currency.
  • A statement that the subscription renews automatically unless cancelled at least 24 hours before the period ends.
  • Free trial: duration, the price charged when it ends, and a note that cancelling before the end avoids the charge.
  • A "Restore purchases" link (restoreinapppurchases://) and a "Manage subscription" link (cancelinapppurchase://).
  • Links to the terms of use and the privacy policy on the paywall and in the App Store description.

Two ways to build a compliant paywall for the WebViewGold build

  1. Option A: let RevenueCat render it natively

    Design the paywall in the RevenueCat dashboard, add your terms and privacy links there, and open it from the web app with revenuecat://launchPaywall?external_id=USER_ID&offering=default. The template shows localized prices and a restore button, so the required elements are in one place. Requires iOS 15 or later.

  2. Option B: your own HTML paywall

    Keep your design, add the checklist items above, and link the buy button to revenuecat://purchase?external_id=USER_ID&product=pro_monthly. For localized prices, read the store country from storeLocation after calling getstorelocation:// (or enable autoInjectVariable in Config.swift) and show the matching price you set in App Store Connect.

  3. Sync the entitlement and show the state

    RevenueCat webhooks update the user's plan in Supabase or Firebase. In the app, show "Pro until [date]" and the manage link; getpurchasehistory:// fills window.purchaseHistory if you want a native receipt list.

  4. Hide the web billing UI in the app

    The Stripe customer portal, "Change plan on the website" buttons and web-only promo codes must not appear inside the app. Hide them with the user agent marker or with app-only CSS.

  5. Add the links to the listing

    Paste the terms of use URL and the privacy policy URL into the App Store description and the privacy policy field. Apple's standard EULA can be used if you have no terms of your own.

  6. Test with a sandbox account and resubmit

    Walk through purchase, restore and cancellation with a sandbox tester, record a short video, upload the new build and reply in Resolution Center with where the disclosures are.

WebViewGold has allowed us the shortest and most efficient time-to-market ever possible from among all the other app platforms we have ever tried during the past 5 years. I don’t know why I hadn’t discovered you sooner, but I am really, really glad I did. Currently nearing 6000 app downloads on both iOS App Store & Google Play Store without any problem!

Antonio Davila · CodeCanyon

Wording that gets flagged, and what passes

FlaggedPasses
Start free7-day free trial, then $4.99 per month. Renews automatically; cancel at least 24 hours before the trial ends to avoid the charge.
Pro $9Pro, $8.99 per month, billed monthly until cancelled.
Lifetime access (for a subscription)Yearly plan, $49.99 per year.
Cancel anytime on our websiteManage or cancel in your Apple ID subscription settings.

Prompt: generate the compliant paywall component

Prompt for Lovable, Bolt, v0 or Cursor
Create a Paywall component for my app. When the user agent contains MyAppiOS (our iOS app), show this version; on the web keep the existing Stripe pricing. Content: plan name [name]; what is included [list]; price per period as a variable [price] with the period written in words (per month / per year); free trial [days] days, then [price] per period; the sentence: Your subscription renews automatically until cancelled. Manage or cancel it in your Apple ID subscription settings at least 24 hours before the current period ends; a Subscribe button that navigates to revenuecat://purchase?external_id=[userId]&product=[productId]; a Restore purchases text link to restoreinapppurchases://; a Manage subscription link to cancelinapppurchase://; small footer links to /terms and /privacy. Keep the layout simple, high contrast, buttons at least 44 px high, no claims not in this list.

Frequently asked questions

Does the price have to be in the app, or is App Store Connect enough?

In the app, on the paywall, before the purchase sheet. The StoreKit sheet repeats it, but reviewers want the disclosure on your screen.

Can I mention the web price in the app?

No. Comparing prices or pointing to a cheaper web plan inside the app is a 3.1.1 issue on top of 3.1.2. Keep web pricing on the web.

My subscription is managed by Stripe for existing users. Do they need to buy again in the app?

No. Unlock the entitlement from your backend for users who already pay on the web; that is allowed as long as the app itself offers IAP and does not link out to pay.

Three ways to get your app into the stores

Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.

Do it yourself

$109 per platform, one-time

The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.

See plans on the main page

Cloud Builder

$349 per license, one-time add-on

No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.

How the Cloud Builder works Try the free demo

Full Service

$698 per platform $798

Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.

Full Service details Powered by WeSetupYourWebViewApp

Winter Sale prices valid until December 31, 2026.

Ready to ship your app?

App Store & Google Play approval guarantee – or your money back within 14 days

Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.

Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.