All posts
PRICING

App Store subscription offer eligibility: who qualifies for introductory and promotional offers

Introductory offers, promotional offers, and offer codes each carry distinct eligibility rules. This post breaks down who qualifies for each, how to check eligibility in StoreKit 2, and how those rules should shape your paywall design.

By the AppsOps team · · 7 min read

Apple gives iOS subscription developers three distinct offer mechanisms — introductory offers, promotional offers, and offer codes — and each one has its own eligibility rules governing who can receive it. Get those rules wrong and you'll surface discounts to users who can't redeem them, create confusing paywall experiences, and leave money on the table from users who legitimately qualify for win-back pricing.

This post walks through the eligibility logic for each offer type, explains how to check eligibility at runtime using StoreKit 2, and covers the paywall design implications of each constraint.

The three offer types Apple provides

Before diving into eligibility, it helps to understand what Apple offers developers at a high level:

The eligibility rules for each type differ in who controls enforcement, how granular the targeting can be, and what developer effort is required. Conflating them is one of the most common implementation mistakes developers make when building subscription paywalls.

Introductory offer eligibility: the one-per-group rule

Apple enforces a single, firm rule for introductory offers: a customer is eligible for an introductory offer only if they have never previously redeemed one for any product in the same subscription group.

This deceptively simple rule has several downstream implications:

Architecture note: If you restructure your subscription group — for example, creating a new group to support a pricing overhaul — users who have never subscribed to any product in the new group are eligible for introductory offers there. This is occasionally used intentionally to restore trial eligibility for long-lapsed users, but it requires deliberate product architecture. Consult Apple’s subscription group documentation before restructuring groups for this purpose, as the group structure also affects upgrade and downgrade proration mechanics.

In StoreKit 2, eligibility checking is a first-class feature. The Product.SubscriptionInfo struct exposes an isEligibleForIntroductoryOffer property — an async computed value you can read before deciding which paywall variant to render. This is far more reliable than the StoreKit 1 approach, which required receipt parsing to infer eligibility and was prone to edge cases around receipt validation timing.

Promotional offer eligibility: current and lapsed subscribers only

Promotional offers are the win-back and retention lever. Unlike introductory offers — which Apple enforces centrally — your app is responsible for determining whether a user qualifies before presenting a promotional offer. Apple’s underlying requirement is that the user must be a current subscriber or have been a subscriber at some point in the past.

In practice, this means:

The eligibility enforcement mechanism is the server-signed offer signature. Your backend must generate a signed request — using your subscription key, a nonce, the user’s App Account Token, the product ID, and the offer ID — before the purchase can be initiated. This design is intentional: it ensures only your server can gate who receives promotional pricing, and it creates an audit trail you can use for analytics and compliance.

per subscription group per Apple ID — the hard cap on introductory offer redemptions that Apple enforces automatically

Offer types compared

Offer type Who qualifies Eligibility enforced by Redemption limit Primary use case
Introductory offer (free trial, pay-as-you-go, pay-up-front) Users who have not previously redeemed an intro offer in the subscription group Apple (automatic) Once per group per Apple ID First-time subscriber acquisition
Promotional offer Current or previously subscribed users Your server (signed request required) App-defined — you control the business logic Win-back campaigns, churn prevention, tier upgrades
Offer code (one-time use) Any user for custom codes; intro-eligible users for introductory-priced codes Apple + your distribution logic One redemption per code; batch codes allow per-user limits Influencer promotions, B2B distribution, QR campaigns

Checking eligibility in code: StoreKit 2 and the server API

Getting the eligibility check right is a prerequisite for showing the correct paywall variant. A production-grade implementation typically involves two checks:

Client-side introductory offer check (StoreKit 2):

  1. Load the subscription products using Product.products(for: productIdentifiers).
  2. For each product with an attached introductoryOffer, read product.subscription?.isEligibleForIntroductoryOffer.
  3. Display the trial CTA and pricing copy only if the result is true. For ineligible users, present the standard subscription price without a trial mention.

Server-side promotional offer check:

  1. On app launch (or when the user returns after a lapse), send the user’s App Account Token to your server.
  2. Your server queries the App Store Server API — specifically, GET /inApps/v1/subscriptions/{transactionId} — to retrieve the subscription history and confirm past subscriber status.
  3. If the user qualifies, your server generates a signed offer using the subscription key and returns it to the app so the promotional purchase can proceed.

For a detailed walkthrough of the App Store Server API authentication and query patterns, see the App Store Server API transaction verification guide. For the full promotional offer signing flow, the iOS subscription promotional offers post covers the key ID, nonce, timestamp, and signature construction step by step.

One common mistake in this flow: skipping the server-side check and relying entirely on the client-side isEligibleForIntroductoryOffer property to decide whether to surface a promotional offer. That property only reflects introductory offer eligibility — it says nothing about whether the user was ever a subscriber, which is what determines promotional offer eligibility.

Paywall design implications

Eligibility rules should drive your paywall variant logic proactively, not serve as error handling after a failed purchase attempt.

Match your CTA text to actual eligibility. Showing “Start free trial” to an ineligible user, then having the transaction fail with a confusing error, is a meaningful conversion killer. StoreKit 2 makes the check cheap — do it before rendering, not after the tap.

Design a distinct win-back variant. Lapsed users returning to your app represent a qualified, high-intent segment — they’ve already decided your product has value once. A paywall that acknowledges their history (“Welcome back — here’s 40% off your first month”) will generally outperform the generic acquisition paywall. Research published by Phiture on mobile re-engagement campaigns consistently highlights offer personalization as one of the highest-leverage variables for return conversion. RevenueCat has also noted in their engineering blog that win-back promotional offers tend to outperform generic price drops for lapsed subscriber segments.

Anchor on value, not price, for users ineligible for any offer. A user who is not eligible for a trial and has seen your subscription paywall multiple times needs a different conversion argument than a first-time visitor. Price anchoring (showing a crossed-out price next to the current price) is less effective here than outcome anchoring — what the user will be able to do, accomplish, or save with the subscription.

Test offer copy separately from offer mechanics. Whether you offer 7 days free or 14 days free changes trial-start rates; whether you say “7-day free trial” or “Try free for a week” also changes them, but independently. Subscription management SDKs like RevenueCat and Adapty provide remote paywall configuration that lets you run these copy experiments without shipping new builds — useful given that App Store review adds latency to any test that requires a code change.

For guidance on structuring offers sequentially across a user’s lifecycle, see the iOS subscription offer sequencing guide. And if you’re working through how to configure and manage offer pricing across markets, the AppsOps pricing tools provide territory-by-territory visibility into what each tier costs in local currency.

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