Tracking · · Last updated: April 14, 2026

Your UTM tagging is a mess (and it's ruining your reports)

Inconsistent UTMs are the silent killer of marketing attribution. Here's how to fix the chaos without losing your mind.

Your UTM tagging is a mess (and it's ruining your reports)

I once opened a GA4 property and found fourteen different spellings of “facebook” in the source dimension. Fourteen. Facebook, facebook, fb, FB, Facebook.com, facebook.com, FaceBook, face_book, meta, Meta, meta.com, facebook_ads, facebook-ads, and my personal favorite: facbook. Someone was in a hurry that day.

This is what UTM chaos looks like in practice. Not in theory. Not in a hypothetical scenario someone made up for a blog post. This was a real client, spending real money, making real decisions based on data that was basically fiction.

UTM parameters seem simple. Five little query string parameters. How hard can it be? The answer, based on every analytics property I’ve ever audited, is: very hard apparently. Not because the concept is complicated but because humans are involved, and humans are wildly inconsistent creatures.

The five UTM parameters nobody agrees on

Quick refresher. The five UTM parameters are:

  • utm_source — Where the traffic comes from (google, facebook, newsletter)
  • utm_medium — The marketing channel type (cpc, email, social)
  • utm_campaign — The specific campaign name
  • utm_term — The paid keyword (mostly unused these days)
  • utm_content — Used to differentiate ad variations

That’s it. Five fields. And yet I have never, not once, in over eight years of doing this work, opened a GA4 property where these were used consistently. The chaos ranges from “minor inconsistencies” to “completely unusable data.” Most properties land somewhere around “we sort of tried but gave up.”

The hall of shame: common UTM sins

Let me walk you through the greatest hits. I see all of these regularly.

Mixed case. This is the number one offender. GA4 treats Facebook and facebook as two different sources. They show up as separate line items in your reports. Your traffic from one source gets split across multiple rows, and your numbers for each one look smaller than they actually are. I’ve seen properties where fixing the casing alone changed the “top 5 sources” ranking completely.

No standard for source and medium. One person tags their LinkedIn ads with source=linkedin / medium=paid, another uses source=linkedin / medium=cpc, and a third goes with source=LinkedIn / medium=paid_social. GA4 now shows three rows for what should be one. Multiply this across every platform and you’ve got a mess that takes hours to untangle.

Campaign names that mean nothing. Campaign names like spring_sale_v3_FINAL_updated or test123 or john_campaign_march. Three months later nobody knows what these refer to. The data is technically there but practically useless because no one can map campaign names back to actual marketing activity.

Made-up mediums. GA4 has a set of default channel groupings that rely on the medium parameter to classify traffic. If you use medium=cpc, your traffic gets classified under Paid Search. If you use medium=paid or medium=advertising or medium=sponsored, it falls into Unassigned. That’s the analytics equivalent of a black hole. Your traffic exists but GA4 doesn’t know what to do with it.

I pulled the GA4 documentation on default channel grouping rules once and printed it out. It’s surprisingly specific. If you use medium=social, the traffic goes to Organic Social. If you use medium=social_paid, it goes to… nowhere standard. You need medium=paid_social or include “cpc” in the medium for paid channels. Small differences with big consequences.

The content parameter, perpetually ignored. I’d estimate 95% of the UTM-tagged URLs I see in the wild don’t use utm_content at all. This is a shame because it’s the one parameter that lets you compare ad variations, creative types, or placement positions within the same campaign. It’s basically free A/B test data that nobody collects.

How bad UTMs actually break your reports

Let me be specific about the damage. It’s not just “messy data.” It’s wrong conclusions leading to wrong decisions leading to wasted budget.

Fragmented traffic sources. When facebook, Facebook, and fb all appear as separate sources, your actual Facebook traffic volume gets split three ways. If you’re looking at a top-10 sources report, Facebook might not even appear in it because each variant only captures a third of the actual volume. Meanwhile, some other source that happens to be consistently tagged looks bigger by comparison. You might shift budget toward it based on data that’s lying to you.

Misclassified channels. GA4’s default channel groupings depend on specific source/medium combinations. Use the wrong medium and your paid social traffic ends up in “Unassigned.” I audited a property last year where 23% of all traffic was classified as Unassigned. Twenty-three percent. Nearly a quarter of their traffic was invisible in channel-level reports. They were making budget decisions without a quarter of the picture.

Broken campaign analysis. If three people on your team name campaigns differently, you can’t aggregate performance by campaign. You can’t compare this quarter’s brand campaign to last quarter’s because they were tagged with completely different conventions. The data exists, but it resists analysis.

Attribution model confusion. When the same traffic source appears under multiple names, attribution models treat each one as a separate touchpoint. This is one of the reasons GA4 migrations go wrong so often. Your multi-touch attribution reports show facebook, Facebook, and fb as three different players in the conversion path. The path analysis becomes noise.

Tired of UTM chaos polluting your GA4 reports?I'll audit your current tagging, fix the inconsistencies, and set up a convention your team will actually follow.

Book a Free Audit →

Building a UTM convention that actually sticks

I’ve tried a lot of approaches to fixing this. Most fail because they rely on people remembering rules. People don’t remember rules. They’re busy. They have seventeen other things to do. They’re going to type whatever comes to mind and move on.

So the solution has to be structural, not aspirational. Here’s what works.

Step 1: Write a naming document. Keep it to one page. Literally one page. If your UTM naming guide is longer than one page, nobody will read it. Here’s a starter:

  • All values lowercase, always, no exceptions
  • Use underscores to separate words (not hyphens, not spaces, not camelCase)
  • utm_source: Use the platform name as it appears in GA4’s default channel groupings. google, facebook, linkedin, twitter, newsletter_[name]
  • utm_medium: Stick to GA4’s recognized mediums. cpc for paid search, paid_social for paid social, email for email, display for display ads, affiliate for affiliates
  • utm_campaign: Format as [year]_[quarter]_[campaign_type]_[name]. Example: 2026_q2_brand_spring_sale
  • utm_content: Use for ad variations. Format as [format]_[variant]. Example: video_30s_a, static_banner_b

That’s it. One page. Pin it in Slack. Print it out and tape it to the wall. Whatever works.

Step 2: Build a URL builder. Don’t let people construct UTM URLs manually. Ever. Give them a tool that enforces the rules.

You can use Google’s free Campaign URL Builder, but it doesn’t enforce any conventions. It’ll happily let you type FaceBook as a source. What I recommend instead is a Google Sheet with data validation.

Here’s the setup:

  • Column A: Base URL (paste the landing page URL)
  • Column B: Source (dropdown, locked to your approved sources)
  • Column C: Medium (dropdown, locked to your approved mediums)
  • Column D: Campaign (formula-assisted, auto-generates based on quarter + type + name fields)
  • Column E: Content (free text but forced lowercase via formula)
  • Column F: Generated URL (formula that concatenates everything)

The dropdowns are the secret weapon. If someone can only pick from google, facebook, linkedin, twitter, email, and tiktok, they can’t invent facbook. The formula in column F forces everything to lowercase automatically. You can add a LOWER() wrapper and a SUBSTITUTE() to replace spaces with underscores.

I share this sheet as a company-wide template. Everyone gets their own copy. The source and medium dropdowns pull from a central reference sheet that only one person can edit. Want to add a new source? Ask the person who controls the reference sheet. This creates a tiny bit of friction that prevents proliferation.

Step 3: Automate validation. Even with the spreadsheet, people will sometimes bypass it. They’ll copy a URL from somewhere, manually add UTMs, and introduce inconsistencies. So you need a safety net.

I set up automated checks in two places:

First, a GA4 exploration report that specifically looks for non-standard source/medium combinations. I run it weekly. If something weird shows up, I trace it back to whoever created the URL and fix it.

Second, if the team uses a link shortener like Bitly or a campaign management tool, I add validation rules there too. Some tools let you set required UTM formats. Use that.

The cleanup: fixing what’s already broken

Prevention is great. But you probably already have months or years of messy UTM data in GA4. What do you do about that?

The honest answer: you can’t retroactively fix data in GA4. What’s collected is collected. But you can work around it.

In Looker Studio or BigQuery, you can create CASE WHEN statements that normalize your sources. Something like: if source is Facebook or fb or FaceBook or facbook, map it to facebook. This is tedious to set up but it fixes your reporting going forward and historically.

In GA4’s admin section, you can use data filters and search/replace rules. There’s a “Modify Event” feature that lets you change parameter values on incoming data. You can set up a modification that lowercases all UTM values. This doesn’t fix historical data but it prevents new garbage from coming in.

I usually do both. Set up the GA4 modifications to clean incoming data, and build normalization logic in Looker Studio for historical reporting. It takes about a day to set up properly. Worth every minute.

A real example

I worked with a B2B SaaS company last year that was spending about $40K/month on paid campaigns across Google, LinkedIn, and Facebook. Their quarterly report showed LinkedIn as their worst-performing paid channel. They were about to cut the budget.

When I audited their UTMs, I found LinkedIn traffic split across linkedin, LinkedIn, Linkedin, and li. Their Facebook traffic was all consistently tagged as facebook because one person owned that channel and was meticulous about it. LinkedIn was managed by three different people who each had their own tagging habits.

Once I normalized the data, LinkedIn was actually their second-best performing paid channel by cost-per-lead. They almost cut budget to a channel that was working because the data made it look like it wasn’t.

That’s not a minor reporting inconvenience. That’s a $15K/month budget decision based on bad data.

The five-minute version

If you don’t have time for the full process, do these three things today:

  1. Go into GA4, pull up the Traffic Acquisition report, and look at your Session source values. If you see the same platform appearing multiple times with different spellings or casing, you have a problem.

  2. Create a one-page naming document with approved sources and mediums. Send it to everyone who creates campaign URLs.

  3. Build the Google Sheet with dropdowns. Share it. Tell people to use it.

These three things will fix 80% of your UTM problems. The remaining 20% requires ongoing vigilance and periodic audits, but the foundation is there.

UTMs aren’t exciting. Nobody goes to a marketing conference and gives a talk about UTM hygiene that gets a standing ovation. But I’ve seen six-figure budget decisions made on data that was wrong because someone typed facbook instead of facebook. The boring stuff matters. Do the boring stuff right.

AR

Artem Reiter

Web Analytics Consultant

Related Articles

Need help with your analytics?

Free 30-minute discovery call. I'll look at your setup, tell you what's broken, and whether I can help. No commitment.

Or email directly: artem@reiterweb.com