Fill rate tells you how often the ad server returned something. It does not tell you whether that something was worth returning. A 97 percent fill rate on a site that backfills with house ads or a one-cent network is a full jar with a false bottom: it measures to the same line as a healthy site and holds half as much. Unfilled impressions have the opposite problem, rising for reasons that have nothing to do with demand. Both numbers are worth a glance. Neither is worth a decision on its own.
This is how each one lies, and the three reports to use instead.
How fill rate hides a demand problem
Fill rate is impressions divided by ad requests. It goes up when anything serves, and "anything" includes:
- House ads and promos. Every impression a house line item takes is filled and earns nothing. A site that moved its house line from "run only when nothing else" to a sponsorship by mistake will show perfect fill and a quiet revenue slide.
- Backfill networks at the bottom of the waterfall. A one-cent CPM is fill. If a premium partner drops out and the backfill picks up its impressions, fill holds and revenue per request falls.
- Default creatives and blank passbacks. A creative that renders a transparent pixel counts as served. Partners that return an empty VAST or a collapsed 1x1 are "fill" in the ad server's eyes.
The pattern to recognise: fill rate flat, revenue down. When you see it, the question is not "why is fill holding" but "who filled it".
How unfilled impressions rise for harmless reasons
Unfilled is counted every time an ad request gets no ad. That includes requests nobody should have made:
- Slots defined on pages where they rarely show. A footer unit defined on every template fires a request on every pageview, including the short visits that never scroll to it. All of those are unfilled, by design.
- Lazy loading that requests early. A slot that requests when it comes within two screens of the viewport, on pages readers leave after one, makes requests that never render.
- Line items that ended. A sponsorship that owned a unit on weekdays ends; its impressions fall through to the open auction and some are not bought. Unfilled rises, revenue may barely move.
- Non-human traffic. Prefetch, crawlers that execute JavaScript, link previews. They make requests and nobody fills them because nobody should.
The pattern: unfilled up, revenue flat. Nothing to fix, except possibly the slot that should not request so early.
The three reports that do not mislead
1. Revenue per 1,000 ad requests, by ad unit and device
Ad server revenue divided by ad requests, times a thousand. It is the one number that ignores traffic volume and moves only when fill or price moves. Build it as a daily report with Ad unit and Device category as dimensions, 28 days, and compare each day with the same weekday a week earlier. One unit falling while the rest hold is a demand or a page problem on that unit; every unit falling together on one device is a consent, SDK or browser problem.
2. Impressions by line item type and by advertiser, for the "filled" impressions
Take the impressions that fill rate is counting and ask who took them. Dimensions: Line item type, then Advertiser. Columns: Impressions, Revenue, eCPM. Sort by impressions. If house, network or backfill lines are climbing the list while the sponsorship and programmatic lines slide, you have found the false bottom. This report is also where the accidental "house line running as a sponsorship" shows up in one row.
3. Unfilled impressions by ad unit, with ad requests next to them
Unfilled on its own tells you little. Unfilled next to requests, per unit, tells you which units request far more than they render. A unit with 400,000 requests and 300,000 unfilled is either a slot that should request later or a unit buyers have stopped wanting; the revenue-per-request report from step one tells you which. A unit whose unfilled share jumped this week without a requests change is the one to examine for a lost partner or a floor that now sits above the market.
A short worked example
A news site sees fill drop from 96 to 91 percent on Tuesday. The first instinct is demand. The three reports say:
- Revenue per 1,000 requests: unchanged on every unit except the mobile article footer, where it fell by half.
- Line item type: house impressions up on that unit, programmatic down.
- Unfilled by unit: the mobile footer's requests doubled; renders did not.
The cause was a template release on Monday that moved the footer slot's lazy-load trigger from "when visible" to "on page load". Twice the requests, the same renders, a lower fill rate, and a house line catching the extra. Demand had not moved at all.
Make the comparison automatic
Each of these is a comparison across units, devices and days that nobody wants to run by hand at 09:00. Optimon reads your Google Ad Manager and Prebid data every morning and ranks what moved with the numbers attached, which is how a fill-rate dip reads as "the mobile footer requests twice as often since Monday's release" rather than as a demand scare.
FAQ
What is a good fill rate in Google Ad Manager?
There is no number that is good on its own. A site with house ads as the last resort can show 99 percent fill while a third of impressions earn nothing. Judge fill together with revenue per thousand ad requests and the share of impressions that went to backfill or house lines.
Why did unfilled impressions go up when nothing changed?
Common harmless causes: a new slot that is defined on pages where it rarely renders, lazy-loaded slots that request on scroll and never show, a line item that ended so its impressions fell through to unfilled, and ad requests from bots or prefetch that never had a viewer. Split unfilled by ad unit and by device before treating it as demand loss.
Which metric replaces fill rate as the daily health number?
Ad server revenue per 1,000 ad requests, per ad unit and per device, compared with the same weekday last week. It moves when fill or price moves and ignores traffic volume, which is what you want from a daily number.



