All posts
OPERATIONS

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.

By the AppsOps team · · 7 min read

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:

  1. A subscriber can hold only one active subscription within a group at a time. Apple enforces mutual exclusivity at the group boundary.
  2. 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:

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.

6subscription durations Apple supports per product: weekly, monthly, 2-month, 3-month, 6-month, and annual

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:

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.

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:

  1. 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.
  2. 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.
  3. 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

Share this post

Ready to put this into practice?

AppsOps is the first App Store ops dashboardPPP-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 →

Related reading