Guide

How to Audit an OpenAI Ads Tracking Setup

A complete OpenAI Ads tracking audit checks seven layers: pixel presence and load, Content Security Policy configuration, event coverage, payload validity, deduplication between pixel and CAPI, server-side CAPI health, and attribution integrity through the oppref parameter — plus a check on consent-tool behavior, since it can silently disable any layer above it. Most setups fail on two or three layers at once, not all seven, so the goal is finding exactly which ones and fixing those first.

"Is my tracking working?" is a harder question than it sounds, because tracking can be partially working in ways that look fine on the surface. The pixel loads, events appear to fire, and Ads Manager shows some conversions — but a CSP rule silently blocks half your traffic, event_id generation is inconsistent so dedup never triggers, or a checkout redirect strips the attribution parameter. None of that surfaces unless you go looking for it in a structured way — which is what this seven-layer framework does.

The 7-layer audit framework

Each layer is checked independently — a pass on one tells you nothing about the others. That's deliberate: the most common failures are ones where four layers pass cleanly and the fifth quietly drops a chunk of your conversions.

LayerWhat to checkHow to check itPass criteria
1. Pixel presence & loadWhether the SDK script is on the page and loads successfullyBrowser dev tools → Network tab, filter oaiqRequest to oaiq.min.js from bzrcdn.openai.com returns 200 on every page you want tracked
2. CSP configurationWhether your Content Security Policy allows the pixel's domainsBrowser console for CSP violation messages; inspect response headersscript-src includes bzrcdn.openai.com; connect-src and img-src include bzr.openai.com
3. Event coverageWhether every funnel step you care about fires a standard eventMap your funnel against the standard event list; trigger each step manuallyEvery relevant step (view, add-to-cart, checkout, purchase, lead, signup) fires a corresponding oaiq("measure", ...) call
4. Payload validityWhether event data is correctly formattedInspect the event payload in dev tools or the pixel helper extensionAmounts are ISO 4217 minor-unit integers with a currency code attached; required fields present for each event type
5. DeduplicationWhether pixel and CAPI events for the same conversion are recognized as one event, not twoPlace a test order; compare the event_id sent client-side against the id sent server-sideSame Pixel ID, same event_id/id value, and (for custom events) identical custom_event_name on both sides
6. CAPI healthWhether server-side events are actually reaching OpenAI successfullyCheck your server logs / API response codes for the CAPI POSTPOST to https://bzr.openai.com/v1/events?pid=PIXEL-ID returns success, not a batch-level rejection from one malformed event
7. Attribution (oppref)Whether the attribution parameter from an ad click survives to the point where events fireClick a tagged ad link, inspect the landing URL and the __oppref cookie, then check whether server-side events include itoppref value present in landing URL, stored in __oppref cookie, and — if CAPI is involved — explicitly forwarded by your backend

A consent-tool check runs alongside all seven layers rather than as an eighth, because a misconfigured consent banner doesn't fail on its own — it disables the pixel (layer 1), cascading into coverage, payload, and dedup failures that would otherwise pass. Test with consent both accepted and declined, and confirm the accept action actually triggers pixel initialization rather than just permitting it on a future page load.

Layer 1: Pixel presence and load

Open dev tools (F12 or right-click → Inspect), go to the Network tab, and reload. Filter for oaiq. You should see a request to oaiq.min.js from bzrcdn.openai.com returning 200. No request at all means the script isn't on the page, or something blocks it before it fires — check placement first, then ad blockers. A request shown but blocked or failed (often flagged red) points to CSP — move to layer 2.

Run this on every page template you expect to track, not just the homepage — a pixel that loads on your landing page but not your checkout page is a common, easy-to-miss gap. If you'd rather not read raw network requests, the OpenAI Ads Pixel Helper Chrome extension runs this check automatically and shows live oaiq events as you browse, speeding up layers 1, 3, and 4 considerably.

Layer 2: Content Security Policy

If your site sends CSP headers, the pixel needs explicit allowances or the browser blocks it outright — not a third-party tool, the browser enforcing your own policy. Required directives: script-src must include bzrcdn.openai.com, and connect-src plus img-src must include bzr.openai.com.

Check the browser console (not just Network) for a message mentioning "Content Security Policy" or "refused to load/connect" — one of the clearer errors browsers give you. Fix it by updating your CSP header, or your CMS/hosting platform's CSP settings if you don't control raw headers — a frequent issue on page builders and headless CMS platforms that ship a locked-down default policy with no obvious way to add exceptions.

Layer 3: Event coverage

List every funnel step that should produce a standard event — page_viewed, contents_viewed, items_added, checkout_started, order_created, lead_created, registration_completed, subscription_created, trial_started (full definitions in the supported events reference) — then trigger each one manually and confirm the corresponding oaiq("measure", ...) call fires.

Common gaps: single-page apps where the pixel initializes once but events tied to route changes never re-fire; multi-step checkouts where checkout_started fires but order_created doesn't because the confirmation page uses a different template; and lead forms embedded via third-party widgets where submission happens inside an iframe the pixel never touches. A pass here means every funnel step has a corresponding event, not that events exist somewhere on the site in general.

