Ad revenue dropped overnight and you don't yet know why. This is a checklist for that exact moment — reactive, not a quarterly review. It works whether you run AdMob mediation, AppLovin MAX, or Unity LevelPlay, because the first half is the same on every platform. Budget 30 minutes; most drops are isolated by minute 15.
Step 0 — Confirm it's real, not a reporting artifact
Before triaging, rule out the boring explanations. (a) Is the data finalized? Yesterday's numbers are estimates and revise upward — compare to the same point in the daily cycle, not a finalized day. (b) Is it a weekend/holiday? eCPM has a weekly rhythm; Sunday is not Wednesday. (c) Did your timezone or reporting window shift? Compare like-for-like 24-hour windows. If it survives all three, it's real — continue.
Step 1 — Split the fall into impressions × eCPM
Every ad-revenue drop is one of two stories, and they have completely different causes:
- Impressions fell, eCPM roughly flat → a delivery / volume problem. Fewer ads were shown. Causes live in your app, your sessions, or fill: a broken placement in a new build, a DAU drop, a crash, a fill/match-rate collapse, or an account serving restriction.
- Impressions flat, eCPM fell → a pricing / demand problem. The same number of ads sold for less. Causes live in the auction: a failing bidder, a country-mix shift, a floor mistake, or a seasonal demand dip.
This single split decides which branch below you read. Do not skip it — it's the difference between fixing your app and fixing your floors.
Step 2A — If impressions fell
- DAU / sessions: open product analytics. If daily active users fell in step with impressions, this isn't an ads problem at all — it's retention or acquisition. Stop here and look at the funnel.
- App release timing: did the drop start exactly when a new build rolled out? A moved or broken ad placement, a mis-fired frequency cap, or an SDK upgrade is the usual culprit. Check per-placement impressions.
- Fill / match rate: requests up but fills down means demand isn't matching your floor — or an account/policy action is limiting serving. Check the mediation dashboard's request-vs-fill columns and the policy center.
- Crash / ANR: a spike in crashes mid-session cuts the ads shown per user. Cross-check your crash dashboard for the same date.
Step 2B — If eCPM fell
- By network / ad source: drops concentrate on one or two networks. Find the one that fell 50%+ while others are flat — that's a bidder/source failure (expired key, account hold, disapproval on that network).
- By country: a UA-driven jump in low-eCPM geo share lowers blended eCPM with no real per-market decline. Verify by checking eCPM within a single fixed country.
- By floor change: review the audit log. A floor raised too far cuts fill on high-volume/low-price impressions and drops blended eCPM despite the higher price.
- By format: if your highest-eCPM format (usually rewarded) lost share, the blend falls even when each format's own eCPM is unchanged — an app-side cause.
Step 3 — Platform-specific notes
AdMob mediation: the breakdowns to use are Country → Ad unit → Ad source → Format → Match rate, plus the Policy center / serving status. (We have a dedicated AdMob walkthrough in the blog.)
AppLovin MAX: switch the dashboard view from Ad Unit to Network, then to Country. MAX's per-network and per-country views isolate bidder failures and mix shifts fastest; also check the MAX changelog and AppLovin status page for SDK regressions.
Unity LevelPlay (ironSource): use the per-instance and per-network reports; an instance dropping out of the waterfall, or a mediated network's key expiring, is the most common LevelPlay-specific cause.
The principle
A blended revenue number is an alarm, never a diagnosis. Split it into impressions × eCPM, then keep slicing by the one dimension that explains the fall — network, country, ad unit, or format. The cause is almost always a single isolated thing wearing the costume of a market-wide collapse.
If you'd rather not run this checklist by hand at 8am, that is precisely what we built Mediation One to do — it ingests your CSV, runs the impressions-vs-eCPM split and the per-dimension slicing automatically, and tells you the single cause. The free audit is one CSV upload, no SDK and no signup.