utm.new
ChatGPT Ads logo
ChatGPT Ads
Paid search

ChatGPT Ads UTM parameters

ChatGPT Ads is OpenAI's self-serve platform for placing ads inside ChatGPT conversations, managed through Ads Manager (beta). UTMs go into a single Landing page query parameters field that exists at the campaign, ad group, and ad level, with the most specific level winning. The platform substitutes four lowercase single-brace macros — {campaign_id}, {ad_group_id}, {ad_id}, {ad_account_id} — and they return IDs, not names. OpenAI appends its own click reference, oppref, to every landing URL; the OpenAI Pixel reads it into a first-party cookie and the Conversions API expects you to pass it back.

Updated
Recommended UTM template
Open in builder →
utm_sourcechatgpt
utm_mediumcpc
utm_campaign{campaign_id}
utm_id{campaign_id}
utm_term{ad_id}
utm_content{ad_group_id}

ChatGPT Ads is OpenAI’s self-serve platform for placing ads inside ChatGPT conversations. You buy through Ads Manager at ads.openai.com, currently in beta and rolling out to approved advertisers by country. The account structure is the familiar three-level stack — campaign, ad group, ad — and OpenAI has added the measurement plumbing an advertiser expects: a query-parameter field for your own tracking, dynamic macros, a click reference, a Pixel, and a Conversions API.

This is a fundamentally different situation from ChatGPT’s organic citations. When ChatGPT cites your page in an answer, the link is your canonical URL and you cannot tag it (see ChatGPT ). An ad is a link you author: you control the destination and the query string, so you tag it the way you tag Google Ads or Meta.

The platform is young and the macro list is short. That makes setup quick and the mistakes easy to name: putting oppref in the template, expecting name macros that don’t exist, and setting parameters at two levels without realizing one overrides the other.

What ChatGPT Ads calls UTMs

Ads Manager has no “tracking template” or “URL parameters” object in the Google or Meta sense. It has a single free-text field called Landing page query parameters. Whatever you type there is appended to the landing URL as a query string when the ad serves, with the macros substituted.

The field takes key=value pairs joined with &, no leading ?. It accepts your own static text alongside the supported macros.

Where to put the parameters

  1. In Ads Manager, open the Campaigns page.
  2. Click the three-dot menu on the campaign and choose Edit campaign.
  3. Paste the template into Landing page query parameters.
  4. Save.

The same field exists on the Ad Groups page (Edit ad group) and the Ads page (Edit ad). It also exists, implicitly, on the ad’s own destination URL: anything already in the ad URL’s query string is honored first.

ParameterValueWhy
utm_sourcechatgptNames the surface the ad appeared on. Sits next to google and bing in source/medium reports.
utm_mediumcpcMatches GA4’s paid-traffic regex and the convention used across your other paid channels.
utm_campaign{campaign_id}There is no name macro. Swap for a static label if you need readable campaign names (see below).
utm_id{campaign_id}Always the numeric ID — rename-safe, and the join key for GA4 cost-data imports.
utm_term{ad_id}Creative-level dimension. The ad is the smallest unit OpenAI exposes.
utm_content{ad_group_id}Audience or theme differentiation within a campaign.

Pasted into the field, it looks like this:

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

This is the template the builder hands you when you pick “ChatGPT Ads.” It deliberately omits oppref — OpenAI adds that itself.

IDs, not names

Every macro returns a numeric ID. OpenAI does not offer {campaign_name}, {ad_group_name}, or {ad_name}. Two ways to live with that:

  • Dynamic IDs everywhere (recommended). One template, pasted into every campaign, never edited. Reports show IDs; you match them to names in Ads Manager or a CSV export. IDs survive renames, so historical joins never break.
  • Static label in utm_campaign. Replace {campaign_id} with spring-sale and keep {campaign_id} in utm_id. Reports read well, but each campaign needs its own template and you maintain the labels by hand. Leave {ad_group_id} and {ad_id} dynamic either way.

Dynamic macros

OpenAI’s macro catalog is four entries plus the click reference. All are lowercase, single-brace, underscore-separated{campaign_id}, not {campaignid} (Google) and not {{campaign.id}} (Meta). Case matters: {Campaign_ID} outputs literally.

There are no conditional macros, no device or placement tokens, and no keyword token. If you need to distinguish surfaces or devices, split the campaign rather than templating.

