Some pages on your site show ads fine. Others — usually the same template, same author, same publish date — render the slot as empty with AdSense’s Ad Inspector labeling the impression “No ad served.” Unlike a code bug, this isn’t binary. It’s a real-time auction that didn’t have a fillable bid for this page at this moment for this user.
The fix path is mostly about understanding why this slot isn’t winning, then either changing the slot, the page, or accepting it.
Common causes
Ordered by hit rate, highest first.
1. Page topic has too narrow advertiser pool
A page on “How to fix vsync tearing in DaVinci Resolve” has dozens of potential bidders. A page on “vintage Casio FX-100 collector forum” might have two, and both might be paused this week.
How to spot it: In Ad Inspector → “Reason for not showing an ad”, look for “limited matching ads.” If you see it, demand-side is the issue, not your code.
2. Visitor’s country / language has thin AdSense inventory
If your traffic spikes from a country where AdSense has limited demand (some African and Central Asian markets), or readers using a language where ads are rare, fill rate drops to near 0 for those impressions.
How to spot it: Compare reports in AdSense → Reports → Countries. If 1-2 countries dominate impressions but earn near-0, you’re seeing geographic inventory thinness.
3. Slot dimensions don’t match any active campaign
If your ad slot is fixed at 320×50 but most current AdSense campaigns target 300×250 or 728×90, the slot will lose auctions.
How to spot it: Switch the slot to responsive (data-ad-format="auto"). If fill rate jumps, the fixed size was the problem.
4. Ad blocking by browser or OS
Brave, Firefox Strict mode, iOS Safari content blockers, and corporate proxies block ads before they’re requested. AdSense never sees the impression, so “no ad” looks like an inventory issue but is actually client-side blocking.
How to spot it: AdSense → Reports compare ad impressions vs. page views. If ad impressions are < 60% of page views, you’re losing inventory to blockers, not to lack of demand.
5. User opted out of personalized ads
GDPR and California Privacy Rights Act let users opt out. AdSense respects this and falls back to “contextual” (non-personalized) ads — which have ~30-50% lower fill rate.
How to spot it: AdSense → Reports → break down by “Personalization.” Compare fill rate for personalized vs. non-personalized impressions.
6. Recent policy violation on the page
Pages near the line (gambling adjacent, mature themes, copyrighted content references) may be silently restricted: not de-monetized site-wide, but no demand wants to bid on them.
How to spot it: AdSense → Policy center → Page-level enforcement. Even pages with “limited ad serving” status will show here.
7. New page hasn’t been crawled by AdSense yet
When you publish, it takes time for AdSense’s content classifier to crawl and categorize the page. Until then, AdSense doesn’t know what to match against and can’t bid optimally.
How to spot it: Pages older than 7 days fill but a brand-new article doesn’t. Wait 3-7 days.
Shortest path to fix
Step 1: Use Ad Inspector to identify the reason
In Chrome, navigate to the affected page → click the AdSense extension (or DevTools → AdSense panel) → look at “Reason.”
| Reason text | Diagnosis | Action |
|---|---|---|
| ”Limited matching ads” | Topic / geo / size mismatch | See Step 2 |
| ”No ad to display” | Genuine inventory miss | Try responsive size |
| ”Restricted ad serving” | Policy issue | Check Policy center |
| ”Personalization disabled” | User opted out | Expected; not fixable |
Step 2: Switch to responsive units
Most “limited matching” cases resolve by giving AdSense more sizes to fill:
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-XXXXXXXXXX"
data-ad-slot="1234567890"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
Fixed sizes (e.g., data-ad-format="rectangle") lose to responsive in most niches.
Step 3: Add multiple ad sizes per slot (multi-size)
If you must keep fixed dimensions, configure the slot in AdSense → Ads → Ad units to allow multiple sizes:
<ins data-ad-format="auto"
data-ad-layout-key="-fb+5w+4e-db+86"
data-multi-size="300x250,336x280,250x250"></ins>
This gives the auction more bid combinations.
Step 4: Audit page content for policy adjacency
Open the page text. Run it through this mental check:
- Does it mention gambling, sports betting, or drugs in any way?
- Does it embed user-generated content that’s unmoderated?
- Does it reference downloads or links to copyrighted media?
If yes to any, even tangentially, demand may be quietly restricted.
Step 5: Set realistic expectations by topic
Some topics will never have great fill. Examples of expected fill rates:
- Personal finance, software, e-commerce: 90-99%
- Tech tutorials, productivity: 80-90%
- Niche hobbies, regional content: 50-75%
- Translation-heavy non-English markets: 30-60%
If your topic mix is on the low end, focus on RPM optimization (page views per session, time on page) rather than fighting fill rate.
Step 6: Diversify the ad stack
For sites that consistently see < 60% fill from AdSense, add a second network (Ezoic, Mediavine if you qualify, Raptive, Adsterra as a backup). They run different demand pools and pick up impressions AdSense leaves on the floor.
Prevention
- Default all new slots to
data-ad-format="auto"unless you have a strong reason otherwise. - Don’t write articles solely about extremely cold topics; balance with broader-interest topics.
- Monitor fill rate per page in AdSense → Reports → “URLs.” Identify chronic 0-fill pages and review content.
- Set up a second ad network for fallback inventory if AdSense fill drops below 70% over a week.