UTM parameters are five query-string fields that tell your analytics where a link was placed. They are simple, universally supported, and almost always a mess within a year.
The mess is rarely caused by not knowing the syntax. It is caused by three people tagging links slightly differently for eighteen months.
The five fields, and what each is for
- utm_source — who sent the traffic.
newsletter,linkedin,partner-acme - utm_medium — what kind of channel.
email,social,cpc,referral - utm_campaign — which initiative.
spring-launch,q3-webinar - utm_content — which variant, for A/B testing.
hero-button,footer-link - utm_term — paid search keyword. Rarely used now.
Source and medium do the work. Campaign is for grouping. The other two are optional and most people should ignore them until they have a specific question.
The four rules
Everything lowercase, always
Newsletter, newsletter and NEWSLETTER are three different sources in every analytics tool. This one mistake accounts for more fragmented reports than every other cause combined.
Pick lowercase, apply it without exception, and if your tool can normalise case on ingest, turn that on.
Hyphens, never spaces or underscores
A space becomes %20 and looks broken in reports. Underscores are fine technically but pick one and never mix. Hyphens are the convention.
Never tag internal links
The most damaging mistake, and it looks helpful.
Tagging a link from one page of your site to another starts a new session in most tools and overwrites the original acquisition source. A visitor who arrived from Google and clicked a tagged internal banner is now recorded as having come from that banner. You have destroyed the acquisition data for your most engaged visitors — the ones who clicked something.
Internal links get no UTMs, ever. If you want to measure internal clicks, use an event.
Medium comes from a fixed list
Source can be anything; medium must not. Fix a list and never add to it casually:
email, social, cpc, display, affiliate, referral, qr, push
The moment somebody uses e-mail, Email and newsletter as mediums, your channel grouping is fiction.
A convention that survives
Write this down somewhere shared, because the failure mode is drift, not ignorance.
source: the specific place (linkedin, newsletter, partner-acme)
medium: from the fixed list (email, social, cpc, display, affiliate)
campaign: yyyy-mm-thing (2026-08-launch, 2026-q3-webinar)
Dating the campaign is the small detail that pays off most. In eighteen months, spring-launch is ambiguous and 2026-03-launch is not.
Keep a spreadsheet of every URL built. It sounds bureaucratic and it is the only thing that stops the same campaign being tagged three ways by three people.
Where UTMs mislead
They overwrite better information
A campaign parameter beats the referrer in every tool. Usually correct — a tag is an explicit statement, a referrer is an inference.
But it produces one specific, widespread error: ChatGPT appends utm_source=chatgpt.com to the links it hands out. So your largest AI referral surface is filed under Campaigns, beside your newsletter, rather than as AI traffic. Your campaign report contains a campaign you did not run and your AI number is missing its biggest contributor.
The fix is to classify AI referrers before the campaign branch. The full treatment, including the Gemini problem.
They are visible and editable
UTMs are in the URL. People share tagged links, paste them into Slack, and post them on forums. Traffic then arrives tagged as an email campaign because someone forwarded a newsletter link.
Nothing prevents this. Just know that campaign numbers have a fuzzy edge, and that a campaign with a strangely long tail is usually a shared link rather than sustained performance.
They attribute the click, not the journey
A UTM records where the last click came from. Someone who found you through search in March, subscribed, and clicked a newsletter link in June is recorded as newsletter traffic. That is not wrong, but it is not the whole story, and it systematically over-credits the channels that come last.
Cleaning up an existing mess
Normalise case on ingest if your tool supports it. Fixes the largest single problem retroactively.
Consolidate mediums to your fixed list and map the old values.
Audit for internal tagging. Look for campaign traffic whose landing page is deep in the site and whose referrer is your own domain. That is the signature.
Then leave the past alone. Historical data tagged inconsistently is not recoverable, and rewriting it is a large project that produces a slightly tidier version of numbers nobody will look at again. Start the convention today and let the mess age out.
Common questions
Should I use UTM parameters on internal links?
No, never. A UTM on an internal link starts a new session in most analytics tools and overwrites the visitor's original acquisition source — so somebody who arrived from Google and clicked a tagged internal banner is recorded as having come from that banner. It destroys acquisition data for your most engaged visitors. Use an event to measure internal clicks instead.
Why does ChatGPT traffic appear as a campaign in my analytics?
Because ChatGPT appends utm_source=chatgpt.com to the links it gives people, and every analytics tool prioritises campaign parameters over the referrer. The result is that your largest AI referral source lands in the campaign report next to marketing you actually ran. Fixing it means classifying AI referrer hosts before the campaign rule is evaluated.
What is the right naming convention for UTM parameters?
Lowercase everywhere, hyphens rather than spaces or underscores, medium drawn from a short fixed list, and campaign names prefixed with the year and month. Dating campaigns is the detail that pays off most — in eighteen months spring-launch is ambiguous and 2026-03-launch is not. Keep a shared record of every URL built, because the real failure mode is drift between people rather than ignorance.