utm.new
guide ·

llms.txt and UTMs: why you shouldn't tag the links AI assistants read

llms.txt is a list of your canonical URLs. Putting UTMs on them looks clever and quietly corrupts your analytics. Here's what the file is for and why it should stay clean.

If you’ve spent time on AI search optimization, you’ve run into llms.txt — a proposed convention for a plain-text file at the root of your domain that hands large language models a clean, curated map of your site. It sits in the same family as robots.txt and sitemap.xml: a file at a well-known path that tells automated readers something useful about your content.

Then comes the clever idea: it’s a list of links I author, so I can put UTMs on them and finally measure AI traffic.

Don’t. The reasoning is sound right up until you consider who actually follows those links, and then it inverts. This post explains what llms.txt is for, why UTMs poison it specifically, and what to do instead — which is mostly nothing, because your analytics already handles this.

What llms.txt actually is

llms.txt is a Markdown-formatted file published at /llms.txt. It gives an LLM a concise, human-curated index of your most important pages — a short description of your site, then sections of links with brief notes. Instead of an assistant guessing which of your thousand pages matter, you tell it: here are the canonical URLs for our docs, our pricing, our key guides.

How much any given assistant honors it varies, and the convention is young. Treat it as a low-cost signal you control, not a guarantee.

The important word in that description is canonical. llms.txt is a list of the addresses you want treated as the real, authoritative location of each page. That’s the job. Everything below follows from it.

Why UTMs break it

Tagging your llms.txt links means publishing https://example.com/pricing?utm_source=llms-txt&utm_medium=ai-assistant as the address you’re telling every AI to treat as canonical. Four things go wrong.

1. The assistant repeats the tagged URL to everyone. If a model does follow your file, it now holds a parameterized address as your pricing page and may cite that exact string in its answers. Those parameters reach every reader of every answer — including people who arrived at the assistant from somewhere else entirely, and people who copy the link and share it further. Your utm_source=llms-txt starts appearing in traffic that has nothing to do with your file.

2. You overwrite classifications that were already correct. UTM parameters take precedence over referrer detection in GA4. An assistant click that would have been filed under AI Assistants from its referrer — correctly, automatically — now carries whatever you typed instead. You replaced a real signal with a guess.

3. You fragment your canonical URLs. You are, by definition, publishing a non-canonical variant of every important page and asking machines to treat it as the entry point. That’s the opposite of what a canonical index is for, and it works against the SEO you built the file to support.

4. It was never necessary. GA4 ships an AI Assistants default channel that fills itself from the referrer. Google’s own rule: the medium “is set to ai-assistant … if the referrer matches a list of AI Assistants.” AnyTrack likewise assigns a channel to every session from the referrer and URL parameters, so AI assistants show up in the Campaign Report on their own. Both systems classify this traffic without a single parameter from you.

Note what point 4 implies about utm_medium=ai-assistant in particular: that value is GA4’s own output, written after it recognizes an assistant referrer. Putting it in your llms.txt is forging the classifier’s handwriting on links whose visitors may have come from anywhere.

The limit that makes the whole idea moot

Even setting the damage aside, the measurement wouldn’t work. Most of the time an assistant doesn’t follow the exact URL from your file. It does one of two other things:

  1. It cites your page in its own words, constructing a link to your bare canonical URL from what it read — no query string, no parameters. The reader clicks that.
  2. It answers without linking at all, and the user never clicks through.

You cannot tag a citation the model writes. There is no file, header, or convention that injects parameters into a URL generated inside someone else’s product. So the tagged-link measurement captures a sliver at best — while the classification cost lands on all of your traffic.

What you’re taggingCan you add UTMs?Should you?
Links in your llms.txtYes, technicallyNo — they’re canonical URLs, and the tag leaks to all traffic
A citation the model writesNoN/A — you don’t author the URL
An answer with no linkN/AN/A — no click happens
An ad you buy on an AI platformYesYes — per that platform’s own template

What to do instead

Keep llms.txt canonical and clean. Bare URLs, no query strings. Point at final destinations, not redirect chains that would strip parameters anyway. The file’s job is to tell machines which pages matter and where they live — let it do that job well.

Read the classification you already have. In GA4: the AI Assistants channel, plus the referral rows for perplexity.ai and claude.ai (Google doesn’t name those among its recognized sources, so they file as ordinary referrals). In AnyTrack: the Campaign Report’s AI assistants channel, with conversions attached.

Capture visits server-side so the sessions that did arrive with a referrer survive ad blockers, consent gates, and fast bounces. That’s a durability fix, not an attribution invention — it won’t conjure a referrer that was never sent.

Accept a known floor. Some assistant clicks arrive with no referrer at all and land in Direct. No tag recovers them, because the tag would have to be on a link the model wrote. Report the AI channel as an undercount and move on — that’s more defensible than a number inflated by your own parameters.

Tag ads when you buy them. When an assistant sells advertising — OpenAI opened self-serve ChatGPT advertising during 2026 — you author the destination URL and the platform publishes its own tracking template and click-ID parameter. Tag those per that platform’s advertiser docs, read at setup time, and keep them separate from organic citations.

How to think about it

llms.txt is a small, cheap surface you control, and the temptation to monetize it for measurement is understandable. But it’s a list of canonical addresses, and canonical addresses are the one place UTMs never belong. Parameters there don’t measure AI traffic — they relabel everyone else’s.

The measurement you wanted already exists, produced from a signal you don’t control and don’t need to: the referrer. Build the right mental model for that, keep your canonical URLs bare, and spend the UTM discipline on links you genuinely place.

More in this series