Run a ChatGPT ad campaign for a few weeks and you will likely hit the same wall almost every advertiser hits: the platform says people clicked, and your analytics says almost nobody showed up. The B2B lead-generation agency Cleverly ran an identical campaign on ChatGPT, Google, and Meta at the same time. OpenAI's own dashboard logged 57 clicks. Google Analytics logged fewer than 20 sessions from that same campaign, over the same period. That gap is not a fluke. It is the normal experience of anyone spending real money on ChatGPT ads right now.
The gap is not one bug. It is several failure modes stacking on top of each other: in-app click handling that strips the referrer header before it reaches your site, Safari's cookie limits cutting off the pixel's memory of the click, conversions that land days after the fact and outside whatever attribution window is running, view-through and click-through numbers that are easy to blend together by mistake, and a platform dashboard that gives you no way to diagnose any of it because there is no prompt-level or session-level detail underneath the totals. Each of these is individually documented somewhere. Nobody has published what it looks like to account for all of them in one working process.
This is the fix, not another tour of the wreckage. Five moves: a landing path only ChatGPT traffic uses, server-side capture as the browser's backup, pixel and Conversions API wired with real deduplication, a weekly reconciliation of their numbers against yours, and Direct-traffic movement as the tiebreaker when they still disagree. We built the whole thing around a capped test campaign of our own (account, pixel, dedicated path) before writing a word of this. That campaign is deliberately not spending yet, so what you get here is the method, not a victory lap.
The gap, with real numbers
The clearest public data point comes from that Cleverly campaign. Its CEO, Nicholas Verity, ran the same campaign on ChatGPT, Google, and Meta at once, then added UTM tracking codes when the ChatGPT numbers looked off. OpenAI's dashboard reported 57 clicks; Google Analytics reported fewer than 20 sessions from the same campaign over the same period (MediaPost, Aug 2026).
He is not the only one. In the same reporting, Peter Jaffray of Choice OMG put $415 into three ChatGPT ad campaigns in June 2026: about 9,000 impressions, a 0.6% click-through rate, 60 clicks, close to $7 per click, and zero recorded conversions despite traffic that looked legitimate. Daniel Johnson of We Scale Startups described his click counts as never quite lining up with analytics, and not consistently in the same direction. Ryan Edwards of Camino5 relayed an account of a $1,000 test where clicks registered on the platform side with nothing showing up in Google Analytics at all.
None of this reads like one advertiser's tagging mistake. It is the predictable output of how ChatGPT hands off a click, how Safari treats the cookie that handoff depends on, and how conversions that happen after the click get reported. Verity's own conclusion in that reporting was to treat the spend as a research budget rather than a channel to scale. That is a fair default for anyone without a working reconciliation process. The rest of this piece is how to build one.
Why clicks disappear: three compounding failure modes
ChatGPT ads render as a labeled Sponsored card below the model's answer, never inside it; see how ChatGPT ads work for the mechanics of the ad itself. What happens after someone clicks that card is a separate, much murkier system, and it breaks in three specific, well-documented ways.
In-app click handling strips your referrer
ChatGPT's mobile apps do not open links in a normal browser tab. iOS opens them in a WKWebView and Android opens them in Chrome Custom Tabs, in-app browser shells embedded inside the ChatGPT app itself, neither of which reliably passes the HTTP referrer header the way a standalone browser tab does on an ordinary click (Clickport, Aug 2026). Desktop web is not fully safe either: chatgpt.com reportedly serves outbound links under a strict-origin-when-cross-origin referrer policy, which trims the referring URL down to a bare origin at best, and some inline links carry rel="noreferrer", which drops the header entirely regardless of that policy.
Combine a stripped referrer with a UTM parameter that did not survive the same handoff, and Google Analytics has nothing left to group the visit under except its own default for a visit with no referrer and no campaign data: Direct. That is not Analytics malfunctioning. It is doing exactly what it is built to do with a visit that arrives carrying no evidence of where it came from.
Safari's ITP shortens the cookie window your pixel depends on
OpenAI's pixel (referred to in its developer documentation and by most practitioners as the oaiq pixel, following the same naming pattern as Meta's fbq or Google's gtag) captures a privacy-preserving click identifier called oppref from the landing URL and stores it in a first-party cookie so a conversion later in the same visit, or a later visit, can still be tied back to the original click (OpenAI developer documentation, Aug 2026). Safari's Intelligent Tracking Prevention caps first-party cookies set by client-side JavaScript at seven days of storage, and shortens that further, to 24 hours, if the setting domain trips Apple's own tracker classification. Third-party cookies are blocked outright, with no exception (Cometly, Feb 2026).
None of that is specific to ChatGPT. It is how Safari treats every ad platform's client-side pixel. But it lands the same way on any channel with a purchase cycle longer than a week: a Safari user who clicks on a Tuesday and buys nine days later has no browser-side link back to the ad by the time they convert, no matter how correctly the pixel was installed. This is exactly the gap the server-side Conversions API exists to close, because it does not depend on a cookie surviving in the visitor's browser at all.
Delayed conversions land outside whatever window is running
Click-through attribution uses whatever click window is configured on your account. OpenAI's documentation describes it only as "the applicable configured click window," without publishing a default or a stated range. Verify what your account actually uses rather than assuming it matches Google's or Meta's convention. View-through attribution is different and much stricter: a fixed, non-configurable one-day window measured from an ad impression, added to the documentation with no formal announcement around Aug 18-19 2026 (PPC Land, Aug 2026). The interface shows it as a separate line, labeled VTA (1d), and deliberately excludes it from the main Conversions total, which stays click-through only, along with cost-per-acquisition and anything the bidding system optimizes against. A click takes precedence whenever a conversion qualifies for both.
What OpenAI gives you to measure with

