Guide

Fill rate and unfilled impressions: why ad requests go unfilled and what to check

The fill metrics Google AdSense and Ad Manager actually report, the common reasons ad requests go unfilled, and how to find the cause by ad unit, size, country and device, judging any fix by revenue rather than fill rate alone.

Updated · 7 min read

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

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.

A funnel with hypothetical numbers for one ad slot: 1,000 ad requests, 840 matched ad requests, 800 impressions. 160 requests go unfilled because of floors above every bid, sizes with little demand, consent limits, bids after the timeout, blocking settings or ad serving limits. 40 matched requests are not shown because the reader left before the ad began to load. AdSense coverage is 84%; Ad Manager total fill rate is 80%.
Where ad requests drop out, with hypothetical numbers. Step names follow AdSense; Ad Manager reports total fill rate as impressions divided by ad requests. Open the full-size diagram.

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.

Unfilled requests by reason, then two set-ups compared (narrated, with captions and music). Made-up numbers: a 75% fill rate at a higher price earns more per 1,000 requests than 92% at a lower price.
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

SymptomLikely causeWhat to check
Fill fell sharply across the site on one dayConsent, ads.txt, policy or an ad serving limitPolicy center (including TCF errors), ads.txt status, recent CMP or tag changes
Fill fell after a floor change while CPM roseFloor above many bidsRevenue per 1,000 ad requests before and after; "Bid below publisher floor" in Ads traffic navigator
One slot fills far less than othersRestrictive size, placement or a tag errorUnfilled impressions by ad unit and requested ad size
Fill is low in one region onlyLittle demand there, or consent rules for that regionFill and revenue by country; TCF errors for EEA, UK and Swiss traffic
Header bidding fill is low, Google demand is normalTimeout too short or a partner problemBid response times and timed-out bids per partner
Coverage moved but revenue did notCounting change or extra low-value requestsReporting announcements; whether ad requests jumped
Many ads returned but fewer impressionsSlot loads after readers leave or never reach itTotal 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

  1. Break the numbers down by ad unit, requested size, country and device. A site-wide fill rate hides the cause.
  2. 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.
  3. 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.
  4. Check Coverage in AdSense by site and ad unit, and work through the coverage troubleshooting checklist above.
  5. With Premium reporting, use Ads traffic navigator's rejection reasons to see which step filters out requests or bids.
  6. 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.