Offer Codes and Promo Pricing: The Discount Lever App Stores Give You
Both stores hand you a discount lever most teams never pull. How offer and promo codes work, and when discounting costs more than it earns.

Offer Codes and Promo Pricing: The Discount Lever App Stores Give You
Every subscription app eventually faces the same question: should we discount? The instinct is to reach for a sale — a percentage off, a free month, a limited-time deal blasted to everyone. Both app stores hand you a far more precise instrument, and most teams barely use it: offer codes on the App Store and promo codes on Google Play. They let you hand a discount to a specific person, for a specific reason, with a built-in expiry date. Used well, they are the cheapest acquisition and win-back tool you own. Used carelessly, they train your users to never pay full price.
The difference matters because a public sale and a targeted code are different products. A sale changes your price in front of everyone, including people who would have paid full price tomorrow. A code changes the price for one segment, invisibly to everyone else. That precision is the whole point — and the reason codes deserve a strategy, not a one-off campaign.
What the stores actually give you
Apple's offer codes and Google's promo codes solve the same problem in slightly different ways, and the differences shape what you can do with them.
On iOS, App Store offer codes are unique, one-time-use codes tied to a subscription. You generate them in App Store Connect, up to 150,000 per app per quarter, and distribute them however you like: email, in-app messages, printed cards, partner bundles. A user redeems a code and gets the offer you attached — a free period, a discounted price for a set number of periods, or a pay-up-front discount. The key detail: the code is bound to a specific subscription product and offer, so you control exactly what it unlocks. Some configurations also allow codes for existing subscribers, which matters for win-back campaigns.
On Android, Play promo codes work similarly but with their own constraints. You create a promotion in Play Console, choose one-time codes or a custom code, and attach it to a subscription or one-time product. Play lets you cap redemptions, set validity windows, and see redemption reporting in the console. Check the current eligibility rules for your product type before designing a campaign around them, since subscription eligibility has historically carried more friction on Play.
Both platforms share the trait that matters most for product teams: redemption happens in the store, not in your app. The discount is honoured by the billing system itself, shows up correctly in receipts and subscription management, and does not require you to build coupon logic into your own backend. For a small team, that is a meaningful saving: no coupon tables, no discount-state bugs, no support tickets about codes that "didn't work" because your server and the store disagreed.
The tradeoff is control. You cannot change a code's terms after it is issued, you cannot easily revoke a leaked code without invalidating a whole batch, and you are bound by each store's rules on eligibility and duration. Treat codes as printed vouchers, not database rows.
The cannibalization math, done before you discount
The question to answer before any campaign is not "will this drive conversions?" Discounts almost always drive conversions. The question is "conversions from whom?" A code redeemed by someone who would have subscribed at full price next week is not a win; it is revenue you gave away.
Do the math on a napkin before you design anything. Suppose you offer three months at half price to 1,000 lapsed users, and 100 redeem. If 20 of those 100 would have resubscribed at full price anyway, you have paid for 80 incremental subscribers with the revenue of 20 full-price ones. Whether that trade is worth it depends on what those 80 are worth after the discount ends: their retention at full price and whether the discount period converts them into habitual users or just rents them for three months.
This is why the best code campaigns start from a segment, not from a discount. "Lapsed subscribers who cancelled more than 90 days ago" is a segment. "Users who hit the paywall three times and never converted" is a segment. "Everyone on our mailing list" is not a segment; it is a sale wearing a code's clothing. The narrower the segment, the cleaner the read on whether the campaign worked, and the smaller the cannibalization risk.
A practical rule: never send a code to someone in an active trial or subscription unless you have a specific reason, like a goodwill gesture after an outage. Discounting someone who is already paying you is the most expensive way to learn nothing.
Where discounts actually earn their keep
Codes are not one tool; they are several, and each use case wants different terms.
Win-back. The classic case, and the strongest one. A cancelled subscriber is your warmest lead: they already know the product, they already paid once, and their objection is usually price, timing, or a missing feature — not ignorance. A code offering one to three months at a reduced price, sent 60 to 90 days after cancellation, gives them a low-risk reason to return. Timing matters more than the size of the discount: too early and you interrupt someone who just decided to leave; too late and they have forgotten you exist. Test the window, not just the percentage.
Annual upgrades. Moving a monthly subscriber to annual is one of the highest-leverage moves in subscription economics: it locks in twelve months, kills monthly churn decisions, and improves cash flow. A code discounting the first annual period — say, two months free — is a clean way to buy that commitment. The cannibalization risk is lower than it looks, because the user trades a discount for a commitment, and the commitment is where the value lives.
Referral and partner rewards. Codes are excellent referral currency. Instead of paying a referrer cash, give them a code for a free month to pass on — or better, give both sides something. The format travels well: it fits in a message, an email, or a QR code on a card at an event. Partner bundles work the same way: a hardware maker, a creator, or a complementary app distributes your codes to their audience, and you get distribution you could not buy at that price.
Education, press, and community. Reviewers, beta testers, educators, and community moderators are all people you want inside the product without paying. Codes are the polite, trackable way to do it: a batch for a conference or classroom costs nothing until redeemed, and redemption tells you exactly how many recipients actually tried the product.
Seasonal moments. The one case where a broad code makes sense is a genuine seasonal moment: a New Year fitness push, a back-to-school window, a Black Friday week. Even here, prefer a code over a public price change. A code expires; a public sale trains the market to wait for the next one.
One-time discounts vs recurring discounts
The single most consequential choice in a code campaign is whether the discount applies once or repeats. A one-time discount — one month free, or 50% off the first month — is a trial by another name. It lowers the barrier to starting. A recurring discount — 20% off for six months, or a reduced price for a year — changes the economics of staying.
One-time discounts are safer. They cap your exposure, they do not permanently reprice the product in the user's mind, and they make the "what happens next" conversation explicit: after the discounted period, the price becomes the normal price. The risk is churn at the cliff. Watch renewal at the end of the discount period as your primary metric; if a large share of redeemers churn the moment full price resumes, your discount bought trials, not subscribers.
Recurring discounts are more powerful and more dangerous. They genuinely change who can afford the product, which is valuable if your real problem is price sensitivity in a segment — students, users in lower-income markets, nonprofits. But they create a cohort experiencing your product at a price that may never become the real price, and they complicate every future price increase, because now you have two prices in the wild. Use recurring discounts deliberately, for segments you intend to serve at that price long-term, not as a generic acquisition sweetener.
A useful middle path: a discounted introductory period that steps up to full price, with the step-up communicated clearly at redemption. Users accept step-ups far better when they see them coming than when they discover them on a receipt.
Redemption UX: where good campaigns go to die
A code that is hard to redeem is worse than no code at all. It creates a user who wanted to pay you, tried, failed, and now associates your product with frustration. The redemption flow deserves the same design attention as the paywall.
The biggest friction point is the gap between your app and the store. On iOS, redemption typically happens through the App Store app or a redeem link, not inside your app's paywall. That handoff is where users get lost. The fix is unglamorous: a dedicated landing screen explaining exactly what the code gives them, a single prominent redeem button that opens the store flow, and a confirmation state for when they return. Test the full journey on a real device with a real code, on both platforms, before sending a single code to a real user. Emulators hide the store handoff; real devices reveal it.
The second friction point is code entry itself. Long random strings typed on a phone keyboard are hostile. Prefer the store's code-redemption URLs and QR codes where the platform supports them, so the code arrives pre-filled. If users must type, keep codes short and avoid ambiguous characters.
The third friction point is eligibility confusion. Nothing burns goodwill like a code that fails at redemption with a generic error. Before distribution, verify eligibility for your exact segment, then state it plainly in the message that carries the code — "for new subscribers" or "for returning subscribers" — so the wrong person never tries.
Guardrails: caps, expiry, leakage, and fraud
Codes leak. A code meant for 50 beta testers ends up on a coupon site; one meant for a partner gets forwarded. Plan for it.
Caps are your first guardrail. Generate codes in batches sized to the campaign, with per-batch redemption limits where the platform allows, and expiry dates matching the campaign window. An open-ended code is a liability that compounds: every month it stays valid, more future full-price revenue is at risk from a link you forgot you sent.
Expiry dates do double duty: they protect you and create honest urgency. A code expiring in 14 days converts better than one that never expires, for the same reason a deadline beats an open invitation. State the expiry in the message, not just the fine print.
Leakage monitoring is the guardrail most teams skip. Watch redemption velocity: if a batch of 100 codes for a conference redeems 400 times, something leaked. Both consoles give you redemption counts; check them weekly during a campaign, not quarterly. If a batch leaks badly, stop generating more from it and let the existing ones expire rather than fighting to revoke them.
Fraud is the sharper edge. Serial redeemers, fake accounts created to harvest trial codes, and resold codes are real patterns, especially for high-value subscriptions. The defences are boring and effective: one code per account where the platform enforces it, codes tied to specific products, and a rule that codes never stack with other offers. If redemption looks wrong — many new accounts in a short window, regions you did not target — pause distribution and investigate before scaling.
Measuring honestly
The metric that matters is not redemptions. It is incremental subscribers retained at full price. That requires a comparison, and comparisons require discipline.
The cleanest setup is a holdout: send the code to a random 80% of the segment and nothing to the other 20%, then compare subscription starts, retention at 30/60/90 days, and revenue per user. Without a holdout, you are guessing at incrementality, and guesses in discount economics are systematically optimistic — the people most likely to redeem are the people most likely to have converted anyway.
Three numbers tell you whether a campaign worked. First, redemption rate: what share of recipients redeemed, which measures message and friction quality. Second, full-price retention: what share of redeemers are still subscribed three months after the discount ends, which measures whether you bought subscribers or rented trials. Third, revenue per recipient: total revenue from the treated group divided by the number of people who received the code, compared against the holdout. If revenue per recipient is not higher in the treated group after the discount period, the campaign lost money, no matter how good the redemption rate looked.
A first campaign, end to end
If you have never run a code campaign, start with the smallest version that teaches you something. Pick one segment: subscribers who cancelled between 60 and 120 days ago. Offer one month free, then full price, with a 14-day expiry. Generate exactly as many codes as there are people in the segment, plus a small buffer. Send a short email: what they get, when it expires, one redeem button. Watch redemption daily for the first week, then compare the treated group against a holdout on starts and 90-day retention.
That one campaign teaches you your redemption friction, your win-back ceiling, and your cliff churn — the three numbers every future campaign depends on. From there, expand deliberately: annual-upgrade codes, referral codes, partner batches. Each new campaign repeats the same discipline: narrow segment, capped batch, clear expiry, honest measurement.
Takeaways
- Offer codes and promo codes are precision instruments, not sales. Their power is targeting: one segment, one reason, one expiry date.
- Do the cannibalization math before you discount. A redemption from someone who would have paid full price is revenue lost, not growth.
- Start from the segment, not the discount. Win-back, annual upgrades, referrals, and community access are different campaigns with different terms.
- Prefer one-time discounts for acquisition and win-back; reserve recurring discounts for segments you intend to serve at that price long-term.
- Redemption UX is part of the campaign. Test the store handoff on a real device, pre-fill codes where possible, and state eligibility plainly.
- Cap batches, set expiry dates, and watch redemption velocity. Codes leak; guardrails are the campaign.
- Measure incremental subscribers retained at full price, with a holdout. Redemption rate alone will flatter you.
The stores built you a discount lever that costs nothing to hold and charges you only when it works. The teams that get the most from it are boring about it: small batches, narrow segments, short windows, honest measurement. That discipline is the difference between a discount that buys growth and one that buys a cheaper version of the growth you already had.