The full list, with what each returns, is in the token table below.

Auto-tagging: oppref

OpenAI appends its own click reference to every landing page URL, in this shape:

https://example.com/landing?utm_source=chatgpt&...&oppref=gAAAAAb123

oppref plays the role gclid plays for Google Ads and fbclid for Meta. It is how OpenAI ties a conversion back to the click:

  • The OpenAI Pixel (browser-side) captures oppref from the URL on landing and stores it in a first-party cookie named __oppref, so later page views and conversion events on your site can reuse it.
  • The Conversions API (server-side) does not collect oppref for you. OpenAI’s guidance is to preserve the value exactly as it arrived and send it with each server-side event.

The {oppref} entry in the field’s template list can look like an invitation to add it yourself. Don’t. It is already appended.

As with every auto-appended click ID, oppref is only as durable as the path to your page. Link shorteners, server-side redirects that drop the query string, and app deep links all strip it. Keep the ad’s destination URL pointed at the final page.

Pixel + Conversions API

UTMs tell your analytics where a visit came from. They do not tell OpenAI that the visit converted. For that you need OpenAI’s own measurement, set up under a data source in Ads Manager:

  • OpenAI Pixel — a JavaScript tag on your site. Captures oppref, sets the __oppref cookie, and fires conversion events from the browser.
  • Conversions API — the server-side channel for the same events. Send it CRM conversions, offline events, and anything the Pixel misses to ad blockers or Safari’s cookie limits, with oppref attached so OpenAI can attribute it.

Run both, deduplicated, for the same reasons you run Pixel plus CAPI on Meta. Details of event names, payloads, and deduplication are in OpenAI’s conversion-measurement docs linked below.

For how the receiving side classifies the visit — and why paid and organic ChatGPT traffic must stay separate — see Google Analytics .

Limitations and gotchas

  • Beta behavior changes. OpenAI is adding measurement features over time. If a macro stops filling or the field moves, check the Measure results article before assuming your template broke.
  • No name macros. Every macro is an ID. Plan your reporting around that or maintain static labels.
  • No device, placement, or keyword macros. Split campaigns if you need those dimensions.
  • GA4 files chatgpt / cpc under Paid Other. ChatGPT is not on Google’s list of search or social sites, so the default channel grouping can’t call it Paid Search. A custom channel group with a source matches chatgpt rule fixes it.
  • Don’t reuse the organic utm_source=chatgpt warning in reverse. Tagging organic citations is wrong because you can’t control the link. Tagging ads with utm_source=chatgpt is right because you can. The source value is the same; the situation is not.
  • Lower-level fields override silently. There is no indicator on the campaign that an ad group or ad below it carries its own parameters. Audit all three levels when numbers look off.

Verification

  1. Click your own live ad. Land on your page and read the address bar. You should see your UTMs with real numeric IDs substituted, plus oppref= with a long opaque value. Literal {campaign_id} means a typo or wrong casing in the macro.
  2. Check the cookie. With the Pixel installed, open your browser’s storage inspector and confirm a __oppref cookie exists with the same value as the URL parameter.
  3. Confirm in GA4 realtime. Filter by utm_source=chatgpt. The session should show source chatgpt, medium cpc, and your campaign ID under Campaign ID.
  4. Check Ads Manager’s data source. Fire a test conversion and confirm it appears against the right event, and that server-side events carry the same oppref as the Pixel.

Common problems

  • My UTMs come out as literal {campaign_id}. Wrong casing or a typo. The macros are lowercase with underscores — {campaign_id}, not {CampaignID} or {campaignid}.
  • One campaign reports fine, one ad in it reports something else. That ad, or its ad group, has its own Landing page query parameters overriding the campaign template. Clear the lower level or paste the full template there.
  • oppref appears twice on my landing URL. You added it to the template. Remove it; OpenAI appends it.
  • Ads Manager shows no conversions but GA4 does. UTMs don’t report conversions to OpenAI. Install the Pixel, or send events through the Conversions API with oppref attached.
  • Conversions API events aren’t attributed. The oppref value was missing, truncated, or altered before it reached your server. Store it exactly as it arrived and pass it through unchanged.
  • GA4 puts the traffic in Paid Other. Expected. Build a custom channel group if you want it beside Paid Search.
