โ† All articles

How App Store Offer Codes Work for iOS Subscriptions

App Store offer codes give away free or discounted iOS subscriptions to press, testers, and promos. How to create, distribute, and redeem them in your app.

How App Store Offer Codes Work for iOS Subscriptions

App Store offer codes let you give someone an auto-renewable subscription for free or at a discount, distributed outside the App Store: over email, on social, to press, or to beta testers. You configure the offer on a subscription in App Store Connect, generate the codes, and the customer redeems one either through a link or a redemption sheet inside your app. Redemption flows through StoreKit like any other purchase, so the customer's entitlement unlocks automatically.

This post explains what offer codes are, how they differ from the older promo codes people confuse them with, the two code types, how to create and distribute them, and how to add in-app redemption so a code you hand out actually unlocks your app.

On this page

What App Store offer codes are

An offer code is a redeemable code tied to a subscription offer: a free period, a discounted period, or a pay-up-front deal that you attach to one of your auto-renewable subscriptions. Unlike an introductory offer that appears automatically on your paywall, an offer code is something you hand out deliberately, which makes it the right tool for press access, influencer trials, refund goodwill, contest prizes, or thanking beta testers.

Two things make offer codes more flexible than a plain free trial. You control who gets one, because you distribute the codes yourself. And you can target existing and lapsed subscribers, not just new ones, so a win-back campaign for churned customers is possible in a way an introductory offer (new subscribers only) is not. If you want the free-trial mechanics for comparison, see how to add a free trial to an iOS subscription.

Offer codes vs promo codes

These get conflated constantly, and they are different features:

  • Promo codes are the older mechanism for giving away a paid app or a one-time in-app purchase for free. Each app version gets a limited batch, and they are meant for reviewers and giveaways of non-subscription content.
  • Offer codes are specifically for auto-renewable subscriptions, and they can grant free or discounted subscription periods with far higher volume and more control over eligibility and duration.

If you sell a subscription, offer codes are almost always what you want. Promo codes do not apply to auto-renewable subscriptions at all.

One-time use codes vs custom codes

When you generate offer codes, App Store Connect gives you two formats for the same underlying offer:

  • One-time use codes. A batch of unique codes, each redeemable exactly once, downloadable as a CSV. Use these when you want to hand a distinct code to each recipient (a press list, individual DMs) and make sure a code cannot be shared and reused.
  • Custom codes. A single memorable code, like LAUNCH, that many people redeem, with a total redemption cap and an expiration date. Use these for a public campaign where one shareable code is the point.

Both draw from the same offer configuration, so the free-or-discounted terms are identical; only the distribution model differs. Apple enforces limits on how many codes you can generate per quarter, so check the current caps in App Store Connect when planning a large campaign.

Creating offer codes in App Store Connect

Offer codes hang off a subscription that already exists, so the product, its group, and its price have to be set up first. In App Store Connect, open the subscription and create an offer code offer, then configure:

  1. Reference name and the offer terms (free, pay as you go, or pay up front) and the duration.
  2. Eligibility: new subscribers, existing subscribers, or expired/lapsed subscribers. This is where offer codes beat introductory offers, since you can target people who already churned.
  3. Territories where the offer is valid.
  4. The code type: generate a batch of one-time codes (download the CSV) or define a custom code with a cap and expiry.

Once generated, a code can be redeemed two ways: through a redemption URL, or through a sheet you present inside your app. The URL format is:

https://apps.apple.com/redeem?ctx=offercodes&id=YOUR_APP_APPLE_ID&code=YOUR_CODE

Replace YOUR_APP_APPLE_ID with your app's numeric Apple ID and YOUR_CODE with the code. Opening that link takes the customer straight to the App Store redemption sheet.

Redeeming a code in your app

You should also offer in-app redemption, so a customer with a code never has to leave your app. StoreKit 2 presents Apple's redemption sheet for you:

import StoreKit
import UIKit
 
