Open your analytics and look at the last 90 days of referrals. Somewhere in there — small but climbing — you’ll find chatgpt.com, perplexity.ai, maybe gemini.google.com. People are asking an AI a question, the AI is citing your page, and they’re clicking through.
The problem: most of that traffic doesn’t look like what it is. It lands as Direct / None, or buried in a generic referral bucket, or split across three spellings of the same source. The clicks are real. The attribution isn’t.
You can’t fix this the way you’d fix a broken ad campaign, because you don’t own the link. ChatGPT writes the citation. Perplexity builds the source list. You never touch the URL. So the question isn’t “how do I tag ChatGPT’s links” — you can’t. It’s: which links can I tag, and how do I make AI-sourced visits legible in my reports?
This guide covers both halves.
Why AI traffic disappears
Three things conspire to make AI referrals hard to see.
1. The referrer is often missing or opaque. When a visitor clicks a link inside an AI assistant, the browser may pass no referer header at all, or pass one your analytics doesn’t recognize as meaningful. No referrer means your analytics tool has nothing to attribute the visit to — so it calls it Direct, the same bucket as someone typing your URL by hand.
2. There are no click IDs. Google Ads appends gclid. Meta appends fbclid. These are how those platforms reconcile a click to a conversion. AI assistants append nothing. There’s no chatgptclid. The click arrives naked.
3. The link is generated by the model. When ChatGPT cites your blog post, it emits your canonical URL — https://yoursite.com/post, with no campaign parameters, because it’s reading the URL from your page, not from a tagged link you handed it. So even your own UTM discipline doesn’t help here: the model strips you back to the bare URL.
Put together, a visit from an AI answer looks almost identical to a visit from nowhere. That’s the gap.
What you can tag
Here’s the reframe. You can’t tag the citation the model writes. But you can tag every link you put in front of an AI — and there are more of those than you’d think:
- Links in content you publish that AI crawlers ingest and may surface.
- Links you paste into your own answers, community posts, or docs that get quoted.
- Links in a newsletter, a PDF, or a knowledge base that an assistant reads on a user’s behalf.
- The canonical URLs you expose in structured data and in an
llms.txtfile.
For those, you control the URL, so you control the parameters. Tag them with a consistent convention and the resulting visits stop hiding.
The convention: source per assistant, utm_medium=ai-assistant
Keep it boring and standard. Use the six standard UTM parameters — nothing custom, nothing platform-specific (the same rule we lay out in UTM parameters best practices).
| Parameter | Value | Why |
|---|---|---|
utm_source | chatgpt · perplexity · gemini · copilot · claude | One lowercase token per assistant. Pick the spelling once and never deviate. |
utm_medium | ai-assistant | The value GA4’s native AI Assistants channel recognizes, so it rolls up as one channel automatically. |
utm_campaign | your campaign or content name | Same as anywhere else. |
utm_id | a campaign ID if you have one | GA4’s join key — see why utm_id matters. |
So a tagged link looks like:
https://yoursite.com/guide?utm_source=chatgpt&utm_medium=ai-assistant&utm_campaign=help-docs
Use ai-assistant — not the bare ai. As of ~May 2026 GA4 has a native AI Assistants default channel, and it recognizes the medium value ai-assistant exactly. Tag your links with it and they classify into that channel automatically, no custom channel group required. The older utm_medium=ai is not recognized and still lands in Unassigned — which is the whole reason to use ai-assistant instead.
GA4 also auto-detects some assistants by referrer (ChatGPT, Gemini, Copilot, Grok, Deepseek), so a referrer-bearing click from those can land in AI Assistants even untagged. Your ai-assistant tag is what rescues the gaps: referrer-less clicks, and assistants GA4 doesn’t auto-detect — notably Claude and Perplexity. The builder on the homepage produces the ai-assistant shape by default.
Consistency is the whole game
The single fastest way to wreck this is casing and spelling drift. ChatGPT, chatgpt, and chat-gpt are three different sources in GA4, Mixpanel, and everywhere else. By next quarter your “AI traffic” is scattered across nine rows and the trend line is meaningless.
This is the same failure that splits paid-social reports — we wrote up a real version of it in how we rebuilt our UTM conventions. The fix is identical: pick lowercase tokens, write them down somewhere everyone looks, and run every link through one builder instead of hand-typing.
Seeing the untaggable half
Tagging covers links you control. For the citations you can’t tag — the bare canonical URLs the model emits — you’re left reading signals after the fact. Two things help:
Watch the referrer hostnames directly. Even when an AI visit lands as Direct, a slice of it still carries a recognizable referrer. Build a report (or a GA4 exploration) that filters Session source for chatgpt.com, perplexity.ai, gemini.google.com, copilot.microsoft.com, and claude.ai. That won’t catch everything, but it surfaces the visible portion and gives you a floor.
Capture the visit server-side. Client-side analytics are the most likely to miss a referrer-less, fast-bouncing AI visit — ad blockers, consent gates, and single-page navigations all eat events. Server-side capture sees the request when it hits your origin, before any of that. This is the harder, more durable half of attribution, and it’s the part AnyTrack exists to handle. For the receiver-side mechanics of how a session gets classified once it arrives, the Google Analytics reference is the place to start.
A 20-minute setup
If you want to go from “AI traffic is invisible” to “I can see it” today:
- Lock the source tokens. Write down:
chatgpt,perplexity,gemini,copilot,claude. Lowercase, no variants. - Pick your medium.
aiif you’ll build a channel group;referralif you want default reports to work untouched. - Tag the links you control. Run them through the builder so the shape is identical every time.
- Build the referrer report. Filter session source for the five hostnames above to see the visible slice of untagged AI visits.
- Decide on server-side. If AI is becoming a real channel for you, client-side alone will undercount it.
That’s the whole loop: tag what you own, watch what you don’t, and don’t let the source spellings drift.
More in this series
This is the first piece in a series on UTMs and AI traffic. Coming next:
- Why your AI traffic shows up as Direct / None — and how to fix it
- A UTM convention for the AI search era (GEO/AEO)
- Use AI to generate and govern your UTM taxonomy
- Agentic traffic: what AI shopping agents do to your attribution
- Tracking AI-generated ad campaigns without breaking your UTMs
- Should AI referral traffic get its own channel in GA4?
- llms.txt and UTMs: tagging the links AI assistants cite
Have AI traffic you can’t explain? The FAQ covers the common cases, or tell us what you’re seeing.