How to run a holiday sale in App Store Connect for iOS subscription apps
Make sure your subscription apps are ready for Black Friday and Christmas sale season.
Black Friday and Cyber Monday are right around the corner, which means it’s time to make sure you have a marketing plan to take advantage of one of the biggest sales events of the year!
Running temporary sales for subscription apps on the App Store can be a little bit confusing however. Unlike a paid up front app, you can’t simply lower your price in App Store Connect and then raise it again after the sale is over because this will lower the price for all of your existing customers as well!
Lets walk through your options and what the tradeoffs for each are.
Update your existing product Introductory Offer
By far the easiest method to run a sale for a subscription app is to add or update an introductory offer for your existing subscription product. An introductory offer allows new customers to automatically receive a discount or free trial for a specified duration, and then that user will automatically renew at your standard price unless the customer cancels their subscription before the introductory offer expires.
Advantages
- Extremely easy to set up in App Store Connect
- Customers will automatically renew at your normal price
- No confusing hidden products showing up on your App Store page or in the iOS subscription settings
Limitations
- Only works for new customers
- Will apply to everyone who downloads the app, not just users you acquire through marketing
- Only supports temporary discounts (you cannot run a campaign that allows customers to lock in at a lower price)
Setting up your sale with an Introductory Offer in App Store Connect is pretty straightforward. First go to the “Subscription” page, select your subscription group, and then select the subscription product you want to discount. From here click the “View all Subscription Pricing” button in the “Subscription Prices” section.
From here you can select the “Introductory Offers” tab and you will have the ability to create a new introductory offer or end an existing one. If you have an existing introductory offer and schedule a new one, the existing offer will end when the new offer is scheduled to begin. You can then schedule another introductory offer to reset back to your presale settings once your sale is scheduled to end.
Marketing your introductory offer
Once you have your introductory offer set up, users will begin seeing your discounted price or free trial at the scheduled time, but they won’t have any indication there’s a sale. You can, of course, run external marketing campaigns to message out the discounted price, but you can also message the sale in the app with a custom paywall.
A custom paywall will make it clear to users you’ve reached through marketing channels that they are indeed receiving the sale discount. It will also message to users who download the app through the store that there is a limited time offer, and could increase your conversion rate.
Due to app review, you cannot rely on manually updating your code to start and end your custom paywall. You could set up your sales paywall to start and stop showing automatically based on a hardcoded date, but this is pretty limiting. We recommend using a backend to determine which paywall is shown.
If you use RevenueCat Paywalls, you can easily build a custom paywall for your sale and switch the default offering to the offering with your custom paywall to immediately start showing it to users in your app. If you were already using RevenueCat Paywalls for your presale offerings then setting up this sale requires no code changes at all!
If you use RevenueCat’s SDK but have a custom paywall, Offering Metadata is the perfect solution for you. Simply add a field to your metadata JSON to specify which paywall you want to be shown, and then in your app check that metadata property to decide which paywall to render. To start and stop your sale paywall, you simply need to change this one JSON property in your Offering Metadata.
Limitations of introductory offers
There are a few limitations with using introductory offers to be aware of. Users can only use one introductory offer for a subscription group for all time. That means, for example, users who have previously used a free trial set up on your product in the past will not be eligible for your sale. To create offers for previous or current subscribers, you can use Promotional Offers which are a bit more complicated. We won’t get into that in this post, but you can find out more in our guide to Signing iOS Subscription Offers.
You will want to make sure your marketing copy reflects the fact that only new subscribers will be eligible. You could also check the user’s trial eligibility to update your custom paywall copy based on whether the user is eligible for your sale price. You’ll also need to ensure your paywall UI will update correctly based on each product’s introductory offer. For example, if you add an introductory offer for $1.99 for the first 6 months you’ll need to ensure your paywall copy reflects these terms correctly.
Another limitation to using introductory offers is that all eligible users will receive this sale price, not just users you’ve acquired through other marketing channels. This may be the behavior you want, but if you want an offer only for users who’ve seen marketing such as an email or social post you may want to use something like Custom Offer Codes.
It’s also important to note that introductory offers are … introductory, meaning you’re limited to only discounts or trials for a period of time before users are automatically renewed at the standard price. This is usually exactly what you want, but if you wanted to run a sale where users could lock in at a discounted price, introductory offers are not a viable solution.
Custom Offer Codes
Another option for running a holiday sale is using Custom Offer Codes. These are similar to one-time promo codes you may have used in the past but with a few key differences.
You can generate a single custom offer code to enable a subscription for free or discounted for a configurable duration. This code can then be distributed through external channels and used by multiple users either by typing in a code in your app, or by following a link through a URL or QR code.
Advantages
- Relatively easy to set up codes in App Store Connect
- Customers will automatically renew at your standard price when the offer expires
- Works for new, existing, and previous customers
- Can be limited to only customers acquired through your external marketing channels
- Can be combined with introductory offers
- No confusing hidden products showing up on your App Store page or in the iOS subscription settings
Limitations
- Must be redeemed through code or link, cannot automatically apply to all customers who see your paywall
- Redemption process can be a little clunky
- Only supports temporary discounts (you cannot run a campaign that allows customers to lock in at a lower price)
Custom offer codes are more flexible than just introductory offers, but require a little more work to distribute them outside of the app store. The initial setup is extremely straightforward. In App Store Connect, go to the “Subscription” page, select your subscription group, and then select the subscription product you want to create a custom offer code for. From here click the “View all Subscription Pricing” button in the “Subscription Prices” section.
Click on the “Offer Codes” tab and you will have the option to configure and create an offer code. You can decide whether to enable them for new, existing, or expired subscribers (or any combination), duration, and price (or free).
Once your offer code is created, select it and you’ll have the option to create custom codes. You can configure an expiration date as well as the maximum number of redemptions the code will allow.
Once you have a code there are two ways for users to redeem it.
One is to implement Apple’s in-app redemption sheet in your app. This is a button in your app UI that users can tap and pop up a modal where they can type in your redemption code. It’s important to note that this API has proven to be pretty unstable since Apple has released it. Sometimes it fails to connect, does not dismiss correctly, and even rejects valid codes. It’s also pretty inconsistent in the sandbox environment which can make testing tricky.
The second, more reliable option is to create a URL that redirects to the App Store app for redemption. This URL can be shared from any external marketing either as a link or turned into a QR code for scanning from phones. To create a shareable URL, find the “Offer Code URL” on your offer code page and replace “CODE” with the custom code you just created.
Custom offer codes are a great option for marketing sales through external channels. They’re also really great for other external marketing opportunities like influencer campaigns or physical distribution with QR codes at live events like conferences.
Limitations of offer codes
The main limitation of custom offer codes is that they are distributed externally from your app. When a user downloads your app from the app store, they will still get your normal paywall and will not see your sale. You could theoretically add a button in your app that opens an offer code URL but that experience may not be ideal for users or have the best conversion. But let me know if you try this because I’ve never actually seen this done before myself!
It’s also worth mentioning that, like introductory offers, custom offer codes are only useful for temporary discounts. Users will auto-renew at your standard price and there is not an option to lock users into a discounted rate long term.
Create a new product
The most extreme option for running a temporary holiday sale is to create an entirely new subscription product to offer users during your sale.
Advantages
- Supports long-term discounts users can be locked into
- Fully customizable with unique introductory offers and durations
- Creates a trackable cohort for users subscribed to the sale product
- Potentially automatic win-back campaign for people about to cancel your app
- Will be shown to all users who download the app during the sale period
- Can limit to only users acquired through external marketing channels
Limitations
- Much more complicated to create brand new products and maintain them over the life of your app
- Users will not auto-renew at your standard price after a period of time
- Users may see this product in your App Store page and in their iOS subscription management page even after your sale is over (if you add the product to the same subscription group)
If you want to run a sale where users can get a discounted rate and lock in at that rate for renewals in the future, creating a new subscription product is your only option. This can be cumbersome however, because these products must now live on forever.
Just like I outlined above for Introductory Offers, you can create custom paywalls using RevenueCat Paywalls or manually to market your limited time sale in the app. This can be controlled very easily from the backend simply by creating a new offer with your sale product(s) included and setting that offer to be your default offer for the duration of the sale.
If you wanted to limit this sale to only users acquired through external marketing channels, you could leave your default offer set to the non-sale products, and then create a deep link into your app that triggers a paywall to render using your sale offer. This would mean normal users coming from the App Store will not see your sale paywall, but users coming in through a deep link from email, social, ect would see your sale paywall.
One often-cited drawback to creating multiple products for subscription apps on the App Store is that users can see all products inside of a subscription group, and even switch between them, when they go into their iOS Subscriptions management page. This means a user on your non-sale plan could switch to your sale plan even if you’re not actively running that sale and showing that option inside of your app.
You can avoid this problem altogether by creating a new subscription group for each sale you run. You will need to duplicate all of your products for each subscription, which can be a bit cumbersome. There is a potential advantage to using a single subscription group to think about though.
Most users who go into their iOS subscription page for your app are most likely there to cancel their subscription. Having a discount available on that page may actually act as a pseudo win-back campaign, giving them an incentive to take a lower price instead of churning completely. Whether this is a good idea for your app is obviously unique for each business, but I don’t think it’s 100% a drawback like it might appear at first glance.
Another advantage to creating a unique product for your sale is that you will have an easy to segment cohort of users from your sale. This makes it trivial to see if users acquired during your sale have a higher or lower churn rate, more or less app usage, or any other behaviors you may be interested in. This is metadata you could track in other ways however so I don’t think it’s a major pro for this method.
Ultimately, this approach is the most flexible, but also the most difficult. It’s a lot of overhead up front, and long term to maintain these extra products. It can become difficult to scale if you’re running a lot of different sales over time. We recommend creating products for different discount rates (20%, 30%, ect) and reusing those products for different sales.
Conclusion
Ultimately, the best method to run a limited time holiday sale for your app is going to depend on your needs. Personally I’m going to lean toward Introductory Offers if I want the sale to be visible inside of the app, and Custom Offer Codes if I want to make them exclusive to users I acquire through external marketing.
The most important thing is to have a strategy, implement it, and then measure the results. Experiment with different approaches and learn what works best for your business.
If you’ve run sales using a different approach than I’ve outlined here, or there are advantages or limitations I’m missing, please let me know! I plan on updating this post from time to time as I find new approaches or Apple introduces new capabilities in the App Store.
You might also like
- Blog post
“A big market is great only if you can take a substantial share of it” — Patrick Falzon, The App Shop
On the podcast: estimating the revenue potential of an app, crafting an exit strategy, and why LTV is such a terrible metric.
- Blog post
Effective testing strategies for low-traffic apps
Is A/B testing off the table? Let’s rethink experimentation.
- Blog post
The essential guide to paywalls for subscription apps
Why your paywall may be costing you subscribers (and how to fix it)