Holiday season is one of the most powerful times of year to attract new subscribers, re-engage lapsed customers, and strengthen the relationship with your existing audience. Between Black Friday, Cyber Monday, Christmas shopping and New Year Sales, consumers are on the hunt for deals. If you’re an Android developer with a subscription-based app, you can use Google Play’s offer tools to create a compelling holiday promotion that boosts conversions and lifetime value (LTV).
This guide walks you through every step of creating, launching, and analyzing a holiday subscription offer using the Google Play Console and RevenueCat.
Note
This guide follows the same logic as RevenueCat's subscription offers documentation but is designed specifically for seasonal campaigns.
Overview of Google Play subscriptions
Let’s first refresh our minds on how subscriptions work in Google Play Store.
In Google Play Store, every subscription can have multiple base plans, which in turn can have multiple offers. Base plans define the subscription billing period (monthly, yearly), renewal type (auto-renewing, prepaid), and the price. Offers define the discount available to users matching the eligibility criteria. Offers can only be configured for auto-renewing offers.
Each subscription in Google Play Store can create a combined total of 250 base plans and offers, with a maximum of 50 being active at the same time.

Two ways to run a sale on Google Play
Before diving deeper, it’s important to understand that Google Play provides two primary mechanisms for running discounted subscription promotions:
1. Offer phases
Use the standard offer system inside Google Play subscriptions. Each offer can include up to two phases (free trial, introductory pricing, discounted billing cycles). These are best for broad, paywall-visible sales where your goal is to drive conversions directly through the subscription product configuration.
2. Promo codes
Codes that unlock a free trial or access to a subscription. Promo codes are redeemed manually by the user. They’re best for targeted, limited-quantity, partner-driven, or community-driven campaigns where you want tight control over who can redeem the offer.
Planning your holiday offer
A strong campaign begins with clear goals and a defined audience. Before you touch Google Play Console, decide what success looks like for your app.
Defining your goals
Ask yourself what you’re trying to accomplish. Do you want to acquire new users? Reactivate past subscribers? Reward loyal customers? Each goal requires a different setup. For example, acquisition offers target users who have not subscribed before, while developer-determined offers can re-engage lapsed ones.
Holiday timing also matters. Some apps see their biggest lift during Black Friday weekend, while others benefit from the post-Christmas days when people are setting up new devices. Map out a timeline and plan your offers around it, whether that’s install-to-trial conversion, first renewal rate, or total recurring revenue.
Choosing between Offer Phases and Promo Codes based on your goal
- If your goal is maximum conversion from new users during a big holiday event (e.g., Black Friday), then use Offer phases. These appear directly on your paywall and require no code entry. They scale well for large-volume campaigns.
- If your goal is targeted reactivation, gifting, influencer partnerships, or limited-edition holiday bonuses, then Promo codes may be the better tool. They give you full control over distribution, but require more user effort and don’t automatically appear on the paywall.
Promo codes and offer phases can coexist in the same campaign, but most apps will rely on offer phases as the default mechanism for holiday sales.
Segmenting your audience using eligibility criteria
Eligibility rules apply specifically to subscription offers created using Offer Phases. They determine which users will see a given offer inside the subscription options returned by Play Billing and RevenueCat. Promo codes bypass eligibility checks because the user explicitly redeems them.

New customer acquisition: With this eligibility criterion, Google Play determines if a customer is eligible to receive the offer. You can configure this to check for customers who have never had this particular subscription to your app, or customers who have never had any subscription to your app. If Google Play determines a customer is not eligible, the offer will not show up in the subscriptionOptions of the StoreProduct in the SDK at all.
Upgrade: This eligibility criterion is the inverse of the previous one. Customers are only eligible if they currently have another subscription of your product, and you can configure in detail what products this offer applies to. Again, if Google Play determines a customer is not eligible, the offer will not show up in the subscriptionOptions of the StoreProduct in the SDK at all.
Developer determined: Offers with this eligibility criterion will always show up in the subscriptionOptions of the StoreProduct in the SDK, and you are responsible for determining whether or not to apply the offer to a customer. If you are relying on the RevenueCat SDK automatically applying free trials and introductory periods and you do not want a developer determined offer to be automatically selected, apply the tag rc-ignore-offer to the offer.

Offer phases
Offer phases are one of the two main tools for running a Google Play sale. They let you create up to two sequential discounted billing periods, such as a free trial followed by introductory pricing before the subscription resumes its normal base plan price. Offer phases are ideal for large seasonal sales because they appear automatically on your paywall and scale effortlessly to all eligible users.
Decide whether your holiday deal will be a short-term discount or a longer phased pricing plan. A big one month discount can drive conversions, but a phased offer plan may improve retention.
Promo codes
Play console also allows developers to create codes that are redeemable for one-time products or as trials to subscriptions. There are two types of promo codes.
- One-time codes are unique, auto-generated by the Google Play console, and limited to a single-use
- Custom codes are codes created by the developer which are redeemable as many times as the developer allows
Good to know
This guide will not cover creating promo codes, but our documentation on that is a good source for doing these correctly. Read more about redeeming promo codes here.

