Find out why an ad slot is empty

publisher

Run 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=1

2. 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.

Documentation feedback

AdServeKit evolves over time. If you notice information that appears outdated or inconsistent with the current dashboard, please report it so we can update the guide.