Every time a page asks for an ad, there is a chance nothing comes back. The share of requests that do get an ad is your fill rate. A falling fill rate can point to a real problem, such as a broken consent set-up, or it can be harmless or deliberate. This guide explains the numbers in Google's reports, why requests go unfilled, and how to find the cause before changing anything.
The terms, as Google defines them
AdSense and Ad Manager use similar words for slightly different things.
In AdSense
- Ad requests: counted each time a request was sent, even if no ads were returned.
- Matched ad requests: requests that returned at least one ad. Unless your coverage is 100%, you will have more ad requests than matched requests.
- Impressions: counted for each ad request where at least one ad has begun to download to the user's device.
- Coverage: the percentage of ad requests that returned at least one ad. It is the AdSense equivalent of fill rate.
In Google Ad Manager
- Total ad requests: every ad request sent to the ad server, including dynamic allocation. It equals Unfilled impressions plus Total code served count, according to Google's sell-through reporting page.
- Total code served count: the number of times the ad server served the code for an ad.
- Unfilled impressions: an ad request that didn't return an ad because none were eligible to serve. It counts requests, not ads shown.
- Total impressions: impressions from the Ad Manager ad server, AdSense, Ad Exchange and yield group partners.
- Total fill rate: Total impressions divided by Total ad requests.
- Ad Exchange match rate and Programmatic match rate: responses served divided by the requests eligible for that demand. They describe one channel, not the whole slot.
Definitions without a link come from the Ad Manager API report reference, which also gives each metric's name in the Ad Manager interface. SSPs (supply-side platforms, the exchanges that sell your inventory) may define "fill" differently.
How to calculate fill rate
The calculation is fill rate = filled requests ÷ ad requests × 100. What counts as "filled" depends on the report. AdSense coverage counts requests that returned an ad. Ad Manager's Total fill rate counts impressions, and Ad Manager only counts an impression once the creative has begun to load, and for some creative types Total code served count can be higher than Total impressions.
A hypothetical example: a slot receives 10,000 ad requests in a week. 8,500 return an ad and 8,200 count as impressions. Coverage-style fill is 85%, impression-based fill is 82%, and 1,500 requests are unfilled. The 300-ad gap between returned and counted can come from how and when the slot loads, not from demand.
Watch for counting changes: AdSense said that from June 23, 2026 every ad in a Multiplex grid is reported as its own ad request, which shifts ad requests, matched ad requests and coverage.
Why 100% fill is not the goal
Fill rate measures how often a slot showed something, not how much it earned. A lower fill rate can be the better result:
- Low-value fill. Removing a floor or allowing every ad category may fill more requests with ads that pay very little.
- Floors that leave some requests unsold on purpose. A floor removes bids below it, so some requests go unfilled. Whether that trade pays is covered in our guide to price floors.
Judge any change by revenue per 1,000 ad requests (revenue ÷ ad requests × 1,000) and page RPM, with fill rate and average CPM beside them. Higher fill with lower revenue per 1,000 requests is a worse outcome.
Read the transcript
Fill rate is the share of your ad requests that end up showing an ad. It's useful, but it doesn't tell you what you earn. Here are a thousand made-up ad requests from one slot. Most show an ad. The rest go unfilled for different reasons, like a floor above every bid, or bids that arrive too late. Now compare two set-ups. One fills ninety-two percent of requests at a low price. The other fills seventy-five percent at a higher price, and earns more per thousand requests. So break unfilled requests down by reason, slot, size and country, and judge changes on revenue per thousand ad requests, not fill rate alone.
Common reasons requests go unfilled
- Floors and pricing rules above the available bids. Ad Manager's Ads traffic navigator, a Premium reporting feature that shows why inventory fails to serve, lists "Bid below publisher floor" among its rejection reasons. With floors in several systems, the highest one applies.
- Uncommon or restrictive sizes. Google's AdSense coverage troubleshooting page notes that fixed-size ad units have a smaller pool of available ads.
- Countries, devices or sections with little demand. The same page lists market trends, such as seasonal shifts, as a cause.
- Consent signals. Under the IAB Europe TCF, when a user's choices allow neither personalized nor non-personalized ads, Google tries to serve limited ads; line items using audience targeting, remarketing or frequency capping can't serve them. Google's TCF troubleshooting page adds that if a consent management platform (CMP) doesn't respond, the request may go unmonetized. See consent and ad revenue.
- Header bidding timeouts. Prebid ignores bids after the timeout, so a timeout too short for your partners drops bids that might have filled the slot. See header bidding timeouts.
- Policy issues and ad serving limits. Google may limit the number of ads an AdSense account can show while it evaluates traffic quality or because of invalid traffic concerns. The coverage page also lists a missing or misconfigured ads.txt file, policy violations and crawler errors.
- Blocking controls. AdSense warns that blocking ads can have a negative effect on your earnings. In Ad Manager, blocks show in Ads traffic navigator as reasons such as "Blocked by category protection".
- Low-quality or invalid traffic. The coverage page says that if Google can't verify your traffic quality, it may limit or disable ad serving.
- Requests made when no one can see the slot. Google Publisher Tag (GPT) waits until a prerendered page is made visible before requesting ads, and on a hidden page, such as a background tab, only requests and renders above-the-fold ads. Custom refresh code may not, and slots far down the page requested on load add requests whose ads may never be seen.
Symptom, likely cause, what to check
| Symptom | Likely cause | What to check |
|---|---|---|
| Fill fell sharply across the site on one day | Consent, ads.txt, policy or an ad serving limit | Policy center (including TCF errors), ads.txt status, recent CMP or tag changes |
| Fill fell after a floor change while CPM rose | Floor above many bids | Revenue per 1,000 ad requests before and after; "Bid below publisher floor" in Ads traffic navigator |
| One slot fills far less than others | Restrictive size, placement or a tag error | Unfilled impressions by ad unit and requested ad size |
| Fill is low in one region only | Little demand there, or consent rules for that region | Fill and revenue by country; TCF errors for EEA, UK and Swiss traffic |
| Header bidding fill is low, Google demand is normal | Timeout too short or a partner problem | Bid response times and timed-out bids per partner |
| Coverage moved but revenue did not | Counting change or extra low-value requests | Reporting announcements; whether ad requests jumped |
| Many ads returned but fewer impressions | Slot loads after readers leave or never reach it | Total code served count against Total impressions by ad unit; lazy loading settings |
What to do with unfilled requests
Google's unfilled impressions troubleshooting page suggests two options in Ad Manager:
- Backfill or house ads. Book run-of-network house or Ad Exchange line items for every ad unit size, so something is always eligible to serve. House ads can promote your own newsletter or articles.
- A deliberate blank: a 1x1 house ad for each size, tracked separately from unfilled impressions.
Then decide how an empty slot looks. GPT's collapseDiv setting replaces the deprecated collapseEmptyDivs() method. According to the GPT reference, ON_NO_FILL starts the slot expanded and collapses it if no ad is returned, while BEFORE_FETCH starts it collapsed and expands it when an ad is returned:
googletag.setConfig({ collapseDiv: "ON_NO_FILL" });
Collapsing moves content, which can hurt Cumulative Layout Shift. Google's guide to minimizing layout shift says the only guaranteed way to avoid shift is to reserve space with CSS, and that slots likely to fill should start expanded while slots unlikely to fill should start collapsed. See Core Web Vitals and ads.
How to diagnose unfilled requests
- Break the numbers down by ad unit, requested size, country and device. A site-wide fill rate hides the cause.
- Compare counts, not just percentages. If requests jumped while impressions stayed flat, look for new requests (a new slot, refresh code, a duplicate tag) before blaming demand.
- Run an Unfilled impressions report in Ad Manager, pairing the Ad unit and Requested ad sizes dimensions with the Unfilled impressions metric, as Google's reporting steps describe. That page describes the older Reports tool, which Google is replacing with Interactive reports.
- Check Coverage in AdSense by site and ad unit, and work through the coverage troubleshooting checklist above.
- With Premium reporting, use Ads traffic navigator's rejection reasons to see which step filters out requests or bids.
- Change one thing, then judge by revenue per 1,000 ad requests over at least a full week.
Common questions
What is a good fill rate?
There is no universal target; it depends on your floors, sizes, audience and demand. Compare slots on revenue per 1,000 ad requests as well as fill.
What is the difference between fill rate, match rate and coverage?
AdSense coverage counts requests that returned an ad. Ad Manager's Total fill rate divides Total impressions by Total ad requests. Ad Exchange match rate and Programmatic match rate cover only requests eligible for that demand.
Are unfilled impressions always bad?
No. A floor or block you chose on purpose will leave some requests unfilled. They matter when they rise without a decision behind them.
Should I collapse empty ad slots?
Reserve space for slots that usually fill, and start rarely filled slots collapsed, so content does not shift under the reader.