Open Tools LibraryOpen Tools Library
Writing & SEOMarketingAnalyticsSEO7 min read·August 25, 2026

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.

Open Tools Library

Open Tools Library Team

Published August 25, 2026

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.

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.

FAQ

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.