New

Shopify launched Agentic Storefronts. We make AI agents recommend you - not just list you.

See the Shopify integration
Tru Commerce

← Insights

ChatGPT Ads in GA4: UTMs, Attribution, and the Dark Traffic Trap

Without UTMs, ChatGPT ad clicks land in GA4 as Direct - the same trap that already hides most AI traffic. Here is the exact tagging, channel-grouping, and cross-check setup that keeps your spend measurable.

Viren Inaniyan · August 29, 2026 · ChatGPT Ads

ChatGPT Ads in GA4: UTMs, Attribution, and the Dark Traffic Trap — Tru Commerce guide

OpenAI will happily bill you for every ChatGPT ad click. GA4, left alone, will file most of those clicks under Direct - the same black hole that already swallows the bulk of AI referral traffic. Before you scale spend, fix the plumbing: UTMs on every ad, a channel group that catches them, and a monthly cross-check against Ads Manager.

The dark traffic trap, now with a bill attached

We have written before about Dark Agentic Commerce Traffic - the pattern Scot Wingo of ReFiBuy named, in which the bulk of AI-referred visits land in GA4 as Direct because the click carries no usable referrer. Our full breakdown of the DACT problem covers the organic side.

Ads make the same problem more expensive. When someone taps a sponsored placement in the ChatGPT app, the click frequently opens your site with no referrer header at all. GA4 sees a session with no source, no medium, no campaign - and files it as Direct. The click you paid for becomes indistinguishable from someone typing your URL from memory.

That matters twice over. First, you cannot compute return on spend for a channel GA4 cannot see. Second, the traffic is worth seeing: ChatGPT-referred ecommerce traffic converts at 15.9%, against 1.76% for Google organic (Adobe, 2025). Agencies already report measurement gaps as the top complaint about chatbot advertising (eMarketer/Digiday, 2026). Most of that gap is not mysterious. It is untagged URLs.

Fix one: UTMs in the landing-page query parameters field

ChatGPT's Ads Manager (the same self-serve console we walk through in our setup guide) has a landing-page query parameters field on each ad. Whatever you put there is appended to your destination URL at click time. This is where your attribution lives or dies.

Use dynamic macros so you never hand-label an ad again:

utm_source=chatgpt&utm_medium=paid&utm_campaign={campaign_id}&utm_content={ad_group_id}&utm_term={ad_id}

At serve time, Ads Manager substitutes the real IDs, so every click arrives in GA4 stamped with exactly which campaign, ad group, and ad produced it.

Keep utm_source lowercase and consistent. GA4 treats chatgpt, ChatGPT, and chat.openai.com as three different sources. Pick chatgpt once and never vary it.

Use utm_medium=paid (or paid_chat). This is what separates ad clicks from organic ChatGPT referrals that happen to carry a referrer - you want those in different rows.

Prefer IDs over names in macros. Campaign names get renamed mid-flight; IDs do not. You can map IDs to names in a lookup table later.

Check your redirects. A 301 chain or a consent-wall redirect that strips query strings will silently delete your tagging. Click your own ad from a phone and confirm the parameters survive to the final URL.

Fix two: understand what __oppref does - and does not do

Install OpenAI's measurement stack alongside your UTMs. The pixel (oaiq.min.js) stores an __oppref click-ID cookie when a visitor lands from a ChatGPT ad, and the server-side Conversions API (bzr.openai.com/v1/events) sends purchase events from your backend; the two deduplicate on a shared event_id, with a default 30-day conversion window (OpenAI docs, 2026).

Here is the division of labor, because it confuses people:

__oppref answers OpenAI's question: did this click convert? It is how Ads Manager reports conversions and how conversion-optimized CPC bidding learns. Without it, OpenAI's conversion columns stay empty and its bid models optimize toward clicks you never valued.

UTMs answer your question: what did this channel contribute relative to every other channel? GA4 never reads __oppref. Only the query parameters you append make ChatGPT Ads visible in your own reporting, your attribution models, and your board deck.

Run both. Neither substitutes for the other, and together they give you two independent counts of the same activity - which becomes useful in fix four.

Fix three: give ChatGPT Ads its own GA4 channel

Even correctly tagged, ChatGPT ad sessions will land in GA4's default "Paid Other" or an unassigned bucket, because Google's default channel definitions do not know what chatgpt / paid means. Build a custom channel group:

  1. In GA4: Admin → Data settings → Channel groups → create a copy of the default group.
  2. Add a channel named ChatGPT Ads, matched on source exactly matches chatgpt AND medium exactly matches paid.
  3. Add a second channel, AI Organic, for referral sessions from chatgpt.com, perplexity.ai, gemini.google.com, and peers, so the earned layer gets its own row too.
  4. Order both above the default Referral and Direct rules - GA4 assigns the first matching channel.
  5. Select the new group in your Traffic acquisition reports.

Now paid and organic ChatGPT traffic report side by side, and the comparison is worth watching. In our own US campaigns running since July 2026, paid CTR has averaged around 1.3% (our campaign data), against an industry chatbot-ad benchmark near 0.9% (eMarketer, 2026) - but the organic recommendation next to that ad converts without a media bill. Our ChatGPT Ads hub tracks both layers, and the vs. Google Ads comparison covers where the next dollar goes.

Fix four: cross-check Ads Manager against GA4 to measure the leak

No client-side setup captures everything. Blocked scripts, declined consent banners, in-app browsers, and plain definitional differences (a click is not a session) all bleed sessions. So measure the bleed instead of guessing:

  1. Pick a clean 30-day window.
  2. Pull clicks by campaign from Ads Manager.
  3. Pull sessions for the ChatGPT Ads channel from GA4, segmented by utm_campaign.
  4. Compute sessions ÷ clicks per campaign. The shortfall is your tracking-loss rate.
  5. Re-run monthly and watch the trend, not the single number.

Two practical uses. First, a stable loss rate becomes a correction factor: if GA4 sees 80% of billed clicks, gross up GA4-attributed revenue accordingly before judging the channel. Second, a sudden drop in the ratio is an alarm - usually a stripped query string, a broken redirect, or a consent-mode change - that you catch in days instead of quarters. Given that ChatGPT ads only reached $100M in annualized revenue in 2026 (eMarketer, 2026), the platform's measurement tooling is young; your own cross-check is the audit layer.

Where Tru Commerce fits

Ads rent the conversation. Everything above helps you count what the rented placement returns - and honest counting usually reveals the second layer underneath it: the organic recommendation, which ChatGPT gives to the brands its models already trust, and which is the only layer Plus and Pro users ever see. As our founder put it on the record: "Brands cannot buy influence over ChatGPT's answers" (The Hindu BusinessLine, Aug 2026).

We build for that earned layer. Before you scale ad spend against a channel you have just made measurable, find out whether ChatGPT already recommends you when nobody is paying. Run the free Citation Rank scan - work email and brand URL, results in 24 hours - and see where you stand across ChatGPT, Gemini, Perplexity, and the other agent surfaces. Then decide how much of the conversation you want to rent versus own.

FAQ

Sources

  1. 1.Ads in ChatGPT: The Basics - OpenAI Help Center, 2026
  2. 2.Ads Measurement Pixel documentation - OpenAI Developers, 2026
  3. 3.Ads Conversions API documentation - OpenAI Developers, 2026
  4. 4.Conversion measurement - OpenAI Help Center, 2026

Continue reading