Guide

OpenAI Ads Pixel Not Firing: Causes and Fixes

The five most common reasons an OpenAI Ads pixel shows no events, ranked by frequency: the script is placed wrong on the page (or loads after the event it's supposed to catch), an ad blocker or privacy extension blocks it outright, a Content Security Policy silently rejects the script, a cookie-consent tool gates it behind a banner nobody clicks, or the Pixel ID itself is wrong or duplicated. Most of these take under ten minutes to confirm using your browser's dev tools — start there before assuming anything is fundamentally broken.

The 2-minute self-check

Before working through individual causes, run this check — it tells you which category of problem you're dealing with in about two minutes.

  1. Open your site in a browser, open dev tools (F12 or right-click → Inspect), and go to the Network tab.
  2. Reload the page and filter for oaiq. You should see a request to oaiq.min.js from bzrcdn.openai.com returning a 200 status. - No request at all → the script tag isn't on the page, or it's blocked before the request fires. Go to Cause 1 or Cause 2. - Request shown but blocked/failed (often labeled by the browser as blocked, or status shows red) → likely Cause 3, a CSP issue. - 200 status, script loads fine → the pixel itself is working; the problem is downstream. Continue to step 3.
  3. Trigger the event you're testing (view a page, add to cart, submit a form) and watch for a POST request to bzr.openai.com. - No POST fires → check Cause 4 (consent gating) or confirm the event code is actually wired to that action. - POST fires but nothing shows in Ads Manager → check Cause 5, a Pixel ID mismatch, or that debug mode is masking real sends.

If you'd rather not read raw network requests, the free OpenAI Ads Pixel Helper Chrome extension runs a version of this check automatically and flags which stage is failing.

Cause 1: The script is in the wrong place

The single most common issue isn't that the pixel is missing — it's that it's placed somewhere that doesn't execute reliably, or loads after the event it's meant to capture.

Common variations of this problem:

  • The script tag is inside a footer that loads after page interaction has already started (a fast form submit or quick page exit happens before the pixel ever initializes).
  • The pixel is added via a tag manager, but the trigger condition for firing it never actually matches the page or event it's supposed to cover.
  • The oaiq("init", ...) call runs, but the oaiq("measure", ...) call for a specific event lives in code that executes conditionally and that condition is false in production even though it worked in staging.
  • On single-page apps, the pixel initializes once on load but events tied to client-side route changes never fire, since nothing re-triggers measure calls on navigation.

Fix: Confirm oaiq("init", {pixelId: "..."}) runs on every page you want tracked, as early as reasonably possible in the page load, and that each oaiq("measure", eventName, eventData, options) call is wired directly to the action it represents — not to a page load that happens to precede it. If you're using a tag manager, preview mode should show the tag firing at the exact moment of the real user action, not just "on page load" for everything.

Cause 2: An ad blocker is stopping it

Ad blockers, tracking-protection browser extensions, and some antivirus "web protection" tools block tracking scripts by domain pattern. If bzrcdn.openai.com or bzr.openai.com matches a blocklist rule on the visitor's machine, the pixel never loads, or it loads but its outbound event calls get silently dropped.

How to confirm this is what's happening: Run the same self-check above in an incognito/private window with extensions disabled. If the pixel suddenly works, an ad blocker was the cause on your original test.

What you can actually do about it: Not much, on the browser side — you can't force a user's ad blocker to allow your script, and trying to disguise the request as something else isn't a reliable or advisable fix. This is precisely why pixel-only measurement structurally undercounts: some real percentage of visitors run blocking tools, and no amount of pixel debugging recovers those events. The fix here isn't a pixel fix at all — it's adding server-side measurement so those conversions get counted regardless of what's blocked in the browser. See what CAPI recovers below.

Cause 3: A Content Security Policy (CSP) is rejecting it

If your site sends CSP headers — common on security-conscious sites, and increasingly common by default on modern hosting platforms — the pixel needs explicit allowances or it gets blocked by the browser itself, not by any third-party tool.

Required CSP directives:

  • script-src must include bzrcdn.openai.com (where the SDK script loads from).
  • connect-src must include bzr.openai.com (where events get sent).
  • img-src must include bzr.openai.com (some event delivery paths use image-based requests).

How to confirm this is the cause: Check the browser console (not just the Network tab) for a message that explicitly mentions "Content Security Policy" or "refused to load/connect." This is one of the clearer error messages browsers give you — if you see it, you've found the cause immediately.

Fix: Update your CSP header (or your CMS/platform's CSP settings, if you don't control raw headers directly) to explicitly allow the three directives above. This is a common issue with page builders and headless CMS platforms that ship a locked-down default CSP without an easy interface for adding third-party script exceptions — sometimes it means editing a config file or hosting setting rather than anything on the page itself.

If you run a cookie consent banner or consent management platform (CMP), it's common — and often required for compliance — to hold tracking scripts back until a visitor actively accepts. The problem shows up when the gating is too aggressive or misconfigured: the pixel gets blocked even after consent is given, or it's categorized under a consent bucket most visitors decline by default.

Common variations:

  • The pixel is categorized as "marketing" or "advertising" cookies, and your CMP's default banner state has that category off until explicit opt-in — meaning any visitor who doesn't interact with the banner (a large share of traffic, in practice) never gets tracked at all.
  • The CMP blocks the script correctly, but the "accept" action doesn't actually trigger pixel initialization afterward — it just permits future page loads to fire it, so the current session is lost.
  • Consent-gating logic checks for a consent flag that's named differently than what the CMP actually sets.

Fix: Confirm what happens the instant a visitor clicks "accept" — does the pixel initialize immediately, or does it require a page reload? If it requires a reload, you're losing same-session events. Also confirm your event mapping in the CMP corresponds to how the pixel is categorized on your own compliance review — worth checking with whoever manages consent compliance for your site, since the correct answer depends on jurisdiction and privacy policy, not just what's technically easiest.

Cause 5: The Pixel ID is wrong, duplicated, or mismatched

This sounds too simple to be a real cause, but it happens more than you'd expect, especially on sites managed by more than one person or migrated between environments.

Common variations:

  • A staging or test Pixel ID was never swapped for the production one before launch.
  • Two different Pixel IDs exist — one from an early setup attempt, one from a later one — and only one is actually connected to the campaign you're checking results for in Ads Manager.
  • The Pixel ID is correct in the pixel's init call but different in the CAPI pid query parameter, so client and server events land under two different IDs and never reconcile, let alone deduplicate.
  • The Pixel ID was copy-pasted with a trailing space or invisible character, which some code will silently accept without throwing an obvious error.

Fix: Go to the conversions tab in OpenAI Ads Manager and confirm the exact Pixel ID tied to the campaign you're reviewing. Then check that identical ID against both your pixel init call and, if you have one running, your CAPI pid parameter. If they don't match exactly, that's the fix — and it's worth double-checking character-by-character rather than assuming a quick visual scan caught it.

What CAPI recovers when the pixel is partially blocked

If you've worked through causes 1–5 above and the pixel is now firing correctly, you may still be undercounting — not from a bug, but from the structural limitation covered in Cause 2: ad blockers, Safari ITP, and users closing tabs early all prevent client-side events regardless of how well the pixel itself is configured.

This is what the Conversions API is for. CAPI sends the same event types directly from your server — order_created, lead_created, and the rest — bypassing the browser entirely, so it isn't affected by ad blockers, cookie restrictions, or a visitor leaving the page early. Implemented correctly alongside the pixel, with matching event_id / id values for deduplication, CAPI recovers the conversions that were always real but never had a chance to fire client-side.

Our Conversions API setup guide covers the full implementation, and secure CAPI implementation covers how to handle the API key and payload security correctly. Official technical detail is in OpenAI's own Conversions API docs and supported events reference.

When to stop self-diagnosing

If you've worked through all five causes above, confirmed the 2-minute self-check shows a 200 on oaiq.min.js and successful POSTs to bzr.openai.com, and Ads Manager still shows fewer conversions than your backend does — you've likely hit the point where the remaining gap isn't a simple misconfiguration you'll spot by reading through code once more. It's either a deduplication issue, a partial CAPI implementation, or an edge case specific to your site's setup (a particular page template, a specific browser, a checkout flow with an unusual redirect pattern).

At that point, a free readiness audit gives you a quick read on obvious gaps, and the professional tracking audit — a paid, structured review with a 48-hour turnaround — is built specifically to find what a self-check misses, with the fee credited toward a setup if you move forward with one. Continuing to guess at causes past this point usually costs more in delayed, poorly-optimized ad spend than the audit itself does.


Fixing a silent pixel is almost always faster than it feels while you're in the middle of it — the causes above cover the large majority of cases, and most resolve in one sitting once you know which of the five you're looking at.

Want this done for you?

Fixed-scope setup, tested end-to-end and documented.

Explore the serviceTake the free audit