AdSense Not Showing: Narrow It Down Before You Change Anything
The code is in, the account is approved, and the ad slot still sits there empty. Instead of changing settings at random, narrow the problem down with four tests and then work only through the causes that are still possible.
Few things are as frustrating as an ad slot that stays empty. The code is in place, the account is confirmed, the instructions were clear, and still nothing happens. The usual reflex is to change five things at once: a different ad format, another plugin, cache cleared, code pasted again. After that nobody knows what fixed what.
The better order is the other way round. Narrow it down first, fix afterwards. Four tests are enough to cut the list of causes down to one or two candidates.
Four tests that decide everything else
- An incognito window with no ad blocker. Open your page in a private window where no extensions are active. If the ad appears there, the site was never the problem.
- A different device on a different network. Load the page on your phone over mobile data. That rules out your browser profile, your extensions and any DNS filtering on your home network.
- Check the page source. View the source of the page and search for
pagead2.googlesyndication.com. If the call is missing entirely, the code was never delivered and there is no point thinking about ad formats yet. - Look at the report in your AdSense account. Does today show Ad requests and Impressions? If yes, serving works and your problem sits in front of the screen or in the layout. If no, the request never reaches Google at all.
| What you see | What it means | Likely causes |
|---|---|---|
| Visible in incognito, not otherwise | Serving is working | Ad blocker, browser extension, DNS filter |
| Script missing from the page source | The code never reaches the page | Theme update, wrong insertion point, optimisation plugin |
| Script present, slot stays empty | The code loads but nothing fills it | Consent banner, no bid, container without size |
| Account shows zero Ad requests | Google is never asked | Account not active, script blocked, code missing |
| Ad requests yes, almost no Impressions | Asked, but not filled | No bid, blocking controls set too tightly |
Cause 1: the account is not active yet, or no longer is
Before approval, AdSense serves nothing at all. After you apply, Google reviews content and ownership, which can take anywhere from hours to several weeks. The same applies when the account carries a policy notice or an "Ad serving limited" message, or when address and payment verification is still outstanding. So the first place to look is always the account itself: are there unread notices? Google usually says in plain language what is missing.
Cause 2: the ad unit is too new
A freshly created ad unit, or a site that was only just approved, does not serve immediately. It is entirely normal for a new slot to stay empty for a few hours before it fills. Before you rebuild anything here, wait half a day and look again. A great many "AdSense is not working" cases resolve themselves at this point.
Cause 3: the consent banner blocks the script
Wherever consent management is in place, this is by far the most common technical cause, and the most treacherous, because everything looks correctly configured. Personalised advertising needs consent, so consent tools hold the AdSense script back until the visitor has agreed. The typical traps:
- You are testing with consent refused, or never given, and therefore see nothing.
- The service "Google AdSense" exists in the consent tool, but its script blocker matches too broadly and keeps blocking even after agreement.
- The consent cookie is named differently from what is expected, because the consent tool and the ad plugin come from different vendors.
What to do: deliberately give consent in a test window and reload. If the ad appears now, the consent configuration is at fault and not the ad code. Which tool fits your setup is covered in our comparison of cookie consent plugins.
Cause 4: ad blockers
Obvious, and still often overlooked, because plenty of people forgot years ago that they installed one. Browsers with built in tracking protection, privacy extensions and filtering DNS services on the home network all hide ads as well. The incognito test from step one exposes it. How large the effect actually is across a whole readership is something we put numbers on in what ad blocking really costs publishers.
Cause 5: the code is no longer on the page at all
If the page source test finds no googlesyndication, the case is clear. The most common reason: the snippet sat in header.php and was overwritten by a theme update. Other candidates are a deactivated plugin, a code field that came back empty after the last save, or a snippet that only outputs on posts and not on pages.
The lasting fix is not to paste the snippet back into the theme, but to keep it somewhere an update cannot reach, in a plugin that manages ad blocks centrally. That way the next theme update is a non-event.
Cause 6: caching, minification and "delay JavaScript"
Performance plugins are a frequent but quiet source of trouble. Three features come up again and again:
- Combining or minifying JavaScript: can break the asynchronous AdSense call apart or bundle it into a file where it no longer executes correctly.
- Delaying JavaScript until interaction: ads then load only after the first scroll or click, so on a short visit never at all.
- A stale cache: you are looking at the version of the page from before your change. Host level caches and a CDN in front count here too.
Test: switch the optimisation plugin off briefly, clear every cache, reload. If the ad appears, add the AdSense domain to the plugin's exclusion list rather than turning the optimisation off altogether.
Cause 7: the container has no size
Responsive ad units need a parent element with actual width. If the ad unit sits in a container of zero width, in an area hidden with display:none, in a collapsed accordion or in a sidebar that is hidden on mobile, the slot stays empty, sometimes visible on desktop and not on mobile. Inspect the element in your browser's developer tools: does the container have a width greater than zero, is it visible, does it have enough height?
Cause 8: ads.txt is missing or wrong
A missing or incorrect ads.txt rarely switches advertising off completely, but it does noticeably depress the number of bids, which shows up as "ads only appear sometimes". Open yourdomain.com/ads.txt in a browser: does your line appear as plain text, or do you get a 404? Common mistakes are a file in a subfolder instead of the document root, a wrong publisher ID, or a file served as HTML. The details are in setting up ads.txt in WordPress.
Cause 9: there was simply no matching bid
Not every request gets filled. If an individual slot occasionally stays empty while the report shows Ad requests, that is not a defect, it is the normal outcome of an auction with no suitable bidder. It becomes more likely with a very specific niche, small reach, unusual ad formats and above all with extensive blocking controls: block many ad categories or advertisers and you block bids along with them. If you have curated such lists, it is worth checking whether they are still proportionate. In the settings of your ad units you also decide what happens when nothing is returned, for example collapsing the slot instead of leaving a gap.
Cause 10: two ad plugins at once
The classic during a migration: the old plugin is still active, the new one as well, and both insert the AdSense loader. Duplicate scripts, duplicate Auto ads configuration or two competing consent rules produce behaviour nobody can trace. The same goes for Auto ads plus manual units in the same position. Clean up: one tool for advertising, deactivate every remnant of the other and remove its snippets.
The checklist in short form
- Open an incognito window with no extensions.
- Cross-check on a second device over mobile data.
- Search the page source for
googlesyndication. - Look at the AdSense report for Ad requests and Impressions.
- Read the notices in your AdSense account.
- Deliberately give consent and reload.
- Deactivate the caching and optimisation plugin as a test, clear all caches.
- Check the ad container in developer tools for width and visibility.
- Open
/ads.txtin a browser. - Check for duplicate ad plugins and duplicate snippets.
Prevention: fewer places where things can go wrong
Most of these causes come from ad code being scattered across several places: a snippet in the theme, one in the consent tool, a block in a widget area. The fewer places involved, the shorter the search. Managing it centrally helps more here than any single feature, because the code lives in one place, consent gating comes with it, and local statistics show immediately whether a slot was served at all.
That is what our ad plugin Adjet is built around: an AdSense assistant instead of copy and paste, consent gating and lazy loading built in, automatic placement independent of the theme, and per unit statistics on impressions and clicks that stay in your own database. The question "is anything being served, or am I the only one seeing nothing?" becomes two clicks instead of an hour of searching. You do not need a plugin to debug this, though. Every step above works with any way of embedding the code. Adjet is free on WordPress.org, and what the paid tier costs is on our pricing page.
Fewer places to search when ads go missing
Adjet manages AdSense and your own ad blocks centrally: assistant, consent gating, automatic placement and local per block statistics, free on WordPress.org.
Frequently asked questions
Why is AdSense not showing on my site?
Most of the time it is one of four causes: the account or the ad unit has not been approved yet, a consent banner is blocking the script until consent is given, an ad blocker in your own browser is hiding the slot, or the code disappeared during the last theme update. So check first in an incognito window with no extensions whether the ad appears there, and search the page source for the call to pagead2.googlesyndication.com.
How long does it take for a new ad unit to serve?
A freshly created ad unit or a site that was only just approved rarely serves straight away. A few hours without ads is normal before the slot fills. Before you rebuild anything you should therefore wait at least half a day and check again. A significant share of supposed faults resolve themselves in that time.
Can a cookie banner be the reason no ads appear?
Yes, and wherever consent management is in place it is the most common technical cause. Personalised advertising needs consent, so consent tools block the AdSense script until the visitor agrees. Test deliberately with consent given and reload the page. If the ad appears then, the consent tool configuration is at fault and not the ad code.
Why is the ad slot only sometimes empty?
Because not every request gets filled. If a slot is occasionally empty while the AdSense report shows Ad requests, there was simply no matching bid for that request, which is normal with a specific niche, small reach or unusual formats. Extensive blocking controls amplify the effect, because they exclude possible bidders. In the ad unit settings you decide what should happen when nothing is returned.
Can caching plugins block AdSense?
Yes. Three features stand out: combining or minifying JavaScript, delaying JavaScript until the first interaction, and a stale cache still serving the page version from before your change. Deactivate the optimisation plugin as a test and clear every cache. If the ad appears, add the AdSense domain to the exclusion list instead of switching the optimisation off entirely.