Guide

Measuring ChatGPT ads: pixel, UTM, GA4 and incrementality

Published · Updated · Based on the OpenAI Ads API documentation and Google Analytics Help

Key facts
  • The tracking template can be set at account, campaign, ad group or ad level, with placeholders for the campaign, ad group, ad and ad account IDs; oppref is reserved and the platform appends it itself.
  • GA4's campaign URL guide lists nine UTM parameters, including utm_source, utm_medium, utm_campaign, utm_id, utm_content and utm_term, and shows a missing one as "(not set)".
  • GA4's default reporting attribution model is data-driven, with paid and organic channels able to receive credit, a 30-day default lookback for acquisition key events and a 90-day default for other key events.
  • Ads API insights requests take no attribution window parameter; the click window is attribution_window_days on each conversion event setting, with no default stated.
  • Ads Manager offers a 7, 14 or 30-day click window and a 0 or 1-day view window, chosen per column set, since 16 September 2026.
  • View-through conversions are reported separately from click-through ones: in Ads Manager, and as view_through_conversions in the API's conversion insights when available for the account.
  • Conversions need at least a day to settle in Ads API reporting.

Measuring ChatGPT ads means running two tagging systems side by side: OpenAI's own pixel and Conversions API, which is what the platform uses to report and optimise, and UTM parameters read by GA4, which is what tells you how a ChatGPT click fits into the rest of your funnel. The two will not agree with each other exactly, and that is expected once you know why. This guide covers how to tag clicks, what each system counts, why the numbers differ, where view-through data lives, and how to test incrementality when there is no built-in lift tool.

Key takeaways
  • Build the tracking template with UTM parameters plus OpenAI's own macros; never set oppref yourself, the platform appends it.
  • Always send utm_source, utm_medium and utm_campaign, and add utm_id as GA4 strongly recommends; a missing one shows as "(not set)" in GA4.
  • Expect GA4 and Ads Manager or API numbers to differ: different attribution models and windows, not a tracking error.
  • Read view-through conversions in Ads Manager or the API's conversion insights; they never reach a UTM-based tool such as GA4.
  • Where the platform has no native lift test, use a geo holdout and compare the result in your own analytics.

How do I tag a ChatGPT ad click so GA4 can see it?

Add standard UTM parameters, utm_source, utm_medium, utm_campaign and utm_id, to the tracking template on the campaign, ad group or ad, alongside OpenAI's own macros for the campaign, ad group, ad and ad account IDs; do not add oppref yourself, since it is a reserved parameter name that the platform appends to the landing page URL on every click.

A workable template looks like utm_source=chatgpt&utm_medium=paid&utm_campaign={campaign_id}&utm_id={campaign_id}&utm_content={ad_id}. GA4's own guidance is to always set source, medium and campaign, and it strongly recommends setting id as well, so using the campaign ID as your utm_id and the ad ID as utm_content keeps every click traceable back to the exact entity that produced it. Because the template can be set at account, campaign, ad group or ad level, a sane default at account level with overrides where you need finer detail is enough for most accounts. This is a separate system from the pixel's own click reference: UTMs are what GA4 reads, oppref is what OpenAI's own reporting reads, and they ride on the same click without depending on each other.

What does GA4 do with those parameters?

GA4 turns the UTM parameters into traffic-source dimensions, visible per session in the Traffic acquisition report, and attributes the session and any later conversion using its own model; the default reporting attribution model is data-driven, with paid and organic channels able to receive credit, so credit is split across touchpoints rather than given entirely to the last click.

Consistency matters more than cleverness here: GA4 treats different capitalisation or spelling of the same value as different values, so a UTM strategy that is not standardised across every ad and every channel fragments the reporting. It also has nothing to do with OpenAI's oppref parameter, since GA4 has no visibility into the OpenAI ad account. It only sees the tagged link that landed on your site.

Do I still need the OpenAI pixel and Conversions API as well?

Yes: GA4's UTM-based data never reaches OpenAI's ad account, so the pixel and Conversions API remain the only way to tell the platform which of its ads produced an order or a lead, which is what conversion-optimised bidding and reporting inside Ads Manager and the API are built on.

The two systems serve different purposes and both are worth running. GA4 is the cross-channel truth for your business: it sits above ChatGPT, Google, Meta and everything else and lets you compare them on the same terms. The pixel and Conversions API are what OpenAI itself uses to optimise delivery and to populate its own reports. The full setup for the pixel, the Conversions API and the event mapping is covered in OpenAI Ads conversion tracking; this guide assumes that part is done and focuses on the analytics side around it.

Why won't GA4 and Ads Manager numbers match?

Because they are built from different models, different windows and different signals: GA4 defaults to data-driven attribution across paid and organic channels with a 30-day lookback for acquisition key events, Ads Manager lets you choose a 7, 14 or 30-day click window and a 0 or 1-day view window, and the Ads API uses the click window set on each conversion event, with no default stated, so the three can legitimately land on three different totals for the same period.

Add to that the difference between a cookie-based UTM click, which can be blocked or dropped by consent settings, and a server-side Conversions API event, which does not depend on a browser cookie (though consent rules still apply to it), and a gap of some size between GA4 and OpenAI's own numbers should be treated as normal rather than investigated as a bug on day one. What is worth checking is the direction and rough size of the gap staying consistent over time; a gap that suddenly grows or flips sign is more likely to point at a real tracking problem, such as a broken tag or a template change, than the underlying methodology difference.