Setting up a holiday offer in Google Play Console
Once your goals and audience are clear, the next step is to create the offer in Google Play Console. The entire configuration happens there, and once you are familiar with the workflow, each new offer only takes a few minutes to create.
Step 1: Configure your base plan
Every subscription offer must belong to a base plan. A base plan defines the underlying product ID, billing period, and standard pricing that your offer will temporarily override.
In Play Console, open Monetization → Subscriptions, choose your subscription product, and verify that your base plan is active in all regions where you intend to run the holiday promotion.
If you want to isolate campaign results, consider creating a separate base plan named something like premium-holiday2025. This lets you switch back to your standard base plan later without affecting other configurations.

Step 2: Create a new offer
Under your chosen base plan, click Add offer. Give the offer a descriptive and human-readable ID such as holiday-2025-blackfriday or holiday-2025-reactivation. Clear naming matters because you will see this ID in RevenueCat dashboards, cohort exports, and logs.

Once created, the offer lives under that base plan and can be toggled on or off without deleting it, allowing easy reuse for future events.
Step 3: Define eligibility
As mentioned in the planning section, Google Play provides three core eligibility rules, which control who can redeem your offer:
- New customer acquisition: only users who have never subscribed to this product can redeem it — perfect for first-time installs during your holiday user-acquisition blitz
- Upgrade: for customers moving from a lower tier or a legacy subscription to a higher-value plan
- Developer determined: you decide in-app who qualifies — this is ideal for re-engaging churned subscribers or rewarding loyal users

For holiday campaigns, ‘New customer acquisition’ often performs best for growth, while ‘Developer determined’ gives maximum flexibility for reactivation deals. To enforce developer-determined eligibility, your app checks conditions through the Play Billing Library before showing the discounted SKU. E.g., if a user canceled more than 60 days ago, you can programmatically make them eligible for the holiday-2025-reactivate offer.
Step 4: Set pricing phases
A single offer can include up to two pricing phases, letting you script how the price changes over time. For example:
- Phase one might be a one month free trial
- Phase two can ease the user back toward the standard price, e.g. 50% off for January, before auto-transitioning to the base plan price in February
These phases make it possible to reward early adopters without locking in low pricing permanently.

When editing a phase, specify both the price and duration (in billing cycles). Remember that each phase must be at least one billing period long. Preview the total charge sequence in the summary view before publishing.
Step 5: Add tags and metadata
Tags are optional but highly recommended. They allow you to track performance later in RevenueCat and the Play Console reports. Use concise, consistent tags like holiday-sale, black-friday, or q4-2025.

Within RevenueCat, you will see these tags alongside each transaction, making it easy to filter cohorts or compare, e.g. black-friday versus standard-offer revenue.
Step 7: Integrate and test with RevenueCat
Finally, ensure your app recognizes the new offer. In your RevenueCat setup, reference it through the SDK’s subscriptionOptions so that the correct price and offer period appear on the paywall.
1val basePlan = storeProduct.subscriptionOptions?.basePlan
2val freeTrialOffer = storeProduct.subscriptionOptions?.freeTrial
3val introductoryOffer = storeProduct.subscriptionOptions?.introOffer
4val offerForLapsedCustomers = storeProduct.subscriptionOptions?.withTag("lapsed-customers").first()
5
6// For example, to purchase the offer for lapsed customers directly, you would then use the following code
7Purchases.sharedInstance.purchaseWith(
8 PurchaseParams.Builder(requireActivity(), offerForLapsedCustomers).build(),
9 onError = { error, userCancelled ->
10 ...
11 },
12 onSuccess = { storeTransaction, customerInfo ->
13 ...
14 }
15)
Use test accounts in the Play Console’s license testing section to confirm eligibility logic, pricing-phase transitions, and analytics tagging before launch.
RevenueCat’s sandbox environment mirrors the offer structure, so you can verify that events like “Initial Purchase” and “Renewal – Offer Phase 2” appear as expected.
Once everything checks out, publish the offer and sync your paywall assets so users see the new holiday pricing immediately.
Marketing your introductory offer
Once you have your offers 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 your best bet is to message about the sale in the app using a custom paywall.
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 within the app. If you were already using RevenueCat Paywalls for your presale offerings then setting up this sale requires no code changes at all.
When using RevenueCat’s SDK with 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.

Wrapping up 🎁
Holiday promotions on Google Play are one of the easiest and most effective ways to grow subscription revenue when consumer attention is at its peak. Planning early, defining clear goals, and using Google Play’s offer tools together with RevenueCat’s analytics, you can turn a seasonal discount into long-term subscribers. Make the offer simple to understand, run it during a defined window, and track every result.
When done well, a holiday campaign not only boosts year-end numbers but also sets a foundation for stronger retention and smarter promotions all year round.