Token Description Substituted at
{campaign_id}Numeric ID of the campaign that served the ad.
Rename-safe — the recommended value for utm_id and, unless you need readable names, for utm_campaign too.
Click time
{ad_group_id}Numeric ID of the ad group.Click time
{ad_id}Numeric ID of the individual ad the visitor clicked.Click time
{ad_account_id}Numeric ID of the ad account.
Useful for agencies running several accounts through one analytics property. Carry it as a custom parameter (e.g. ad_account_id={ad_account_id}), not inside a utm_ field.
Click time
{oppref}OpenAI's per-click reference. Listed among the field's template values, but OpenAI already appends oppref to the landing URL on every click.
Do not add it to your template — you would put oppref on the URL twice. The OpenAI Pixel reads the auto-appended value.
Click time

Frequently asked questions

Last reviewed
Where do I put UTM parameters in ChatGPT Ads?

In the Landing page query parameters field. Open Ads Manager, go to the Campaigns page, click the three-dot menu on a campaign, choose Edit campaign, and paste the template into that field. The same field exists on the Ad Groups and Ads pages via Edit ad group and Edit ad. Set it once at the campaign level and leave the lower levels empty so one template governs every ad in the campaign.

Which macros does ChatGPT Ads support?

Four ID macros: {campaign_id}, {ad_group_id}, {ad_id}, and {ad_account_id}. They are lowercase, single-brace, and underscore-separated. There are no name macros — every macro returns a numeric ID. The field also lists {oppref}, OpenAI's click reference, but you do not need it: OpenAI appends oppref to the landing URL automatically.

What is oppref, and do I need to add it to my template?

oppref is OpenAI's per-click reference — the ChatGPT Ads equivalent of Google's gclid or Meta's fbclid. OpenAI appends it to your landing page URL on every ad click, the OpenAI Pixel reads it into a first-party __oppref cookie, and the Conversions API expects you to pass the original value back with server-side events. Do not add it to your Landing page query parameters. Doing so puts the parameter on the URL twice.

Why do my reports show campaign IDs instead of campaign names?

Because that is all the macros return. OpenAI offers no {campaign_name} or {ad_group_name} macro. If you need readable names in GA4 or your tracker, replace {campaign_id} in utm_campaign with a static label like spring-sale and keep the ID macro in utm_id. The trade-off: each campaign then needs its own template, and you maintain the labels by hand. Keep {ad_group_id} and {ad_id} dynamic either way so ad-group and ad attribution survives.

What happens if I set parameters at more than one level?

The most specific level wins. Ads Manager applies the parameters from the ad's own URL first, then the ad, then the ad group, then the campaign. A parameter set on a single ad silently overrides the same parameter in the campaign template for that ad. Keep the template at the campaign level unless you need a deliberate per-ad override, and when you do, set the whole template there rather than a single parameter.

What's the right utm_medium and utm_source for ChatGPT Ads?

utm_source=chatgpt and utm_medium=cpc. The source names the surface the ad appeared on, which is what you want next to google and bing in a source/medium report. cpc matches GA4's paid-traffic regex. One caveat: GA4 does not list ChatGPT among its search or social sites, so chatgpt / cpc lands in Paid Other rather than Paid Search by default. Build a custom channel group if you want it grouped with your search spend.

Does GA4's AI Assistants channel pick up ChatGPT Ads traffic?

No — and it shouldn't. GA4's AI Assistants channel is for organic referrals, classified from the chatgpt.com referrer with medium ai-assistant. Ad clicks carry your UTMs, and UTMs take precedence over the referrer, so tagged ad traffic reports under chatgpt / cpc. That is the correct split: paid placements and organic citations are different channels that happen to share a brand name.

Do I need the OpenAI Pixel if I already have UTMs?

Yes, if you want conversions reported inside Ads Manager. UTMs tell your analytics where a visit came from; they don't tell OpenAI that the click converted. The Pixel (browser-side) and the Conversions API (server-side) send conversion events back to OpenAI keyed on oppref. Run both for the same reasons you run Pixel plus CAPI on Meta: the Pixel is easy, the API survives ad blockers and Safari's cookie limits.

AnyTrack tools

Track this platform end-to-end

Resources from AnyTrack — the conversion tracking platform behind utm.new — for taking the UTMs you build here all the way to attribution and reporting.