ChatGPT ads conversion tracking: pixel, API, GA4
How OpenAI ties a conversion to an ad click, where the click reference gets lost, how to stop one sale counting twice, and why paid and unpaid ChatGPT visits merge in GA4 unless you tag them.
By Daria Dovzhikova · October 2026
The short version
- OpenAI attributes on one identifier, oppref, appended to the landing URL. Lose it in a redirect and the click is gone.
- Run the Pixel and the Conversions API together, with the same event ID on both, so a conversion counts once.
- The API does not capture oppref for you, rejects a whole batch for one bad event, and will not take events older than 7 days.
- Tag every destination URL. Without UTMs, a paid ChatGPT click and an unpaid citation are the same row in GA4.
Three ledgers, one click
An operator on r/PPC described the meeting this page is for: one person says AI search is killing the leads, another says it does not show in GA4 so it does not matter, and both can be wrong on the same account. Ads inside ChatGPT make that meeting harder, because now there is a third number in the room.
A click on a ChatGPT ad can be counted in three places. Ads Manager counts it if OpenAI can connect a conversion event to the click. GA4 counts it if the session carries a source it recognises and the action is a key event. The CRM counts it if the lead record kept where it came from. The three will not agree, and they are not supposed to. The job is to know why each one differs. This page is built from OpenAI's documentation, not from campaign results, and it links to each page it relies on.
The three layers
| Layer | What it sees | What it needs | How it breaks |
|---|---|---|---|
| OpenAI Pixel | Browser events you send with oaiq("measure", ...), tied to the ad click through the oppref value it stores in a first-party cookie. | The snippet in the head of every page where a conversion can happen, your Pixel ID, and a call at the moment the action occurs. | Blockers, declined consent, a redirect that drops oppref before the pixel loads, the event firing on page load instead of on the action. |
| Conversions API | The same events sent from your server, including ones the browser never reports. OpenAI calls it a more reliable source than the pixel alone. | A Pixel ID and API key from the conversions tab in Ads Manager, and oppref captured on your side: the API does not capture it for you. | One bad event fails the whole batch of up to 1,000. Timestamps older than 7 days are rejected. Amounts sent as decimals instead of integers in minor units. |
| UTMs and GA4 | The session, the landing page and the key event, in your own analytics, independent of what the ad platform reports. | Campaign parameters on every destination URL and a key event on the action that makes a lead or a sale. | No UTMs, so a paid click and an unpaid citation both arrive from the same referrer and land in one row. |
The first two rows come from OpenAI's pages on the Measurement Pixel, the Conversions API and conversion measurement. The third row is yours to build, and it is the only one that does not depend on the ad platform grading its own work.
Everything hangs on oppref
OpenAI's help page describes the mechanism in one paragraph. The click reference, called oppref, is appended to the end of the landing page URL. The Pixel captures it and stores it in a first-party cookie so it can be associated with later conversion events. Its first item of advice on measurement quality after installing the pixel is to preserve the click reference through redirects and landing-page navigation.
That is the same failure as a dropped GCLID on Google Ads. A redirect from a vanity path, a consent gateway, a link shortener, or a router that rewrites the query string can remove the parameter before the pixel reads it. Nothing errors. The conversion happens, the event is sent, and it matches no click.
On the server side the gap is explicit. The Conversions API documentation says that, unlike the pixel, the API does not capture oppref for you: capture the value yourself and pass it with the server event. It is an opaque string and has to be passed without modification. In practice that means reading it on the landing page, carrying it through the form or the checkout, and storing it on the lead or order record, which is the same hidden-field discipline that makes AI-assistant lead attribution work at all.
The rules that bite
Deduplication. If the same conversion goes through both the pixel and the API, reuse one value as the API id and the pixel event_id, with the same Pixel ID. OpenAI deduplicates on Pixel ID, event name and ID, uses the first event it receives and ignores later duplicates. Two different IDs for one order is two orders. Anyone who has reconciled Meta's pixel against its Conversions API has met this bug already.
Batches fail whole. The API accepts up to 1,000 events per request, and if one event in the batch fails, the full batch fails. A single malformed row in a nightly export can lose the day. There is a validate_only flag; use it before the first real send.
Seven days. An event's timestamp must be within the last 7 days and no more than 10 minutes in the future. For e-commerce that is plenty. For B2B it decides which event you can send at all: a lead created today qualifies, a deal that closes in week six does not. Pick the conversion event that happens inside the window.
Money is an integer. Amounts are integers in the currency's minor unit, so $42.00 is 4200 with currency USD, and currency is required whenever an amount is present. A decimal, or a value already in dollars, reports revenue off by a factor of a hundred.
View-through is a separate line. Where it is available, view-through uses a fixed one-day window after an eligible impression and is reported as its own campaign-level metric. It is not part of Conversions, and CPA, bidding and billing stay click-through based. If someone quotes a total, ask which of the two it is.
Hashing has a recipe. Customer identifiers sent to improve matching are normalised and then SHA-256 hashed: emails trimmed and lowercased, phone numbers reduced to 8 to 15 digits with the country code kept. The pixel does this for recognisable forms on its own. On the server you do it, and a hash of an un-normalised email matches nothing.
The event names are fixed too. OpenAI's supported events list has thirteen, each with a required data shape. For a company selling to businesses the relevant ones are lead_created, appointment_scheduled, registration_completed, trial_started and subscription_created.
What GA4 sees
GA4 already has an AI Assistant channel for visits that arrive from ChatGPT, Gemini and similar sources. That channel was built for unpaid visits: someone asked a question, the answer linked to you, they clicked. A paid click on an ad inside the same product comes from the same place. If the destination URL carries no campaign parameters, GA4 has no way to tell the two apart, and the visits you bought sit in the row you were using to measure whether answer engines recommend you.
So tag every destination URL with a source, a medium that says it was paid, and a campaign. Then give that combination its own row, with a custom channel group if the default grouping files it somewhere unhelpful. Check the result with one test click rather than assuming, because the default rules are Google's and they change.
The unpaid side is getting easier to read at the same time. Search Engine Journal reported on 1 October 2026 that Gemini has started adding UTM parameters to outgoing links, as ChatGPT already does for answers grounded in web sources. A parameter survives the in-app browsers that strip a referrer. That makes clean tagging on the paid side more important, not less: both kinds of visit now arrive labelled, and yours should say which kind it is.
Before the spend starts
| Step | What to check |
|---|---|
| 1. Click your own ad | Read the landing URL. It should end with an oppref value. Follow every redirect and confirm the value is still there on the final page. |
| 2. Confirm the cookie | With the pixel loaded, the click reference is stored first-party. If the landing page redirects before the pixel runs, nothing was stored. |
| 3. Fire one conversion | Complete the form or the purchase once. The event should appear in Ads Manager, in GA4 as a key event, and on the CRM record. |
| 4. Send the same event from the server | Use validate_only first. Then send it with the same ID the pixel used and check Ads Manager still shows one conversion, not two. |
| 5. Check the amount | $25.99 is 2599 with currency USD. A value that is 100 times too small or too large is a decimal sent where an integer was expected. |
| 6. Read the GA4 row | The test session should sit on its own source and medium, not inside the unpaid AI Assistant channel. |
After launch, the number to keep is the same one as on every other platform: conversions the ad platform reports against leads or orders in your own system, over the same seven days. It will not be 1.0. It needs to be stable and explained. The Attribution Leak Calculator does that arithmetic, and the attribution models page covers why the platforms disagree by design. If the gap is large across platforms, closing it is the week-one baseline of the Growth Pilot: server-side events, deduplication, and one reporting view, before either experiment card runs.
Questions
How does ChatGPT ads conversion tracking work?
You create a data source in Ads Manager and send conversion events with the OpenAI Pixel, the Conversions API, or both. OpenAI connects an event to an eligible ad click using the click reference it appended to the landing page URL, called oppref, plus optional hashed customer information. Conversions are evaluated against the events configured for the campaign and the attribution window that applies.
What is oppref?
The OpenAI click reference. It is appended to the end of the landing page URL when someone clicks an ad. The Pixel captures it and stores it in a first-party cookie so later conversion events can be associated with the click. On the server side you have to capture it yourself and pass the original string, unmodified, with the event.
Do I need both the Pixel and the Conversions API?
OpenAI recommends using them together for more resilient measurement, and states that the Conversions API is a more reliable tracking source than the pixel alone. The pixel cannot report what the browser blocks. The API cannot see the click reference unless you hand it over. Each covers the other's blind spot.
How do I stop the same conversion counting twice?
Send the same value as the event_id on the pixel call and as the id on the API event, against the same Pixel ID. For custom events the custom_event_name has to match on both sides too. OpenAI deduplicates on Pixel ID, event name and ID, keeps the first event it receives and ignores later duplicates.
Does ChatGPT ads reporting include view-through conversions?
Where it is available on the account, yes, but separately. View-through uses a fixed one-day window after an eligible impression and is reported as its own campaign-level metric. It is not included in Conversions, which stays the click-through total. CPA, post-click conversion rate, bidding and billing are click-through based.
How do ChatGPT ad clicks show up in GA4?
As a visit from ChatGPT, unless you tell GA4 otherwise. An untagged paid click and an unpaid citation share a referrer, so they land in the same row. Put campaign parameters on every destination URL so paid clicks carry their own source, medium and campaign, and mark the lead or purchase action as a key event so GA4 can credit it.
Which events should a B2B company send?
From OpenAI's supported list: lead_created for a submitted form or contact request, appointment_scheduled for a booked meeting or demo, registration_completed for a finished sign-up, trial_started for a free trial and subscription_created for a paid plan. One commercially meaningful event, measured correctly, is worth more than six that nobody reconciles.
Related guides
Three numbers for one channel, and none agree?
Thirty minutes to find which ledger is wrong and in which direction.