writing/12 Sep 2026/8 min read

UTM parameters explained, with a naming scheme that survives a team

UTM tags are five query parameters your analytics tool reads to work out where a visitor came from. They are trivial to add and famously easy to ruin: within a year most workspaces contain Newsletter, newsletter and news-letter as three separate sources.

The five parameters

utm_source
Where the traffic came from, as a named place. newsletter, github, conference-badge. Required; without it the rest is unusable.
utm_medium
The kind of channel, not the specific place. email, social, print, referral. Keep this list to under ten values forever.
utm_campaign
The initiative this link belongs to. launch-2026-09. Date-prefixing makes it sortable and stops name reuse across years.
utm_content
Which variant or placement. header-cta versus footer-link. Optional, and the one that makes A/B results readable.
utm_term
Originally the paid search keyword. If you are not buying ads, leave it empty rather than inventing a use for it.

Five rules that prevent the mess

Lowercase, always
Analytics tools treat values case-sensitively. One capital letter creates a second row that will never merge with the first.
Hyphens, never spaces
A space becomes %20 or a plus sign depending on who encoded it, and you end up with both.
Fix the medium list
Agree on the allowed values once and write them down. Medium is the axis that everything else gets grouped under.
Never tag internal links
A UTM on a link between your own pages restarts the session attribution and overwrites the real source. This single mistake ruins more data than all the others combined.
Nothing private in a tag
UTMs are visible in the address bar, in referrer headers and in shared screenshots. No email addresses, no customer ids, no internal codenames.

How short links and UTMs fit together

They answer different questions and are not alternatives. The short link tells you how many people followed it. The UTM tells your site's analytics what to attribute the resulting visit to. Use both and you can see the drop-off between the two, which is usually the most interesting number in the whole exercise.

The practical arrangement: put the UTM parameters on the destination, stored with the link, so the ugly tagged URL never appears anywhere a human sees it. What you share is c1k.me/launch; what the browser lands on carries the full tagging. This also means you can correct a mistyped campaign name after the link has been shared, which is impossible if the tags live in the shared URL.

shared       c1k.me/launch

destination  https://example.com/pricing
             ?utm_source=newsletter
             &utm_medium=email
             &utm_campaign=launch-2026-09
             &utm_content=header-cta

Query forwarding, and why it is off by default

Forwarding passes query keys from the short URL through to the destination, so c1k.me/launch?ref=alice can reach your page with ref=alice intact. Useful for referral codes and per-recipient tokens.

It is off unless you name the keys to forward, because forwarding everything is an open redirect parameter hazard and a quiet way to leak whatever someone appends to your link into your own analytics. Name the two or three keys you need; anything else is dropped.

A checklist before you send

Every value lowercase, hyphen-separated, no spaces.
Medium is one of your agreed values, not a new one invented today.
Campaign name is date-prefixed and matches the other links in the same push.
One distinct link per channel, so the recorded redirect counts stay comparable.
Followed once yourself, end to end, and the tags survived any login or locale redirect on your own site.

That last one catches the failure nobody expects: a site that redirects to add a locale prefix and strips the query string on the way, silently discarding every tag you set.