GA4Ads ManagerAds API
Default attribution modelData-driven, across paid and organic channelsPlatform's own model (not published)Platform's own model (not published)
Attribution window7 or 30-day acquisition lookback (30 default); 30, 60 or 90-day window for other key events (90 default)7, 14 or 30-day click; 0 or 1-day view, chosen per column setClick window set per conversion event (attribution_window_days); no parameter on insights requests
Sees view-through conversionsNo, needs a clickYes, report-onlyYes, in conversion insights, when available for the account
Ties a conversion to the ad viaUTM parameters in the URLoppref plus pixel or Conversions API eventsoppref plus pixel or Conversions API events

Where does view-through data live, and can I see it in GA4?

View-through conversions, counted when someone converts after seeing an ad without clicking it, use a fixed one-day window after an impression when available for the account, and are reported separately from click-through conversions, in Ads Manager and as view_through_conversions in the API's conversion insights; a UTM-based tool such as GA4 cannot see them, because a UTM parameter only fires when someone actually clicks through to your site.

So the view-through number lives only on OpenAI's side. Read it in Ads Manager or pull it from conversion insights, keep it next to your click-based numbers rather than adding them together, and do not expect it to reconcile against GA4, which has no path to see an impression that was never clicked.

What is incrementality, and why isn't click-based measurement enough?

Incrementality is the share of conversions that happened because of the ad, as opposed to the conversions a click-based or last-touch report simply attributes to the ad because someone who was going to convert anyway happened to click it first; OpenAI has not documented a built-in incrementality or conversion-lift testing tool, so the standard way to measure it is a controlled experiment you run yourself.

Every number this guide has covered so far, GA4's attribution, Ads Manager's reporting, the Ads API's insights, describes correlation: who touched an ad before converting. None of them describes causation: what would have happened without the ad. That distinction matters most for a channel you are deciding whether to keep funding, which is exactly when a geo holdout earns its keep.

How do I set up a geo holdout to test it?

Run the campaign with locations included in a test market and excluded in a comparable control market, spend nothing in the control market for the test period, then compare the change in conversions between the two markets over the same window rather than their raw totals, since the difference in change is a better estimate of the ad's effect than either number alone.

The mechanics of building the split with the platform's location include and exclude targeting are covered in how to test ChatGPT ads: a budget and test plan; the measurement step is the part that belongs here. As an illustration only, with made-up round numbers: if the test market's conversions grow from 100 to 130 over the test window, a rise of 30 percent, and the control market grows from 100 to 108 over the same window, a rise of 8 percent, the difference, about 22 percentage points, is a rough estimate of the lift the campaign produced, not the full 30 percent. Track both markets in the same analytics tool, ideally GA4, so the comparison uses one consistent measurement method throughout.

How do I reconcile platform-reported and analytics conversions in practice?

Set an acceptable variance range before you compare the two, treat the Conversions API numbers as the source of truth for what OpenAI is optimising against, treat GA4 as the source of truth for cross-channel comparison, and document the known causes of the gap so nobody re-investigates the same difference every month.

In practice that means matching event definitions as closely as the two systems allow, for example order_created against a purchase event, aligning windows where you can choose them, confirming both the pixel_sdk and server_to_server channels are firing so you are not missing half the picture, and re-checking the comparison whenever OpenAI changes something on the platform side, such as the attribution window options it introduced in Ads Manager on 16 September 2026. A gap that stays roughly the same size month to month is doing its job as a known offset; only a gap that moves without an obvious cause is worth digging into.

Frequently asked questions

Why don't OpenAI's reported conversions match my GA4 conversions?

They use different attribution models and windows and read different signals: GA4 defaults to data-driven attribution across paid and organic channels, built from UTM-tagged clicks, while OpenAI's own reporting is built from the pixel and Conversions API, with a click window set per conversion event (attribution_window_days, no default stated) and a chosen click and view window in Ads Manager. A gap between the two is expected, not a sign that either is broken.

Do I need to add oppref to my tracking template myself?

No. oppref is a reserved query parameter name; the platform appends it to your landing page URL itself on every ad click, and a template that tries to define it is rejected. Add your UTM parameters and OpenAI's own campaign, ad group, ad and ad account placeholders instead.

Can I see view-through conversions through the API?

No. Partly. The API's conversion insights split conversions into click_through_conversions and view_through_conversions, when view-through is available for the account; the regular campaign, ad group and ad insights do not carry a view-through field. Ads Manager reports them with a 0 or 1-day view window. A UTM-based tool such as GA4 cannot see them either, since a UTM parameter only fires on a click, not an impression.

Which UTM parameters should I always set?

GA4's own guidance is to always set utm_source, utm_medium and utm_campaign, and it strongly recommends utm_id too; a missing one shows up as (not set) in reporting. Add utm_content for the ad or creative level if you want that granularity too.

Is a geo holdout the only way to measure incrementality?

It is not the only conceivable method, but it is the practical one here, since OpenAI has not documented a built-in incrementality or conversion-lift testing tool. A geo holdout uses the platform's own location include and exclude targeting, so it needs no extra tooling to set up.

Adsonomy runs ads inside ChatGPT for shops and service businesses. Control edition: you run it with rules. Autopilot: the AI manager runs it inside your guardrails. Launching 1 October 2026.

Join the waitlist