Layer 4: Payload validity

An event can fire successfully and still be wrong. Inspect the actual payload — in the Network tab's request preview, or via the pixel helper extension — for two things: amounts must be ISO 4217 minor-unit integers with a currency code attached ($129.99 USD is 12999, not 129.99), and required fields must be present per event type, since a missing field is a common reason a batch gets rejected downstream at layer 6 even though the event fired correctly. Test one whole-dollar order and one with cents to catch rounding bugs.

Layer 5: Deduplication

If you're running both pixel and CAPI — the setup OpenAI's own measurement guidance recommends — place one test order and trace it through both channels. Confirm an event_id is passed in the options argument of the pixel's oaiq("measure", ...) call, the matching value is sent as id in the CAPI payload, both events use the same Pixel ID, and for custom events, custom_event_name matches exactly (lead_form_submit client-side vs. lead_submitted server-side defeats dedup even with matching IDs).

Fastest confirmation: count resulting conversions in Ads Manager for that test order. One real order should produce one counted conversion — two means pixel and CAPI are sending mismatched IDs. Full detail: deduplicating pixel and CAPI event IDs.

Layer 6: CAPI health

CAPI sends events server-to-server via a POST to https://bzr.openai.com/v1/events?pid=PIXEL-ID, authenticated with a Bearer API key. Check it via server logs, not dev tools. Confirm: non-success responses get logged and alerted on, not dropped silently; validation catches malformed events before batching, since one bad event fails an entire batch of up to 1,000; timestamp_ms falls within the last 7 days and no more than 10 minutes in the future; and every event includes id, type, timestamp_ms, plus source_url when action_source is web. Full schema: Conversions API docs.

Layer 7: Attribution integrity

This is the layer most audits skip, and the one that breaks silently most often. Clicks from ChatGPT ads carry an oppref value appended to the landing URL. The pixel reads that value into a first-party __oppref cookie with roughly a 30-day window, then attaches it automatically to pixel events. CAPI does not capture this automatically — server-side events need your backend to read the cookie and forward the value explicitly.

To check: click a tagged ad preview link, or a URL with an oppref value manually appended, and confirm it survives to the landing page — redirect chains, consent-wall navigations, and http→https or www-canonicalizing redirects can all strip it first. Check the __oppref cookie in dev tools' Application/Storage tab to confirm it was set, and if running CAPI, check whether the value shows up in server-side payloads or gets silently dropped.

Everything upstream can pass — pixel loads, events fire, payloads validate, dedup works — and attribution can still be broken, because none of those checks touch whether the right event got tied to the right ad. Our guide on preserving OpenAI Ads attribution with UTM and oppref handling covers this failure mode in depth.

Scoring your audit and prioritizing fixes

Once you've run all seven layers, sort what you found into two buckets rather than treating every failure as equally urgent.

Critical — fix before spending more on ads: pixel not loading on any page template (layer 1), CSP blocking the pixel entirely (layer 2), missing coverage on order_created or lead_created (layer 3), dedup inflating reported conversions (layer 5), and attribution parameters stripped before the pixel loads (layer 7). These directly distort budget and bidding decisions — a campaign that looks underperforming because half its conversions never got counted, or overperforming because every order counted twice, leads to real misallocated spend.

Cosmetic — fix, but not urgently: missing coverage on a secondary event like contents_viewed on a low-traffic page, payload formatting issues on an event type you send rarely, or CAPI timestamp rejections limited to a known, low-volume batch job.

The distinction isn't about difficulty — some critical issues are a one-line CSP header change, and some cosmetic ones need real engineering time. It's about what's currently distorting your data versus what's a minor gap in an otherwise accurate picture.

How often to re-audit

Tracking setups don't break once and stay broken — they break again after specific triggers, so re-run this framework (or at least layers 1, 2, and 7) after: a theme, template, or site redesign; a CMS, hosting, or platform migration; launching a new campaign type that drives traffic to a landing page you haven't checked before; any change to your consent management platform's default category settings; and quarterly regardless of known changes, since redirects and plugin updates accumulate quietly on their own.

DIY vs. professional audit

Everything above is the audit you can run yourself, and it's genuinely thorough — working through all seven layers catches the large majority of tracking problems, at no cost but your time. There's no hidden step withheld to make the paid version look necessary.

What a professional audit adds isn't a different checklist — it's what's tedious or easy to shortcut alone: a documented record of what was checked and found at each layer, a prioritized fixes list specific to your setup, and a second set of eyes that isn't the same person who built (and might unconsciously defend) the current implementation. Our $450 tracking audit runs this same seven-layer framework against your live setup, delivers findings within 48 hours, and credits the full fee toward any setup service if you move forward afterward.

If you're comfortable in dev tools, run the self-audit first. If it turns up more than one or two issues, or you want documented findings to hand a developer instead of translating them yourself, that's where the paid version earns its cost.


Most tracking problems aren't dramatic — they're one layer out of seven quietly underperforming while the rest look fine. Running through all seven turns "I think our tracking is probably okay" into a specific, checkable answer.

Want this done for you?

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

Explore the serviceTake the free audit