Troubleshooting

Pick the symptom that matches what you're seeing. Each section walks through the most likely causes in order.

Impressions aren't recording

Work through these in order. The first hit is usually the answer.

1. Do you (or your test users) have an ad blocker?

uBlock Origin, AdBlock, Brave Shields, and Pi-hole could block adventory.to. The script never loads, the pixel never fires, and there's no error in the console: from your code's perspective the request just disappears. Disable your blocker for your domain (or test in a clean browser profile) before assuming the integration is broken.

2. Are you on a test origin?

Local dev hostnames are silently dropped, even with a valid placement. Pixel calls from localhost, 127.x.x.x, *.test, *.local, example.com, or file:// URLs return the GIF but record nothing. Full list: Domain validation. Fix: test on the registered domain, or use ?test=1 on serve while developing.

3. Are you firing the pixel from a server?

Server-side runtimes (Node, Python, PHP, Go) don't set Referer automatically. The impression endpoint validates it against the placement's registered domain. Set the header explicitly to the URL of the page where the ad was rendered. Code samples: Server-side pixel fire.

4. Is the placement still pending?

While your placement is in pending, serve returns a placeholder test ad with impression_url: null. Pixel calls don't record anything because there's no URL to call. See Verification for the lifecycle.

5. Is serve returning {"ad": null}?

No-fill happens when there's no campaign matching your visitor's region right now, or when active campaigns have exhausted their daily budget. Nothing is wrong with your integration; the network just doesn't have an ad to serve. Your code should handle ad: null gracefully (hide the slot or show fallback content).

6. Are you the same visitor calling twice?

Pixel fires deduplicate per (IP, placement, campaign) in a 1-hour window. If you reload the page on the same IP within an hour, only the first impression counts. This is intentional: it prevents one visitor refreshing from inflating your earnings or burning the advertiser's budget.

My placement is stuck in pending

Domain review is usually wrapped within a business day or two. The placement flips from pending to active in the dashboard once an admin signs off. If it's been more than three business days, email support@adventory.to with your placement ID and we'll take a look.

While pending, you can still wire up your integration end-to-end. Serve returns a placeholder test ad so you can render and click through. Just be aware that pending impressions don't count toward verification: you need a real impression after approval to flip to live.

My response has different field names than the docs

The canonical response shape is in Serve endpoint reference. The fields are product_name, headline, logo, cta_text, click_url, impression_url, colors, placement_type, and attribution. If you saw title, description, or image elsewhere, that was an outdated example; trust the live response and the reference page.

I'm only seeing test ads instead of paid ones

Two common causes:

  • Placement is still pending: you'll see a placeholder ad until your domain is approved. See Verification.
  • You're using ?test=1 on serve: test mode returns a real ad but with impression_url: null, so nothing records. Remove the parameter to record real impressions.

Server-side: I record one impression per hour, not per visitor

You're probably not forwarding the visitor's IP. Without the ip parameter on serve, every visitor is hashed under your server's single IP, and dedup collapses them all into one event per hour. Pass the real visitor IP via the ip query parameter. If you're behind a proxy or CDN, read the IP from the forwarded header (X-Forwarded-For, CF-Connecting-IP, etc.), not the raw socket address. See Server-side fetch.

Still stuck?

Email support@adventory.to with your placement ID, what you're seeing, and the integration path you're using (script, API browser, API server). We'll dig into the logs.