Before building a reconciliation process, know what is actually available. If the account and pixel are not installed yet, start with ChatGPT Ads account setup.
The oaiq browser pixel handles standard on-site events: page views, leads, purchases, whatever you define. The server-side Conversions API sends the same kind of event data from your backend straight to OpenAI, bypassing the browser entirely. That matters for two reasons already covered above: it is immune to whatever the browser does to cookies or referrers, and it is the only path for events that never touch a browser at all. An app install or an in-app purchase has to go through the Conversions API, because there is no web pixel running inside a native app.
Both paths can report the same conversion, and that is by design, not a flaw: it is how you cover browser-side and delayed backend-side events for the same customer. To stop that from becoming double counting, both the pixel call and the Conversions API call need to carry the same event_id, an identifier you generate yourself and reuse on the client and server side of the same event. OpenAI's deduplication then matches on the combination of your Pixel ID, the event name, and that event_id, keeping the first event received and discarding later duplicates. Skip this step and you get exactly the kind of double-counting Verity wondered about when his own numbers would not add up.
Advanced matching: hashed data, on by default, your liability
Automatic advanced matching needs no setup by design. Per OpenAI's documentation, the pixel reads whatever a visitor enters into on-page forms (identifiers such as email, phone, name, and location), normalizes it, and hashes each value with SHA-256 inside the visitor's own browser before anything is transmitted; raw customer information is not sent to OpenAI through this feature.
As of Aug 17 2026, this is the default state for every pixel, including ones installed before that date. OpenAI gave existing advertisers a 10-day window, starting from an Aug 7 2026 notice, to turn it off before it switched on automatically. That toggle is reachable through the pixel's data-source settings in the ads interface, with a separate per-event opt-out flag available in the pixel's own event options if you want to exclude specific events rather than the whole account (PPC Land, Aug 2026).
Hashing personal data client-side does not remove it from consent law's scope. A SHA-256 hash of an email address is a pseudonym, not an anonymized value: it is only useful because it can be matched against a known hash, which is the entire point of sending it. If you collected that email under a legal basis that does not cover handing it, hashed or not, to an ad platform for matching, turning advanced matching on can put you in breach regardless of which side OpenAI's default sits on. OpenAI's own position is that establishing that legal basis is the advertiser's job, not the platform's: liability sits with whoever collected the form data.
For EU and UK advertisers this matters twice over, because it is a different toggle from ad personalization. OpenAI's European launch (31 countries across the EEA and Switzerland, from Aug 24 2026) runs with ad personalization off and contextual targeting only, under a legitimate-interest basis with OpenAI Ireland Ltd as data controller (Trending Topics, Aug 2026). That default governs how ads are chosen, not whether your own pixel hashes and sends your visitors' form data for conversion matching. Check both settings on their own terms; one being off by default does not mean the other is.
OpenAI has a habit of changing measurement-adjacent defaults with little or no announcement: this view-through window shipped through documentation with no release note, and budget and bidding defaults have moved before with just as little warning (see ChatGPT Ads' silent changes). Re-check your settings on a schedule. Do not assume this month's defaults still apply next quarter.
A working method: reconcile the platform against your own numbers
None of the mechanics above are exotic on their own. What has been missing from the public discussion is a process that accounts for all of them at once, instead of patching one and getting surprised by the next.
- Give the channel its own landing path. Not your homepage, not the same URL you use for Google Ads: a dedicated path, something like
/gpt, that nothing else on your site links to. This is the single highest-leverage fix, because it survives every failure mode above. WKWebView and Chrome Custom Tabs strip the referrer;rel="noreferrer"strips it again; a clipboard paste never had one to begin with. None of that touches the path portion of a URL. A referrer-less, UTM-less visit landing on a page nothing else points to is still identifiable as ChatGPT-sourced by the path alone, something a generic homepage landing can never give you.
- Add UTMs, then capture them server-side too. Tag every destination URL as you would for any channel; it is free insurance for the visits where the parameters do survive the handoff. But do not rely only on your analytics tool's own client-side script to read them. Log the full incoming query string server-side on the first request to your dedicated path, before any client-side script has a chance to fail, get blocked, or lose the parameters to a redirect. That log becomes a source of truth that does not depend on a tag firing, a consent gate, or a script blocker.
- Wire up the pixel and the Conversions API together, with real deduplication. Fire the browser pixel for standard on-site events. Send the same conversion again through the Conversions API once it is actually confirmed (an order in your backend, a stage change in your CRM), which may be days after the original click. Generate one
event_idat the point of first contact, store it alongside the server-side log from step two, and reuse that same identifier on both calls so OpenAI's deduplication collapses them into one conversion instead of two.
- Reconcile weekly, not just at the end of a campaign. Every week, pull the same four numbers for the same date range: platform-reported clicks and conversions from the ads interface, sessions on your dedicated path from analytics, and your own server-side hit count on that path from step two. The gap between them is diagnostic. If your server-side count and analytics roughly agree but both sit well below the platform's click number, the loss is happening before the visit ever reaches your site. If your server-side count is close to the platform's clicks but analytics is far lower, the loss is happening in the browser layer, and your server-side log is the one to trust. If both hit counts look right but conversions lag, you are in delayed-conversion territory, and the Conversions API should close the gap over the following days.
- Use Direct-traffic movement as a cheap cross-check. Before spend starts, record two to four weeks of baseline Direct-channel sessions and conversions: your normal, unadvertised type-in and bookmark traffic. During campaign weeks, watch for a rise above that baseline beyond ordinary week-to-week noise, and watch whether it falls back when you pause spend. Because so much ChatGPT ad traffic gets misclassified as Direct for the reasons above, a Direct lift that tracks your flight schedule is evidence the campaign is doing something, even in weeks where the platform's click count and your own numbers will not fully reconcile. It will not produce a precise incremental return figure (that needs an actual geo holdout, a heavier lift than most campaigns this size justify), but it costs nothing beyond a report you already have.
What you still can't know
Even running all five steps, some things stay out of reach. OpenAI's dashboard reports impressions, clicks, CTR, CPC, and conversions, aggregated at the campaign and ad-group level. There is no search-term or prompt-level report: you cannot see which questions people asked that triggered your ad, the way Google Ads has shown search queries for two decades (Search Engine Land, Mar 2026). There is no conversation content, no demographic breakdown, and no way to tell whether a given conversion followed one ad exposure or five (Top Growth Marketing, Aug 2026).
That is not a temporary gap that better tagging fixes. It is closer to a design choice: the model does not treat the ad as part of the conversation, so nothing about the prompt that produced it is retained in a form advertisers can query. The honest position is that nobody outside OpenAI currently knows the prompt-level breakdown of what is driving a given campaign's performance, and the method above does not change that. It only fixes the part of the problem that is on your side of the click.
Questions we keep getting
Is OpenAI just miscounting clicks?
No evidence points that way. A simpler explanation covers most of the gap: referrer stripping and cookie limits losing the visit on your side, plus the possibility of double-counted click events if your own pixel and Conversions API calls are not sharing one event_id for deduplication. Rule out your own setup before assuming the platform's number is wrong.
Do I need both the pixel and the Conversions API, or is one enough?
Both. The pixel alone misses anything blocked by Safari's ITP, a consent gate, or an ad blocker, and cannot report app events at all. The Conversions API alone misses nothing structurally, but running only one path means losing exactly the conversions the other path exists to catch: they are complementary, not redundant.
Does an ad blocker affect any of this?
Yes, for the pixel specifically: it is a browser script like any other tracking pixel, and standard ad blockers can stop it from firing. The Conversions API does not run in the browser at all, so it is not affected the same way, which is one more reason to treat it as required rather than optional. Jaffray's $7-per-click, zero-conversion result above is at least partly consistent with lost browser-side signal, though there is no way to confirm that from public reporting.
How is this different from AI-visibility monitoring?
Different question entirely. This piece is about proving a paid click reached your site and converted. Visibility monitoring is about whether your brand shows up at all in ChatGPT's organic answers, unpaid, before anyone clicks anything. They need separate instrumentation and separate cadences. See our products for the visibility side.
Sources
- MediaPost: Data reveals ChatGPT ads not performing (August 2026)
- OpenAI: ChatGPT Ads measurement pixel documentation (August 2026)
- PPC Land: ChatGPT advertisers face 10 days to opt out of automatic advanced matching (August 2026)
- PPC Land: ChatGPT Ads gains view-through conversions with a fixed 1-day window (August 2026)
- PPC Land: ChatGPT launches conversion ads June 5 (May 2026)
- Search Engine Land: OpenAI's ad platform can't tell advertisers if their money is working (March 2026)
- Top Growth Marketing: How to measure ChatGPT ads (and what you can't, yet) (August 2026)
- Clickport: Why ChatGPT traffic shows as Direct in GA4 (August 2026)
- Cometly, Safari ITP blocking tracking: a marketer's guide (February 2026)
- Trending Topics: OpenAI confirms ChatGPT ads will launch in 31 European countries (August 2026)