bzrcdn.openai.com/sdk/oaiq.min.js (not ads.openai.com, which returns a 403), and init takes an object, not a string. If your site runs a Content Security Policy, it will silently block the pixel unless you allowlist OpenAI's domains. When a ChatGPT Ads campaign shows zero conversions, the problem is almost always measurement, not the ads.
Zero conversions on day one
We got into the ChatGPT Ads beta and ran a campaign on ourselves. Day one, the dashboard showed zero conversions.
The instinct is to blame the ads and start rewriting them. That was not the problem. The measurement was not wired up. The pixel was firing in the browser but never reaching OpenAI, so every click looked worthless when in fact we just could not see what was happening.
If you are setting up ChatGPT Ads, here is exactly how conversion tracking works, and the three things the current crop of guides get wrong.
There are two ways to send conversions back
OpenAI gives you two measurement paths:
- The Pixel. A small piece of JavaScript on your site that measures what people do after they click your ad. Fast to install, good enough to start.
- The Conversions API. Server-to-server. You send conversion data straight from your systems. More reliable, because it survives ad blockers and cookie loss. This is the upgrade once the pixel is proven.
Most advertisers will start with the pixel. So that is where the mistakes happen.
The pixel mistake everyone copies
Several third-party guides publish the wrong loader URL. They point the pixel at ads.openai.com/pixel.js. That is the gated Ads Manager app, and it returns a 403. Your pixel never loads.
The real SDK loads from https://bzrcdn.openai.com/sdk/oaiq.min.js, and init takes an object, not a string:
<script>
(function (w, d, s, u) {
if (w.oaiq) return;
var q = function () { q.q.push(arguments); };
q.q = []; w.oaiq = q;
var js = d.createElement(s); js.async = true; js.src = u;
var f = d.getElementsByTagName(s)[0]; f.parentNode.insertBefore(js, f);
})(window, document, "script", "https://bzrcdn.openai.com/sdk/oaiq.min.js");
oaiq("init", { pixelId: "YOUR-PIXEL-ID" });
oaiq("measure", "page_viewed");
</script>
Standard events include page_viewed, lead_created, order_created, registration_completed and subscription_created. You fire them with oaiq("measure", eventName, data) at the moment the action happens.
Always copy the verbatim snippet from Ads Manager, under Tools then Conversions, or from OpenAI's developer docs. Do not trust a blog (including this one) over OpenAI's own code.
The silent killer: your Content Security Policy
This is the one that cost us a day, and it will catch most modern sites.
If your site runs a Content Security Policy, and most do, it will block the pixel unless you explicitly allow OpenAI. You need:
bzrcdn.openai.comin yourscript-src, so the SDK can loadbzr.openai.comin yourconnect-src, so events can be sent
Miss this and the failure is invisible. The script never loads, the events queue up in the browser, and the dashboard shows zero. No error message. Just silence.
We have seen this exact shape before. Last quarter a single CSP rule silently broke our Google Ads conversion tag, and the account looked dead for over a week before anyone thought to check the security headers rather than the campaign. Different platform, same lesson.
How to check it is actually working
Three quick checks:
- Open your browser dev tools, Network tab. Confirm
oaiq.min.jsloads with a 200, and that events post tobzr.openai.comand come back 202. - In Ads Manager, the event stream should show events arriving. Allow a few minutes for ingestion.
- Link the conversion event to your campaign. If you do not, the campaign cannot optimise toward it and the warnings never clear.
The bigger point
ChatGPT Ads does not work like Google. You do not bid on keywords. You describe the conversation you want to appear in, and the system matches your ad to it. It is closer to writing a brief than building a keyword list.
And if your brand is not showing up in those AI answers organically in the first place, that is a separate and prior problem. We break down why competitors appear in AI answers and you don't in a companion piece.
But none of that matters if you cannot measure. The advertisers who lose money in this beta will not lose it on bad creative. They will run for weeks before realising nothing was ever being counted.
So if you start running ChatGPT Ads and see zero conversions, check your measurement before you touch the ads. That is almost always where the problem is.
Frequently asked questions
Where does the ChatGPT Ads pixel load from?
The OpenAI Ads measurement pixel SDK loads from https://bzrcdn.openai.com/sdk/oaiq.min.js. It does not load from ads.openai.com, which is the gated Ads Manager app and returns a 403. Several third-party guides publish the wrong URL, so the pixel never loads and the dashboard shows zero conversions.
Why does my ChatGPT Ads pixel show zero conversions?
The three most common causes are the wrong pixel URL, a Content Security Policy blocking the pixel because OpenAI's domains are not allowlisted, and the conversion event not being linked to the campaign in Ads Manager. In each case the ads may be fine and only the measurement is broken.
Do I need to update my Content Security Policy for ChatGPT Ads?
Yes, if your site runs a Content Security Policy. Add bzrcdn.openai.com to script-src so the SDK can load, and bzr.openai.com to connect-src so events can be sent. Without this the script never loads, events queue in the browser and are never transmitted, and the dashboard shows zero with no error message.
What is the difference between the ChatGPT Ads Pixel and the Conversions API?
The Pixel is browser-side JavaScript that measures what people do on your website after clicking an ad. The Conversions API is server-to-server and sends conversion data directly from your systems, which is more reliable because it survives ad blockers and cookie loss. Most advertisers start with the Pixel and add the Conversions API once the funnel is proven.
How do I verify ChatGPT Ads conversion tracking is working?
Open your browser dev tools Network tab and confirm oaiq.min.js loads with a 200 and that events post to bzr.openai.com and return 202. Then check the Ads Manager event stream shows events arriving, allowing a few minutes for ingestion. Finally, confirm the conversion event is linked to the campaign so it can optimise toward it.