Run a Seasonal Offer Without a Release

Stan
Stan

Updated 24 Oct 2026

The traditional version of a holiday promotion costs three releases. One to put the offer in, rushed through review the week before. One to take it out, because the banner is still there on 2 January. And often a third, when the end date moves and the second release is already in review.

None of that work is about the offer. It is the cost of having put a date inside a binary. Move the date out and a seasonal promotion stops being an engineering event and becomes something a person runs from a calendar — which changes what the hard parts are.


Three Releases for One Banner

Hard-coding a promotion means the app itself has to know what day it is and what that day means. It also means the end of the promotion depends on people installing an update, which some of them will not do for weeks. Every team that has shipped one of these has a story about an offer that lived on in older versions long after it ended.

The alternative is to ship the screen once, with no dates in it, and have the dashboard decide whether it is currently being used. The screen does not know about the season; the campaign does.

Put a date inside a release and you have promised to ship twice. Put it in a campaign and you have promised to show up on a Monday morning.

The Dates Are the Product Decision

Once the dates are cheap to change, they stop being a constraint and start being a choice — which means somebody has to make it deliberately. Three decisions worth writing down before anything is configured:

  1. How wide is the window?

    Short windows create urgency and leave no room to react. A window you cannot look at halfway through and adjust is a window you are betting on.

  2. Who is it for?

    A discount shown to people who were about to pay full price is a refund you volunteered. Excluding current subscribers is the easy half; deciding about people mid-trial is the half that needs a view.

  3. How often does one person see it?

    A seasonal offer is interruptive by design. Decide the cap in advance, because the temptation to raise it on a slow day is strong and it is where goodwill goes.


Before the Window Opens

A campaign sitting in a draft state is not waiting for you to be ready; it is where you find out whether you are. The list below is in the order things actually go wrong:

  • The screen is in a released version, and in enough hands. A promotion that only reaches people who updated this week is not the promotion you planned. Check adoption of the version that carries it, not just that it shipped.
  • The price is approved in both stores. Store review of a new product can take longer than your window is wide. This is the single most common reason a start date slips.
  • Translations are in and have been seen on a small phone. Holiday copy is the most likely to overflow, because it is the most likely to be written in a hurry.
  • Someone can see it before everyone can. A staged version, pointed at your own devices, is the only honest rehearsal. Reading the configuration back to yourself is not one.

Notice that three of the four are not about the campaign at all. Removing the release from the critical path does not remove the store from it, and the store is the part with its own schedule.


The Morning It Goes Live

Activation is one state change made by a person, and it takes effect on each user's next session rather than instantly across your whole base. That lag is normal and it is worth saying out loud in the room, because the first thing somebody does after activating a campaign is open the app and expect to see it.

What to watch in the first hours is not revenue — it is too early and you will read noise. Watch that the right people are seeing it at all, and that the people who should not see it are not. A targeting mistake caught in hour one costs nothing; the same mistake found on day four has already spent your window.

And do pick a human. “The campaign goes live on the 24th” is not a plan if nobody is named, awake, and holding the dashboard in the right time zone.


The Day It Has to End

Ending is the transition that used to require a release, and it is still the one people forget. Cancelling the campaign hands every session back to whatever was running before, so there is a hard requirement hiding in that sentence: something has to have been running before. If the seasonal offer was the only thing live, cancelling it leaves a hole.

Two more things to settle while the window is still open, not on the day:

  • What happens to someone who saw the offer, did not buy, and comes back the day after it ended. Showing them the full price with no explanation is the version that generates support mail.
  • Whether the window can be extended. Decide it in advance, because deciding it on the last afternoon of a good week is how a seasonal offer becomes the permanent price.

A promotion that ends on time is also the cheapest version of a campaign that needs no app changes to run again next year: same screen, new dates.


What a Discount Costs You in February

Seasonal numbers flatter you twice: once during the window, when sales obviously rise, and once in the review afterwards, when the rise is compared against a quiet week instead of the same week last year. Four questions that survive both:

  • Which plan did buyers choose, and was it the plan you wanted them in?
  • Did monthly sales fall while discounted annual sales rose? That is demand you moved, not demand you created.
  • How many of the discounted cohort are still subscribed a month and two months later?
  • Did one market convert far worse than the others? Usually that is the translation or the local price, not the offer.

You will be answering those outside Amply. It holds no payment data, keeps no history of your revenue, and does not price anything — the products and their prices live in App Store Connect and Google Play, and the money question is answered wherever your revenue data already sits. What Amply does is decide which screen shows up and on which dates, which is the part that used to need a release; the counting stays with the analytics tool your app already sends its events to.

For the configuration itself, the seasonal campaign calendar, configured walks through the states, the audience and the hand-off to engineering.