UTM Tagging Mistakes That Are Quietly Breaking Your Analytics
'Newsletter' and 'newsletter' look identical at a glance. In Google Analytics, they're different campaigns splitting one set of numbers into two unnoticed rows.
Key takeaways
- Inconsistent casing ("Newsletter" vs. "newsletter") is treated as two entirely separate values by Google Analytics, silently splitting one campaign's real performance across two rows in every report.
- Leaving source, medium, or campaign blank doesn't skip tracking — it shows up as "(not set)" in reports, a bucket that quietly absorbs traffic nobody can trace back to a specific effort.
- A space in a UTM value gets URL-encoded into a "+" or %20 in the actual link, which looks broken the moment it's shared as plain text rather than clicked directly.
- Reusing the same source/medium pair for both paid and organic traffic from the same platform (e.g. tagging both Instagram ads and organic posts as "social") makes it impossible to separate ad spend performance from free reach.
- Tagging a URL that already has query parameters with a plain "?" instead of "&" silently overwrites the existing parameter instead of adding to it.
The mistake that looks like nothing and breaks everything
UTM tagging feels like it should be foolproof — five text fields, appended to a URL, done. In practice, it's one of the easiest places for a small, invisible inconsistency to quietly corrupt weeks of campaign data, because nothing about a broken UTM link looks broken. The link works. It goes to the right page. The tracking even shows up in reports. It's just wrong in a way that doesn't announce itself until someone's trying to explain why a campaign's numbers don't add up.
Casing inconsistency: the single most common one
Google Analytics treats UTM values as exact-match strings. "Newsletter" and "newsletter" are not the same campaign source to GA4 — they're two distinct values, and traffic tagged with each shows up as two separate rows in every report, even though a human reading the campaign name would never think to distinguish them. This happens constantly in practice: one person builds this month's newsletter link, someone else builds next month's, and unless there's a shared naming convention, the exact casing drifts. The fix isn't remembering perfectly — it's checking new values against what's already been used before typing them into a link.
“To Google Analytics, "Newsletter" and "newsletter" aren't a typo — they're two different campaigns.”
Blank fields don't skip tracking — they become "(not set)"
Leaving campaign source, medium, or campaign name empty doesn't mean that traffic goes untracked in some neutral way — it shows up in reports as "(not set)", a catch-all bucket that absorbs traffic without any way to trace it back to what actually drove it. A meaningful chunk of "(not set)" traffic in a report is often just this: links that went out without complete tagging, not some separate mysterious channel. All three of source, medium, and campaign should be filled in on essentially every tagged link — term and content are genuinely optional, but those three aren't.
Spaces turn into broken-looking links
A UTM value with a space in it — "spring sale" instead of "spring-sale" — doesn't break the link technically, but it does get URL-encoded into a "+" or a %20 sequence in the actual URL. That's invisible when someone clicks a hyperlink, but it looks obviously broken the moment the raw link is shared as plain text — in a Slack message, a text message, read aloud, or printed. Hyphens do the same job without ever looking like an error.
Paid and organic traffic hiding under the same tag
A subtler mistake: using the same source and medium for both paid and organic traffic from the same platform — tagging an Instagram ad and an organic Instagram post both as source=instagram, medium=social. Both are technically accurate, and both make it impossible to separate what paid spend actually earned from what free reach did on its own — exactly the comparison most people are trying to make when they check a campaign's numbers in the first place. The fix is a medium that actually distinguishes the two: paid-social for anything with ad spend behind it, social for organic posts, even on the identical platform.
Overwriting a URL's existing query parameters
If a destination URL already carries a query parameter — a product ID, a referral code, an existing tracking tag — tagging it incorrectly with a second "?" instead of appending with "&" doesn't add the UTM parameters alongside the existing ones; it silently produces a malformed URL where the original parameter gets lost or the link stops resolving as intended. This is easy to miss when building links by hand, since the mistake only shows up once someone actually inspects the final URL rather than just clicking it.
The actual fix is consistency, checked automatically
None of these mistakes require better discipline in the abstract — they require the specific value you're about to use to be checked against every value you've used before, at the moment you're typing it, not caught later in a confused analytics review. The UTM & Campaign URL Builder on this site does exactly that: it remembers every source, medium, and campaign value used in a given browser, flags new values that differ only in casing from something used previously, warns on missing required fields and stray spaces before a link ever gets shared, and correctly appends to a URL's existing query string instead of overwriting it.
Frequently asked questions
Does capitalization really matter in UTM parameters?
Yes — Google Analytics treats UTM values as exact-match, case-sensitive strings, so "Facebook" and "facebook" are tracked as two entirely separate sources, splitting one channel's traffic across two rows in every report.
What does "(not set)" mean in my analytics reports?
It means traffic arrived without a value for that dimension — most commonly because a UTM link went out with an empty source, medium, or campaign field, not because of some separate untrackable channel.
Should I use spaces or hyphens in campaign names?
Hyphens. A space in a UTM value gets URL-encoded into a "+" or %20 in the final link, which looks broken when the raw URL is shared as plain text rather than clicked as a hyperlink.
Why should paid and organic posts from the same platform use different mediums?
Using the same medium (like "social") for both makes it impossible to separate ad-driven performance from organic reach in reports — using "paid-social" for anything with spend behind it keeps that comparison possible.
How do I avoid inconsistent naming across a team?
Check new values against a shared history of everything already used, ideally at the moment a link is built — a spreadsheet works if someone maintains it, but a tool that surfaces the warning automatically catches drift a shared doc usually doesn't.