Plans and paywall.
Your plans, the stores' prices.
A plan is a subscription you sell to your users, for example "Pro" or "Max". You can offer up to four, each with a rank, its own allowances and its own store products per period. The paywall shows them with the prices the stores report; you never type a price. Every plan ships inactive, and plans are sold only through Google Play and App Store in-app purchase.
01How plans work
- One example plan ships: "Pro", rank 1, highlighted, inactive, sold monthly (
pro_monthly) and yearly (pro_yearly), with the allowances listed below and no ads. Rename it, change it, or add up to three more. - No price field anywhere. You create products with prices in Google Play Console and App Store Connect; the app reads the prices from the store in the user's currency.
- A plan is offered only when it is Active, sells at least one product, and Sell in-app purchases is on (Console → Store & purchases).
- Every allowance has a number. A plan is never unlimited.

02Ranks: what a plan unlocks
Each plan has a rank from 1 to 10 (unique). Anything in the console with a tier (chat models, image models, assistants, voices, video models, image edit models, caption styles, Discover briefs) is either free or the id of a plan. A user can use it when their plan's rank is at least that plan's rank. Example with "Plus" (rank 1) and "Max" (rank 2): a model with tier plus is open to Plus and Max users; a model with tier max only to Max users.
When a user taps something above their plan, the app opens the paywall with the cheapest plan that unlocks it selected. A plan that is still used as a tier cannot be removed or renamed; the console says where it is used.
03Plan fields
| Field | Rules | Shown in the app |
|---|---|---|
| Id | Lowercase letters, digits, - or _; free is reserved. Do not change it later. | No |
| Name, tagline | Up to 24 and 60 characters | Paywall, plan tabs, menu, Settings |
| Rank | 1–10, unique | No (decides access) |
| Highlight, colour | At most one highlighted plan; colour empty (accent) or #RRGGBB | Paywall |
| Store products | Per period (weekly, monthly, yearly, lifetime) and per platform (Android, iOS). Empty = not sold. Each id used once across all plans, Remove ads and credit packs. | The periods the plan sells |
| Trial days | 0–30; shown only when the store reports an introductory offer for the product | Paywall |
| Features | Up to 10 lines of up to 60 characters, each with an icon from a fixed set: sparkle, bolt, crown, star, check, chat, image, wand, video, captions, mic, speaker, news, file, cloud, shield, no_ads, palette | Paywall |
| Limits | Messages, images, image edits, natural-voice characters, transcription minutes and Discover briefs per day; AI video seconds and caption minutes per month. Example plan: 500, 50, 50, 100,000, 120, 100; 60, 60. | Paywall, Plan and usage |
| No ads | On = users of the plan see no ads | No ads |
| Active | On = offered for sale | — |
04Store products for each period
Each period of each plan is a separate product in each store. Use the same id on both platforms if you can; the console accepts different ids per platform.
| Period | Google Play | App Store |
|---|---|---|
| Weekly, monthly, yearly | One subscription per period, with one auto-renewing base plan of that period | An auto-renewable subscription of that duration; all periods of one plan in one subscription group |
| Lifetime | One-time product | Non-consumable |
Click by click: Google Play Console and App Store Connect.
05The discount ribbon
On the yearly card the app can show a ribbon such as "17% OFF" and the struck-through price of twelve months. Both are computed in the app from the store's own monthly and yearly prices of the same plan, so they always match what the store charges. There is no ribbon when either price is missing or the saving is under 5 %. You cannot type a discount.
06The paywall
Console → Paywall decides how and when it shows:
| Setting | Default |
|---|---|
| Layout: cards (side by side) or list (stacked rows) | Cards |
| Period selected first | Yearly (or the first period the plan sells) |
| Show on first launch / every n launches / when a free limit is reached | off / 0 (never) / on |
| Seconds before the close button appears (most 5) | 0 |
| Title, subtitle, line under the buttons | "Unlock everything", empty, "Cancel anytime." |
With more than one plan on sale, the paywall shows plan tabs. Below the plans it lists the credit packs and Remove ads, and it always has Restore purchases, Terms and Privacy. Nothing shows while purchases are off or no plan is active.



07Credit packs and Remove ads
- Credit packs S, M and L (product ids
credits_small,credits_medium,credits_large; 50, 200 and 600 credits by default): consumable, bought again and again. A verified pack is never credited twice. - Remove ads (
remove_ads): one-time, hides every ad.
Both are set on Console → Store & purchases and sold only while Sell in-app purchases is on.
08Start selling, step by step
- Plan the plansDecide names, ranks, which periods you sell and the allowances. Look at Usage & spend: an allowance should not cost you more in provider fees than the plan earns.
- Create the store productsIn Play Console and App Store Connect, with the prices you want (click paths).
- Set up verificationStore keys in Console → Store & purchases (In-app purchases).
- Enter the plansConsole → Plans: product ids per period and platform, features, limits, rank, Active. Then Paywall.
- Switch onConsole → Store & purchases → Sell in-app purchases on. Save. Status → "Plans are sellable" should pass.
- TestWith licence testers (Android) and a sandbox account on TestFlight (iOS) before you go live.