iOS Subscription Offers

Implementing iOS Subscription Offers with Purchases SDK


This guide assumes you already have your iOS products set up in App Store Connect.

In iOS 12.2, Apple announced a new feature for subscription developers called “Subscription Offers.” Subscription Offers allow developers to apply custom pricing and trials to existing and lapsed subscriptions.

Subscription Offers are supported in the Purchases SDK, but require some additional setup first in App Store Connect and the RevenueCat dashboard.

Types of Subscription Offers

Offer Type

Applies To

Subscription Key Required


Introductory Offers

New Users

SDK applies offer to purchases automatically

Promotional Offers

Existing and Lapsed Users

Not applied automatically, see implementation guide below

Offer Codes

New and Existing Users

Requires iOS SDK 3.8.0+, see implementation guide below

⚠️ Not recommended
In-App Purchase Promo Codes

New and Existing Users

Treated as a regular purchase, revenue will not be accurate in Charts and Integrations due to Apple/StoreKit limitations. Codes don't auto-renew, aren't compatible with presentCodeRedemptionSheet, restricted to non-commercial use, and restricted to 1,000 codes every 6 months.

Subscription Keys

For RevenueCat to securely authenticate and validate a Subscription Offer request with Apple, you'll need to upload a Subscription Key.


Introductory Offers

A Subscription Key is not required for Introductory Offers, only for Promotional Offers and Offer Codes. The Purchases SDK will automatically apply an introductory offer to a purchase. Documentation for reference.

1. Generating a Subscription Key

Subscription keys are generated in the Users and Access section of App Store Connect, and you can use the same subscription key for all of your offers.

Click Generate Subscription Key, you'll be prompted to enter a name for the key.

Once your key is generated, it will appear in Active Keys and you get one shot to download it.

Click Download API Key and store the file in a safe place, you'll need to upload this to RevenueCat in the next step.

2. Uploading the Subscription Key to RevenueCat

Once everything is set up in App Store Connect, you need to upload the Subscription Key from the previous step to RevenueCat. RevenueCat will handle all the server-side authentication and validation of the Subscription Offers.

In the RevenueCat dashboard, select your app from the Apps tab in your project settings.

Within your app settings, under the tab In-app purchase key configuration, you'll see an area to upload your Subscription Key .p8 file that you downloaded from App Store Connect.

Promotional Offers

1. Configure the Offer in App Store Connect

Promotional Offers are created from within App Store Connect and are included as a pricing option to an existing subscription product. When you click the "+" option next to Subscription Prices, you'll see an option to Create Promotional Offer.

Subscription Offers are created as new pricing options in App Store ConnectSubscription Offers are created as new pricing options in App Store Connect

Subscription Offers are created as new pricing options in App Store Connect

To create the offer there are two fields that you need to specify: Reference Name, which is just used for your reference, and the Promotional Offer Product Code, which is what you will actually use to activate a specific offer in your app.

On the next screen you'll select the type of offer you wish to provide. Just like introductory offers, there are three types of Promotional Offers:

  1. Pay-up-front — The customer pays once for a period of time, e.g. $0.99 for 3 months. Allowed durations are 1, 2, 3, 6 and 12 months.
  2. Pay-as-you-go — The customer pays a reduced rate, each period, for a number of periods, e.g. $0.99 per month for 3 months. Allowed durations are 1-12 months. Can only be specified in months.
  3. Free — This is analogous to a free trial, the user receives 1 of a specified period free. The allowed durations are 3 days, 1 week, 2 weeks, 1 month, 2 months, 3 months, 6 months, and 1 year.


Don't forget to click Save in the upper right after you configure the offer.

2. Show the Promotional Offer to Desired Users

It's up to you to decide which users you want to present a Promotional Offer to. The only eligibility requirements are that the user had (or currently has) an active subscription. Apple automatically enforces this requirement for you - if it's not met users will be shown the regular product regardless of the offer you try to present.

Fetch the Payment Discount

Before you can present a Promotional Offer to a user, you first need to fetch the SKPaymentDiscount. This is done by passing the SKProductDiscount and SKProduct to the .paymentDiscount method, which uses the Subscription Key from Step 2 to validate the discount.

Purchases.shared.paymentDiscount(for: product.discounts[0], product: product, completion: { (discount, error) in
    if let paymentDiscount = discount {
        // Payment discount fetched
[RCPurchases.sharedPurchases paymentDiscountForProductDiscount:product.discounts[0] product:product completion:^(SKPaymentDiscount * _Nullable discount, NSError * _Nullable error) {
    if (discount) {
    // Payment discount fetched
const paymentDiscount = await Purchases.getPaymentDiscount(product, product.discounts[0]);
if (paymentDiscount) {
    // Payment discount fetched

Purchase the Product Discount

After successfully fetching the SKPaymentDiscount, you can now display the Promotional Offer to the user however you'd like. If the user chooses to purchase, pass an SKProduct and SKPaymentDiscount to the .purchasePackage method.

Purchases.shared.purchasePackage(package, discount: paymentDiscount, { (transaction, purchaserInfo, error, cancelled) in
    if purchaserInfo?.entitlements.all["your_entitlement_id"]?.isActive == true {
        // Unlock that great "pro" content
[RCPurchases.sharedPurchases purchasePackage:package withDiscount:discount completionBlock:^(SKPaymentTransaction * _Nullable transaction, RCPurchaserInfo * _Nullable purchaserInfo, NSError * _Nullable error, BOOL userCancelled) {
  if (purchaserInfo.entitlements["your_entitlement_id"].isActive) {
    // Unlock that great "pro" content    
const purchaseMade = await Purchases.purchaseDiscountedPackage(package, paymentDiscount);

Offer Codes

With iOS 14, Apple announced a new feature for subscription developers called “Offer Codes.” Offer Codes allow developers to offer custom pricing and trials, in the form of a redeemable code, to their customers.

1. Configuring an Offer Code

Offer Codes are configured similarly to Subscription Offers in App Store Connect.

2. Redeeming an Offer Code

To allow your users to redeem Offer Codes, you'll need to present the Offer Code redemption sheet. In Purchases SDK 3.8.0, you can call the presentCodeRedemptionSheet method.



The Offer Code redemption sheet may not display on a device if you haven't yet launched the App Store app and accepted the terms agreement.


  • Due to limitations of available information on Offer Codes, accurate revenue tracking is not yet supported in the RevenueCat dashboard. All Offer Codes are assumed to be $0 transactions.

Next Steps

  • For a guided walkthrough of implementing Subscription Offers into a Swift app check out our blog

Did this page help you?