Some pages on your site show ads fine. Others, usually the same template, same author, same publish date, render the slot empty while AdSense reports the impression as an unmatched ad request. 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, so the slot collapses to nothing.
Fastest path: open the page in Chrome, run DevTools to see why the slot is empty (no request sent, a 403, a 200 with no fill, or ERR_BLOCKED_BY_CLIENT), then act on that one signal. Most fixable cases are a fixed ad size losing the auction (switch to responsive) or a brand-new page AdSense hasn’t crawled yet (wait 3–7 days). The rest are demand-side or policy issues you diagnose but can’t force.
One thing to rule out first: this is the per-impression “no fill” problem, not the account-wide Limited ad serving banner. If AdSense → Account → Policy center shows a “Limited ad serving” status, that’s a different issue (see Causes, item 6 below) and switching ad sizes won’t help.
Common causes
Ordered by hit rate, highest first.
1. Page topic has too narrow an 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. AdSense calls these unmatched ad requests: the request went out, but no advertiser wanted that slot.
How to spot it: AdSense → Reports, add the Coverage and Matched requests columns, break down by page URL. A page with high ad requests but low coverage is losing on demand, not on your code.
2. Visitor’s country or language has thin AdSense inventory
If your traffic spikes from a market where AdSense has limited demand (some African and Central Asian markets), or readers using a language where ads are rare, coverage drops toward 0 for those impressions.
How to spot it: AdSense → Reports, break down by Country. If 1–2 countries dominate ad requests but earn near 0 with low coverage, you’re seeing geographic inventory thinness.
3. Slot dimensions don’t match any active campaign
If your ad slot is fixed at 320x50 but most current AdSense demand targets 300x250 or 728x90, the slot loses auctions it would otherwise win. As of June 2026, Google explicitly recommends responsive units over fixed sizes because they auto-fit the container and pull a wider pool of bids.
How to spot it: switch the slot to responsive (data-ad-format="auto"). If coverage jumps, the fixed size was the problem.
4. Ad blocking by browser or OS
Brave, Firefox Strict mode, iOS Safari content blockers, uBlock Origin, and corporate proxies block the ad script before the request is sent. AdSense never sees the impression, so an empty slot looks like an inventory issue but is actually client-side blocking. In DevTools this shows up as net::ERR_BLOCKED_BY_CLIENT on adsbygoogle.js.
How to spot it: AdSense → Reports, compare ad requests to your analytics page views. If ad requests are well below page views (roughly < 60%), you’re losing inventory to blockers, not to lack of demand.
5. User opted out of personalized ads
GDPR, the EU Digital Markets Act, and US state privacy laws (California’s CPRA and similar) let users opt out of data-driven targeting. AdSense respects this and falls back to non-personalized (contextual) ads, which have a meaningfully lower fill rate. Note this is distinct from the limited ads (LTD) serving mode, which is the same idea applied account-wide when you haven’t collected valid consent.
How to spot it: AdSense → Privacy & messaging, confirm your consent message (CMP) is live; then in Reports compare coverage for impressions before and after a user has interacted with the consent banner.
6. Account-level “Limited ad serving”
This is the one people most often misdiagnose. Google can cap how many ads your whole account serves while it assesses traffic quality (very common for new accounts) or when it suspects invalid traffic. During this period most slots stay blank no matter what size they are. As of June 2026, these assessment limits typically last under 30 days (commonly in the 10–30 day range) and lift automatically, but can extend indefinitely if traffic quality doesn’t improve.
How to spot it: AdSense → Account → Policy center. A “Limited ad serving” status banner appears here at the account level. If you see it, stop changing ad code and focus on traffic quality and (if applicable) the invalid-traffic appeal.
7. Page-level policy restriction
Pages near the line (gambling adjacent, mature themes, references to copyrighted downloads) may be silently restricted: not de-monetized site-wide, but no demand wants to bid, or Google returns a 403 (“an ad shouldn’t be served”). In DevTools the ad request comes back red with status 403.
How to spot it: AdSense → Account → Policy center → Page-level enforcement (formerly “Page-level violations”). Restricted URLs are listed here with the violation type.
8. New page hasn’t been crawled by AdSense yet
When you publish, AdSense’s content classifier needs time to crawl and categorize the page. Until then it doesn’t know what to match against and can’t bid well.
How to spot it: pages older than a week fill, but a brand-new article doesn’t. Wait 3–7 days, then recheck.
Shortest path to fix
Step 1: Diagnose with Chrome DevTools
Google’s standalone “Ad Inspector” is gone; the current method is Chrome DevTools. On the affected page, open DevTools (Cmd+Opt+I on macOS, Ctrl+Shift+I on Windows/Linux), go to the Network tab, and type ads? in the filter box. Reload the page and read the result:
| What you see | Diagnosis | Action |
|---|---|---|
No ads? request at all | Script not loading (ad blocker, broken tag, consent gate) | Check Console for ERR_BLOCKED_BY_CLIENT; test in a clean profile |
Request with status 403 (red) | Policy / unapproved site / page restriction | Check Policy center (Causes 6 and 7) |
Status 200 but slot empty | Unmatched request, or ads.txt problem | Verify ads.txt, then try responsive size |
Console: Fluid responsive ads must be at least 250px wide | Slot has zero/too-narrow width | Give the container a real width in CSS |
Reading this one signal eliminates half the diagnostic branches before you change anything.
Step 2: Verify ads.txt
A 200-but-empty slot is very often an ads.txt problem, not demand. Visit https://yourdomain.com/ads.txt and confirm it contains your publisher ID exactly as AdSense lists it (AdSense → Sites → Get code shows the expected line):
google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0
The status must read Authorized under AdSense → Sites → ads.txt status. An “Unauthorized” or missing file suppresses fill site-wide.
Step 3: Switch to responsive units
Most narrow-fill 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>
Make sure the parent container has a non-zero width, or you’ll hit the Fluid responsive ads must be at least 250px wide: availableWidth=0 console error from Step 1. Fixed sizes (e.g. data-ad-format="rectangle") lose to responsive in most niches.
Step 4: Add multiple sizes per slot (multi-size)
If you must keep fixed dimensions, configure the unit in AdSense → Ads → By ad unit to allow several sizes:
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-XXXXXXXXXX"
data-ad-slot="1234567890"
data-ad-format="auto"
data-ad-layout-key="-fb+5w+4e-db+86"></ins>
More size combinations means more bids the auction can fill.
Step 5: Audit page content for policy adjacency
If Step 1 returned a 403, or the URL appears under Policy center → Page-level enforcement, read the page text against this checklist:
- Does it mention gambling, sports betting, recreational drugs, or weapons in any way?
- Does it embed unmoderated user-generated content?
- Does it reference downloads or links to copyrighted media?
- Does it cover sensitive health, political, or “shocking” content?
Any of these, even tangentially, can trigger restricted demand. Fix or contextualize the copy, then request a review from the Policy center entry.
Step 6: Set realistic expectations by topic
Some topics will never have great fill. Typical coverage ranges, as a rough guide:
| Topic mix | Expected coverage |
|---|---|
| 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 mix sits on the low end, optimize RPM (page views per session, time on page, viewability) instead of fighting coverage.
Step 7: Diversify the ad stack
For sites that consistently see low coverage from AdSense alone, add a second network (Ezoic, or Mediavine/Raptive if you qualify on traffic). They run different demand pools and pick up impressions AdSense leaves unfilled. Use AdSense as one bidder rather than the only one.
How to confirm it’s fixed
- In DevTools → Network → filter
ads?, the request returns200and an ad renders in the slot. - AdSense → Reports, the affected URL’s Coverage has climbed over the following 24–48 hours.
- Policy center shows no account-level “Limited ad serving” banner and no page-level enforcement on that URL.
Coverage is a rolling average, so give it a day or two after a code change before judging it.
FAQ
Is “No ads available” the same as my account being banned? No. A banned or disabled account stops serving everywhere and shows an enforcement notice in the Policy center. An empty slot on some pages is almost always a per-impression no-fill, which is normal to a degree. Coverage of 100% does not exist for any publisher.
My brand-new article shows no ads but older ones do. Bug?
Usually not. AdSense hasn’t crawled and classified the new URL yet, so it can’t match demand well. Wait 3–7 days. If it’s still empty after a week and DevTools shows 200, check ads.txt and the slot width.
DevTools shows status 403 on the ad request. What now?
A 403 means Google decided an ad shouldn’t serve on that page or site. Check AdSense → Account → Policy center for page-level enforcement or a “Limited ad serving” status, fix the cited issue, then request a review.
Why do ads show for me but not for some visitors?
Two common reasons: those visitors run ad blockers (the request never fires, look for ERR_BLOCKED_BY_CLIENT), or they declined personalized ads via your consent banner and got lower-filling non-personalized ads. Both are expected and not fixable from your code.
How long does “Limited ad serving” last on a new account? As of June 2026, the automatic assessment limit usually clears in under 30 days (often 10–30). It lifts on its own once Google trusts your traffic. Don’t keep editing ad code during this window; build genuine traffic instead.
Prevention
- Default every new slot to
data-ad-format="auto"unless you have a strong reason otherwise, and always give the container a real width. - Keep
ads.txtauthorized; re-check it after any DNS, CDN, or host migration. - Balance very cold niche topics with broader-interest content so your average advertiser pool stays healthy.
- Monitor Coverage per URL in AdSense → Reports; review any chronic 0-coverage page.
- For new accounts, focus on real, policy-clean traffic during the assessment window rather than tweaking ad units.
Related
- AdSense ads not showing
- Ad script installed but slot remains blank
- Auto Ads appear in poor places
- Ads slow down the website
External references: Use Chrome DevTools to troubleshoot ads not showing and Limited ad serving vs. limited ads.