Skip to content
Spellkit

The Five UTM Parameters, and How They Go Wrong

UTM tags are plain query parameters that analytics tools group into reports — so every typo, casing difference, and misplaced link shows up forever.

A UTM-tagged link is nothing more than a normal URL with up to five well-known query parameters appended. There's no registration, no validation, no API — your analytics tool simply reads the parameters off the landing page URL and files the visit under whatever strings it finds. That passivity is the whole design, and it's also why UTM data degrades so easily: the tool records exactly what you typed, including the mistakes.

The name comes from the Urchin Tracking Module — Urchin being the analytics product Google acquired in 2005 and turned into Google Analytics. The parameter names stuck, and today virtually every analytics tool reads them.

What each parameter is for

  • utm_sourcewhere the traffic came from: a site, platform, or property. google, newsletter, facebook, partner-blog. Answers "who sent this visitor."
  • utm_mediumwhat kind of channel carried it: cpc (paid clicks), email, social, referral, qr. Answers "by what mechanism." Source and medium are a pair: google / cpc is a paid ad, google / organic is a search result.
  • utm_campaign — the marketing effort the link belongs to: spring-sale, launch-2026. This is how you sum results across many links and channels belonging to one push.
  • utm_term — originally the paid-search keyword that triggered the ad. Outside search ads it's mostly repurposed or omitted.
  • utm_content — the variant identifier: which ad, which button, which of two links in the same email. hero-cta vs footer-link. This is your A/B handle within a campaign.

The hierarchy matters more than the individual tags: source and medium identify the channel, campaign identifies the effort, term and content identify the variant. Reports group in that order.

How analytics tools group them

Analytics tools treat these values as opaque strings and group sessions by exact match. Google Analytics additionally maps medium values into default channel groups — cpc lands in Paid Search, email in Email, social in Organic Social — but only if the value matches what the mapping expects. Invent your own medium (utm_medium=fb-boost) and those sessions fall into an unclassified bucket, invisible to channel-level reports even though the raw data is there.

Mistake 1: inconsistent strings split your rows

Because grouping is exact string match, Email, email, and E-mail are three different mediums, and Facebook, facebook, and fb are three different sources. Each variant gets its own report row, and none of them individually reflects the channel's real performance. The damage is permanent — historical sessions can't be re-tagged, only re-grouped with cleanup rules applied after the fact.

The fix is boring and absolute: lowercase everything, pick one canonical name per source, and use hyphens instead of spaces. A shared spreadsheet of allowed values does more for data quality than any analytics feature.

Mistake 2: UTMs on internal links

Tagging a link from your own homepage to your own pricing page (utm_source=homepage) feels harmless and is actively destructive. Analytics attributes a session to the campaign parameters present when it started — and when a visitor clicks an internal link carrying new campaign parameters, the tool treats it as a new traffic source. Depending on the tool and configuration, that either restarts the session or overwrites the original attribution. Either way, the visitor who arrived from a paid ad and then clicked your tagged internal banner is now credited to homepage — the ad loses the conversion it earned.

UTMs belong on links that point into your site from somewhere else: emails, ads, social posts, QR codes, partner sites. For internal click tracking, use event tracking instead — that's what it's for.

Mistake 3: length and encoding

Five parameters with descriptive values can add 150+ characters to a URL. That's functionally fine — servers and browsers handle far longer — but it's ugly in an email footer, unwieldy in print, and hostile in a QR code, where every character increases module density and hurts scannability.

Encoding is the subtler issue. Spaces and non-ASCII characters must be percent-encoded (summer salesummer%20sale), and tools disagree about whether %20 and + are the same value, which can split rows just like casing does. Values that stick to lowercase ASCII letters, digits, and hyphens never hit any of this.

The standard pattern for sharing tagged links is: build the full UTM URL, then shorten it. Spellkit's UTM link generator assembles the parameters with consistent formatting, and a URL shortener wraps the result into something printable — the redirect preserves the query string, so analytics still sees every tag. The full ugly URL exists for the analytics tool; nobody else ever has to look at it.