iOS subscription group architecture: designing your tiers before you ship
Your subscription group structure is permanent the moment a user buys. This guide covers how to design tiers, levels, and group boundaries correctly before launch — and what to do if you're already wrong.
When you create your first auto-renewable in-app purchase, Apple asks you to assign it to a subscription group. Most developers accept the default group name and move on. That decision — made in two seconds — quietly shapes how every future tier, duration, and pricing change will behave for the life of your app.
This guide walks through how to design your subscription architecture before you ship, how to avoid the structural mistakes that force painful migrations later, and how Apple's upgrade and downgrade proration rules interact with the group boundaries you draw today.
Why this matters on day one: Once a user is subscribed within a group, moving them to a product in a different group is not a prorated upgrade — it is a new, independent purchase. Apple provides no native tool to migrate subscribers between groups. Structural decisions made at setup cannot be undone without impacting existing subscribers.
What subscription groups actually control
Apple's App Store organizes auto-renewable subscriptions into subscription groups. Each group is a logical container governed by two hard rules that determine everything downstream from pricing to customer support:
- A subscriber can hold only one active subscription within a group at a time. Apple enforces mutual exclusivity at the group boundary.
- When a subscriber moves between products within the same group — say, from a monthly plan to an annual plan — Apple handles the transition as an upgrade, downgrade, or cross-grade and applies automatic proration. No custom server logic required.
Move a subscriber to a product in a different group and rule 2 vanishes entirely. There is no proration, no automatic cancellation of the old subscription, and no Apple-side awareness that a migration happened. The subscriber can end up holding two simultaneous active subscriptions — one from each group — each billing independently. That is not fraud; it is the designed behavior for apps that sell genuinely independent services. But it catches developers off guard when it was not the intent.
Understanding this distinction is the foundation of everything that follows.
One group per distinct service — not per price point
The most common architectural mistake is creating a new subscription group every time a plan variant is added. A developer builds "Pro Monthly," adds it to Group A. Six months later they add "Pro Annual" and, unsure where to put it, create Group B. Now a subscriber upgrading from monthly to annual falls outside Apple's proration system. The developer has to refund and re-subscribe them manually — a support nightmare.
The correct mental model: one group per service that users should have mutually exclusive access to. If your app offers one tier of service with multiple durations and price points, all of those products belong in one group. Multiple groups are warranted only in specific cases:
- Your app sells two completely independent add-ons that users can legitimately hold simultaneously — for example, a "Content Library" subscription and a "Live Coaching" subscription.
- You offer a family or household license that is genuinely a separate product, not a higher level of the individual plan.
- You have a legacy set of products you are deprecating and a new set for new subscribers, and you want to prevent accidental cross-group upgrades during the transition period.
For the vast majority of subscription apps — a SaaS-style iOS app with Free, Pro, and Business tiers at monthly and annual billing intervals — one group is the correct answer.
Structuring levels, durations, and upgrade paths within a group
Within a single group, each product has a subscription level: an integer you assign in App Store Connect that determines whether a transition is an upgrade, a downgrade, or a cross-grade. A subscriber moving to a higher-numbered level is upgrading; moving to a lower-numbered level is downgrading; moving between products at the same level is a cross-grade.
Apple applies meaningfully different proration rules to each transition type:
| Transition type | When it takes effect | Refund / credit |
|---|---|---|
| Upgrade (move to higher level) | Immediately | Prorated credit for unused days on old plan, applied to new plan |
| Downgrade (move to lower level) | At end of current billing period | No refund; subscriber retains access until current period expires |
| Cross-grade, same duration | Immediately | Prorated credit for unused days |
| Cross-grade, different duration (e.g., monthly → annual at same level) | At end of current billing period | No immediate refund or credit |
The practical implication for paywall design: upgrades feel seamless because they take effect immediately with credit applied. Downgrades feel slow because the subscriber waits until their next renewal date. If your retention strategy depends on users moving fluidly between tiers, design your level structure so that the transitions users are most likely to make in both directions are handled as upgrades or immediate cross-grades rather than delayed downgrades. For a deeper look at how this proration math affects LTV, see the iOS subscription upgrade and downgrade flows post.
A clean level assignment for a standard three-tier app (Basic, Pro, Business) might look like this:
- Basic Monthly — Level 1
- Basic Annual — Level 1
- Pro Monthly — Level 2
- Pro Annual — Level 2
- Business Monthly — Level 3
- Business Annual — Level 3
All six products live in one group. Moving from Basic Monthly to Pro Annual is an upgrade (Level 1 → Level 2) that takes effect immediately with credit for unused days of the Basic period. Moving from Business Annual to Pro Monthly is a downgrade (Level 3 → Level 2) that takes effect at the Business Annual renewal date. This is exactly the behavior most apps want.
Naming conventions and App Store Connect hygiene
Subscription group names and product reference names in App Store Connect are internal — they do not appear verbatim on paywalls or in receipts. But they determine how legible your dashboard is six months from now when you are debugging a billing issue at midnight.
- Group name: Use a noun describing the service, not the price. "AppsOps Pro Access" ages better than "Pro $9.99 Monthly Group." Prices change; the service does not.
- Product reference name: Include both the tier and the duration. "Pro Monthly (L2)" or "Business Annual (L3)" keeps App Store Connect readable when you have a dozen products across tiers.
- Product ID: Use a structured, hierarchical, price-agnostic format:
com.yourapp.pro.monthly. Never embed prices or currencies in product IDs.
Product IDs are permanent. Once a subscription product ID has been purchased by any user, it cannot be deleted or renamed in App Store Connect. Even if you retire the product and mark it inactive, the ID persists in all historical transaction records. Choosing a well-structured, price-agnostic product ID before your first subscriber is worth the few extra minutes of planning.
If you plan to use the App Store Connect API to automate pricing updates across regions — for example, to adjust prices quarterly in response to purchasing-power parity data — structured product IDs are especially valuable. Automation scripts can target products by pattern matching rather than a brittle hardcoded list. The price-update workflow with the App Store Connect API post covers how to build that kind of pipeline. And if you want to understand why currency-aligned prices matter in the first place, the AppsOps pricing tool maps your base price to PPP-adjusted tiers across every App Store territory.
A decision framework before you create any new product
Before creating any subscription product in App Store Connect, run through three questions. The answers determine both which group the product belongs to and which level to assign it within that group.
| Question | Yes | No |
|---|---|---|
| Can a subscriber legitimately hold this product and an existing product at the same time? | Create a separate group | Add to the existing group |
| Does this product grant more capability than an existing product in the same group? | Assign a higher level number than the lower-tier product | Assign the same level as its equivalent (cross-grade path) |
| Do you want users moving to this product from a lower-tier product to get immediate access? | Ensure it sits at a higher level (upgrade → immediate effect) | Consider whether a delayed cross-grade transition is acceptable |
Run every new product through this framework before hitting "Save." The few minutes of upfront planning will prevent the expensive alternative: discovering after your hundredth subscriber that two products which should share a group — and share Apple's proration system — were accidentally split across groups at launch.
What to do if your architecture is already wrong
Discovering a group design problem post-launch is common, especially for apps that shipped before a second pricing tier was planned. Options are limited but the situation is not hopeless:
- Deprecate and migrate new subscribers forward. Create the correct group structure for all new subscribers. Leave existing subscribers on the old group until they voluntarily upgrade or churn. This creates two subscriber populations to manage in your analytics but avoids forced billing changes to anyone already subscribed.
- Voluntary migration with incentives. Use promotional offer codes or win-back offers — where Apple's eligibility rules permit — to encourage existing subscribers to cancel their old plan and re-subscribe under the new structure. RevenueCat's engineering blog has documented cases where apps successfully migrated meaningful portions of their subscriber base using this approach.
- Manual case-by-case for very small bases. For apps with fewer than a few hundred active subscribers, manually processing refunds via Apple's refund tools and guiding individual users to re-subscribe can be practical. At any meaningful scale, it is not.
Apple does not provide a native bulk migration tool between groups. Prevention — getting the architecture right before your first subscriber — remains worth significantly more than any available remedy.
Sources and further reading
- Apple Developer Documentation: StoreKit — auto-renewable subscriptions, subscription groups, and proration rules
- Apple: In-App Purchase overview — subscription management and group configuration
- RevenueCat Blog — engineering posts on iOS subscription architecture, subscriber migration, and proration
- Apple Developer Documentation: App Store Connect API — managing subscription products and pricing programmatically
- Phiture — mobile growth consultancy research on subscription conversion and tier design
Share this post
Ready to put this into practice?
AppsOps is the first App Store ops dashboard — PPP-fair pricing for 175 App Store territories, AI metadata localization in 39 languages, AI screenshot localization for 14 Apple device classes, and one-click App Store Connect API push — all from one dashboard, all for $19/month.
Try AppsOps free — no card →