Find out why an ad slot is empty
publisherRun the on-page debugger to get the exact reason an ad slot did not fill, directly on your live website.
1. Opening the on-page publisher debugger
When an ad slot on your website appears blank, guessing the cause is unnecessary. The AdServeKit ad delivery tag (ad.js) includes a built-in visual diagnostic tool that inspects live ad requests on your page.
To open the debugger, append ?adserve_debug=1 to the URL of any page on your website containing an ad slot (for example, https://example.com/article?adserve_debug=1). If the URL already contains a query string, append &adserve_debug=1.
The floating AdServeKit Debugger bar will appear over your page, outlining every house-ad-slot container with a diagnostic border. The tool is safe to use on live production pages and is visible only in your browser tab.
Example debug URL
https://example.com/article?adserve_debug=12. Status codes and what they mean
Click on any ad slot in the debugger overlay to view its delivery diagnostic report:
- SUCCESS / SERVED: An ad was selected, delivered, and rendered in the slot.
- NO_ELIGIBLE_CAMPAIGN: No active campaign is targeting this placement or website. Confirm that a campaign targeting this placement is set to Active in your dashboard.
- SIZE_MISMATCH: A campaign is active, but none of its attached creatives match the slot dimensions. Open Creatives, add the missing dimension variant, and Publish Revision.
- OUTSIDE_SCHEDULE: The campaign start date is in the future, the end date has passed, or the current time is excluded by dayparting. Check flight dates and timezone settings.
- BUDGET_EXHAUSTED: The campaign has reached its daily budget cap or total lifetime budget. Increase the budget limit or wait for the midnight reset.
- FREQUENCY_CAPPED: The campaign is active, but your browser has reached the maximum allowed impressions for the configured time window. Test in an Incognito window.
- DOMAIN_UNVERIFIED / INVALID_DELIVERY: The request origin domain does not match an authorized, verified domain on the website record. Add the hostname under Authorized Domains.
- GEO_TARGETING_EXCLUDED: Your current IP country is excluded by the campaign geographic rules.
- DEVICE_TARGETING_EXCLUDED: Your current device (mobile, desktop, tablet) is excluded by campaign settings.
3. Why pageviews do not equal ad impressions
A common concern for publishers is why total pageviews in Google Analytics do not match rendered ad impressions in AdServeKit. This discrepancy is standard in digital advertising:
- Lazy Loading: Slots below the fold only request an ad when the user scrolls near them. Visitors who exit before scrolling generate a pageview but zero ad requests.
- Content Blockers: Privacy extensions and ad-blocking browsers block ad.js from loading, stopping the ad request before it reaches the server.
- No-Fill Events: If a placement has no active campaign or fallback creative matching its dimensions, an ad request occurs but no impression renders.
- Rapid Bounces: Visitors who close the tab before the creative finishes rendering never trigger an impression confirmation beacon.
- Viewability Standards: A rendered impression confirms the ad was drawn; a viewable impression requires at least 50% of the ad area to remain visible on screen for at least 1 continuous second.
4. Troubleshooting when the debugger does not appear
If appending ?adserve_debug=1 does not display the debugger overlay:
1. Confirm that ad.js is loaded in the page source: View source and ensure <script async src="https://api.adservekit.com/ad.js"></script> is present.
2. Check for ad blockers: Disable browser extensions that block script execution.
3. Check Content Security Policy (CSP): If your web server emits a restrictive CSP header, ensure api.adservekit.com is allowed in script-src and connect-src directives.