Your eCPM looks normal but revenue is down, or your impressions fell while ad requests held steady. That combination almost always means fill rate dropped — ad requests are coming in, but fewer of them are being answered with an ad. Unlike an eCPM drop (a pricing problem), a fill drop is a delivery problem, and the causes and fixes are completely different. Here is how to read it.
First, be precise about which "fill" metric you are looking at, because the networks define two and they fail for different reasons:
- Match rate / fill rate = matched (or filled) requests ÷ ad requests. This is the one that usually moves. A fall here means the auction or waterfall isn't returning an ad for requests you are sending.
- Show rate / impression rate = impressions ÷ filled requests. If this fell instead, the network returned an ad but your app didn't show it — that's an app/SDK timing bug, not a demand problem.
Once you know which one moved, walk these causes in order. The first three are the common ones.
1. A policy or serving restriction (rule this out first)
The single most damaging and most-missed cause: the network quietly limited ad serving on an app. AdMob calls it limited ads / partial enforcement; AppLovin and others have equivalents. Fill collapses immediately, often on one app or one country, and there is no error in your code — only the earnings tell you. Open the network's Policy center and Ads serving status before you touch anything else. If an app is flagged, no floor or mediation change will help until you resolve it.
2. Floors set too high
If you raised floor (minimum) eCPMs recently — or set them once and the market softened underneath them — you priced yourself out of demand. The auction has no bid above your floor, so the request goes unfilled. The tell: fill fell but the eCPM of the impressions that did fill is high or unchanged. You are trading volume for price and losing net revenue. Lower the floors on the affected ad units/countries in steps and watch fill recover. Floors are the most common self-inflicted fill drop.
3. A bidder or network dropped out
In mediation, a big chunk of fill often comes from one or two demand sources. If a bidder fails — expired API key, an account/billing hold on that network, a disapproved status, or an SDK/adapter version mismatch after an update — its share of fill vanishes and the remaining networks can't fully backfill it. Break fill down by ad source: a drop that concentrates in one network points straight at that network's own dashboard. Check its status there, not in your mediation tool.
4. Geo / demand mix shift
Fill rate is wildly geo-dependent. If a user-acquisition campaign brought a surge of installs from a low-demand region overnight, your blended fill rate falls even though no single country got worse — there simply isn't enough demand in that geo to fill every request. Confirm by breaking fill down by country: if each country's own fill is stable and only the mix changed, this is a UA-side shift, not an ad-stack problem to fix.
5. Request volume outran demand (or pacing/frequency changed)
If you shipped a release that requests ads more aggressively (lower refresh interval, more placements, removed frequency caps), you can inflate ad requests faster than demand can fill them — fill rate falls by definition even though filled impressions may be flat or up. Check whether ad requests rose at the same time fill fell, and line the drop up against your app release dates. If they coincide, the cause is in the app, not the network.
How to read the result
The diagnosis usually lands in one of four places: a policy action (fix the flag), floors too high (lower them), one network down (repair it on that network's side), or a mix/volume shift (often nothing to fix on the ad side). The mistake that costs a day is lowering floors blindly when the real cause was a policy flag, or blaming the market when one bidder simply stopped answering. Split fill by country, then by ad source, then check the policy center — in that order — and the cause names itself.
Doing this split by hand across every app, country, and source each time fill wobbles is exactly the tedium Mediation One automates: upload your mediation CSV and it isolates which country, unit, or source the fill drop concentrates in, and flags whether it pairs with a request-volume spike. The free audit is a single CSV upload — no SDK, no signup, nothing stored.