Real fixes from seven live sites. No pitch.Log in / My reports
Idea to Traffic Pressure Test

AdSense Approved but Ads Not Showing: What to Check

Most of the time ads are missing after approval because the site status is not yet Ready, the ad code is not on the live page, Auto ads was never switched on, or an ad blocker, ads.txt problem or security header is stopping them. New code can also take up to an hour to start serving. Check each in order and look at the data-ad-status attribute on your ad slot to see whether AdSense filled it.

Getting the approval email feels like the finish line, so it is deflating to load your site and see nothing but empty space where the ads should be. The good news is that this is almost never a second rejection. In nearly every case one of a short list of things is blocking or delaying ad serving, and you can rule each one out in a few minutes. Work through the checks below in order, because they run from most common to least common.

First, confirm what approved actually means

Open AdSense and go to Sites. The status column for your domain should read Ready. If it still says Getting ready or Requires review, the account may be approved but that specific site is not, and no ads will serve on it yet. Also check the exact domain. AdSense covers the root domain and its subdomains, so if you added example.com, both www.example.com and blog.example.com are fine. If you added a different domain or a misspelled one, the site you are testing is not covered.

Next, open Policy center. If you see an ad serving limit or a site level policy issue, that is your answer. A serving limit means Google is showing fewer ads, sometimes none, while it assesses traffic quality. New accounts often see one for the first few weeks. You cannot speed it up, but you can make sure you are not sending invalid traffic, which brings us to the next point.

Give it time, and stop refreshing your own pages

Google says new ad code and new ad units can take up to an hour to start showing ads. Auto ads changes can take a similar amount of time to apply. If you approved, pasted code and checked five minutes later, wait before changing anything.

While you wait, do not keep reloading your own pages to see if ads appeared, and never click them. Repeated self views from one IP on a brand new account look exactly like the low quality traffic that triggers serving limits. Use the checks below, which read the page code instead of relying on ad impressions.

Check the ad code is really on the live page

A surprising number of cases come down to the code being in a theme file, a staging build or a cached copy, but not on the page visitors receive. Fetch the live HTML and search it:

curl -s https://yourdomain.com/ | grep -o 'adsbygoogle.js?client=ca-pub-[0-9]*'

You should see one line with your publisher ID. If you get nothing, the script is not deployed. If the ID differs from the one shown under Account > Settings > Account information, you pasted code from another account or an old template. On a static host like Cloudflare Pages, rebuild and redeploy, then purge the cache. On WordPress, clear the page cache plugin and any CDN cache.

Then confirm Auto ads is on if you rely on it. Go to Ads > By site, click the pencil next to your domain, and make sure the Auto ads toggle is enabled and you clicked Apply. Approval does not switch Auto ads on for you. If you use manual ad units instead, each unit needs the <ins class="adsbygoogle"> tag plus the (adsbygoogle = window.adsbygoogle || []).push({}); line right after it.

Read the browser console and the ad slot status

Open the page in a private window with every extension disabled, since your own ad blocker hides ads and is the single most common false alarm. Press F12, open the Console tab and look for messages that start with adsbygoogle.push() error. The two you will meet most often:

  • No slot size for availableWidth=0: the ad container is hidden or has zero width when the script runs. This happens with ads inside collapsed menus, tabs, or flex columns with no set width. Give the parent element a real width.
  • All 'ins' elements in the DOM with class=adsbygoogle already have ads in them: you called push more times than you have ad slots, usually because the snippet is pasted twice. Remove the duplicate.

Next, in the Elements tab, inspect an ad slot. AdSense adds a data-ad-status attribute to each ins tag after it tries to fill it. A value of filled means an ad was served and something on your page is hiding it, often CSS like display:none or a height of 0. A value of unfilled means AdSense had no ad to show for that request, which points to serving limits, low demand, or ads.txt, covered next.

Fix ads.txt and any security headers blocking Google

Back on the Sites page, look at the ads.txt status. If it says Not found or Unauthorized, advertisers have less reason to bid and you can lose most of your fill. The file must live at the root of your domain and contain your line exactly:

google.com, pub-1234567890123456, DIRECT, f08c47fec0942fa0

Swap in your own publisher number, then check it is reachable with curl -sI https://yourdomain.com/ads.txt. You want a 200 status and a content type of text/plain. A redirect chain or an HTML page served at that address will not count. AdSense rechecks the file on its own schedule, so the status can take a few days to update even after you fix it.

If you set a Content Security Policy, for example in a Cloudflare Pages _headers file or a security plugin, it can silently block the ad script and its frames. The console will show messages starting with Refused to load. Your policy needs to allow at least these hosts in its script, frame and image rules:

https://pagead2.googlesyndication.com
https://googleads.g.doubleclick.net
https://tpc.googlesyndication.com
https://*.adtrafficquality.google

The simplest test is to remove the CSP header temporarily, redeploy, and check whether ads load. If they do, add the hosts back in one rule at a time.

If everything checks out and slots stay unfilled

If the code is live, the console is clean, ads.txt is authorized and the slots still say unfilled, the cause is usually on the demand side. Very new sites with only a handful of daily visitors get fewer ad requests filled, and some niches and countries have thin advertiser demand. Fill improves as real search traffic grows, so the useful work at that point is content and indexing, not more ad tweaks. If a serving limit is listed in Policy center, Google says it lifts automatically once its traffic assessment is done.

A quick way to rule out structural problems at the same time is to run your homepage through the free Idea to Traffic site checker, which reads your live page, ads.txt and headers the way a crawler sees them. Fix anything it flags, wait a day, and check the ad slot status again before changing anything else.

Where this question came from

Questions people actually ask

How long after AdSense approval do ads start showing?

Google says new ad code and new ad units can take up to an hour to begin serving. If nothing appears after a few hours, the cause is usually the site status, missing code, an ad serving limit, or something on the page blocking the ad.

Why do I see blank space where my AdSense ad should be?

Inspect the ins tag. If data-ad-status is unfilled, AdSense had no ad for that request, which points to serving limits, low demand or ads.txt. If it is filled, your own CSS or an ad blocker is hiding it.

Does Auto ads turn on automatically after approval?

No. Go to Ads, then By site, click the pencil next to your domain, enable Auto ads and click Apply. It can take around an hour to take effect.

Can an ad serving limit stop all ads on a new account?

Yes. A limit can reduce ads to very few or none while Google assesses your traffic. It appears in Policy center and lifts automatically once the assessment is done, so avoid reloading or clicking your own ads in the meantime.