@MainActor
func presentOfferCodeRedeemSheet() async {
    guard let scene = UIApplication.shared.connectedScenes
        .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
    else {
        return
    }
 
    do {
        try await AppStore.presentOfferCodeRedeemSheet(in: scene)
    } catch {
        // The customer dismissed the sheet, or it failed to present.
    }
}

The redemption itself produces a normal transaction, which means you do not process it specially. As long as you are listening to Transaction.updates, the redeemed subscription unlocks access the same way a purchase would:

// Start this once, early in app launch, and keep it running for the app's life.
func observeTransactions() -> Task<Void, Never> {
    Task.detached {
        for await update in Transaction.updates {
            if case .verified(let transaction) = update {
                // A code redemption arrives here just like a purchase.
                await MyEntitlements.refresh()
                await transaction.finish()
            }
        }
    }
}

With RevenueCat, the redeemed offer shows up in customerInfo on the next fetch, and RevenueCat also provides a helper to present the redemption sheet on iOS. Either way, your entitlement check stays the same. The subscriptions with RevenueCat post covers that setup.

Common gotchas

  • Offer codes are not promo codes. If you tried to give away a subscription with the app-version promo codes and it did not work, that is why. Subscriptions need offer codes.
  • The subscription must exist first. You cannot generate codes for a subscription that is not configured with a price and group. Set the product up before the campaign.
  • Listen to Transaction.updates. A code redeemed through the URL or the system sheet arrives as a transaction outside your purchase button. If you only unlock access inside the purchase completion handler, a redeemed code will not unlock anything.
  • Mind the quarterly limits. Apple caps code generation, so a large public giveaway can hit the ceiling. Plan custom-code caps and batch sizes against the current limits in App Store Connect.
  • Eligibility is yours to set. A code configured for new subscribers only will silently fail for someone who already subscribed. Match the eligibility to who you are sending it to.

FAQ

What is an App Store offer code?

It is a redeemable code that grants a free or discounted period on one of your auto-renewable subscriptions. You configure the offer in App Store Connect, generate codes, and distribute them yourself over any channel, and the customer redeems one to unlock the subscription.

What is the difference between offer codes and promo codes?

Promo codes give away paid apps or one-time in-app purchases and come in small per-version batches. Offer codes are specifically for auto-renewable subscriptions, support free or discounted terms, and offer far more volume and eligibility control. For a subscription, use offer codes.

Can I give a free subscription to lapsed subscribers?

Yes. Offer codes let you target new, existing, or expired subscribers, so a win-back offer for churned customers is possible. An introductory offer cannot do this, because it is limited to new subscribers.

How does a customer redeem an offer code?

Through a redemption URL that opens the App Store sheet, or through an in-app sheet you present with AppStore.presentOfferCodeRedeemSheet(in:). Both produce a normal transaction that unlocks the subscription.

Do I need extra code to handle a redeemed offer?

No special handling, but you must be listening to Transaction.updates. A redeemed code arrives as a transaction outside your purchase flow, so if you only react inside the purchase button's completion, the redemption will not unlock access.

How many offer codes can I create?

Apple enforces quarterly limits on code generation, and custom codes have their own redemption caps and expiration. The exact numbers are shown in App Store Connect, so check them there before planning a large campaign.


Offer codes only work once the subscription they attach to is fully configured: the product, its group, its price in every market, and a paywall that reflects the entitlement. That setup is exactly what Spaceport automates. It creates and prices your subscription products in App Store Connect through the API, matches them in RevenueCat, and generates a SwiftUI project with the paywall, purchase, and restore flow already wired in, so adding an offer-code campaign later is a configuration step on products that already exist rather than a from-scratch integration. And when you are lining up a waitlist and launch-day audience for the app, our sister tool Lighthouse covers that side.

From an indie iOS dev, for indie iOS devs.

Read more at spaceport.build

Community appsJoin Discord