Ad revenue has a strong seasonal rhythm, and not knowing it leads to two opposite errors: panicking over a drop that's just January, or congratulating yourself for a Q4 lift that was the calendar, not your work. Here is what actually moves, when, and how to tell seasonality apart from a real problem.
The pattern most apps see
- Q4 (Oct–Dec): the peak. Advertiser budgets surge for the holiday shopping season, especially late November (Black Friday/Cyber Monday) through mid-December. eCPMs can run materially above baseline. This is demand-driven, so it shows up as higher price (eCPM), not more impressions.
- Early January: the cliff. Budgets reset and the holiday surge ends abruptly. eCPM often falls 20–30% from the December peak within the first week or two of January. This is the drop that triggers the most false alarms.
- Q1 (Jan–Mar): the trough. Generally the softest demand of the year as advertisers ramp spending back up slowly.
- Q2–Q3: gradual recovery with smaller bumps around regional events and back-to-school.
- Weekly rhythm. Within any week, weekends and weekdays differ; some verticals spend more on weekends. Don't compare a Saturday to a Tuesday.
It varies by geo and vertical
Seasonality isn't uniform. It follows where your advertisers' calendar sits, which tracks your users' geos. Western markets peak hard in December; other regions peak around their own shopping festivals and holidays. If your traffic is concentrated in one region, your seasonal curve is that region's, not a global average.
How to tell seasonality from a real problem
The key test: seasonality is broad; a real problem is narrow. A seasonal move shows up as eCPM shifting roughly together across most countries, units, and sources — because advertiser demand moved everywhere at once. A real problem (a dead source, a stale floor, a policy action, an app bug) concentrates in one slice. So when revenue moves, break it down: if the change is spread evenly across breakdowns and lines up with the calendar, it's probably seasonal — don't fight it. If it concentrates in one country, one unit, or one source, it's a problem to fix regardless of the season.
What to do about it
For genuine seasonality: don't over-react. Don't slash floors in January because eCPM fell — the market will recover, and floors cut in panic get forgotten and leak revenue all year. Instead, compare year-over-year (this January vs last January), not just month-over-month, so the seasonal baseline is built in. Plan UA and release timing around the Q4 peak if you can. And keep a record of your own seasonal curve so next January's dip is expected, not alarming.
Separating "the whole market moved" from "one of my segments broke" is exactly the breadth-vs-concentration check Mediation One runs for you: upload your CSV and it flags whether a change is broad (seasonal) or concentrated (a real, fixable cause). The free audit is one CSV upload — no SDK, no signup, nothing stored.