UTM hygiene: the thirty-minute fix worth lakhs
What the numbers say
- 01
A modelled unmanaged account carries 47 distinct utm_source values representing 9 real channels.
Modelled on stated assumptions: multiple people tagging links by hand over eighteen months with no naming table.
- 02
Case variants alone account for 21 of those 47 values, since analytics platforms treat Facebook and facebook as different sources.
Modelled on stated assumptions about mixed manual entry across desktop and mobile composition.
- 03
Collapsing 47 values to 9 moves a modelled 34% of sessions out of rows too small to appear in a default report view.
Modelled on stated assumptions: long-tail spellings each holding under 1% of sessions and falling below reporting thresholds.
- 04
One rule, lowercase everything, resolves a modelled 80% of the mess without touching taxonomy at all.
Modelled on stated assumptions: 21 of 26 excess values in the sample differ only by capitalisation or trailing whitespace.
- 05
A three-field taxonomy with fixed vocabularies produces 9 sources and 24 valid combinations, small enough to hold in a single sheet.
Modelled on stated assumptions: 9 sources, a controlled medium list, and campaign names generated rather than typed.
Sort your source report by sessions, descending, and scroll to the bottom. That is where this problem lives.
What an unmanaged account actually looks like
A modelled account after eighteen months of several people tagging links by hand: 47 distinct utm_source values representing 9 real channels.
| Real channel | Distinct values found | Examples |
|---|---|---|
| 8 | instagram, Instagram, IG, ig, insta, instagram.com, Instagram_Story, ig-story | |
| 7 | facebook, Facebook, FB, fb, facebook.com, FaceBook, fb-feed | |
| 6 | email, Email, klaviyo, Klaviyo, newsletter, e-mail | |
| 5 | whatsapp, WhatsApp, wa, WA, whatsapp-broadcast | |
| 5 | google, Google, adwords, googleads, google-ads | |
| Influencer | 7 | influencer, creator, Influencer, collab, ugc, partner, creators |
| Affiliate | 4 | affiliate, Affiliate, aff, affiliates |
| YouTube | 3 | youtube, YouTube, yt |
| Publication | 2 | pr, press |
| Total | 47 |
Twenty-one of the twenty-six excess values differ from a sibling only by capitalisation or a trailing space. They are not different taxonomies. They are the same word typed by different people on different days.
Analytics platforms treat these as distinct strings. Nothing warns you. Your session total is correct and every per-channel number underneath it is wrong.
The one rule: lowercase everything
Force every UTM value to lowercase, always, with no exceptions and no trailing whitespace.
That single rule resolves a modelled 80% of the mess in the table above, before anyone discusses what a campaign should be called. Instagram’s eight values collapse to four. Facebook’s seven collapse to four. Email’s six collapse to four.
It is the highest return rule in analytics because it requires no agreement about anything. Nobody has an opinion about capitalisation, which means nobody defends their version in a meeting.
Where possible, enforce it at the point of generation rather than at the point of reporting. A lowercase-only generator sheet is permanent; a lowercase transformation in a report has to be maintained by whoever inherits the report.
The taxonomy: three fields, fixed vocabularies
After casing, the remaining mess is vocabulary. Two people writing “influencer” and “creator” for the same thing is not a typo, it is a missing decision.
utm_source names the platform or partner. Fixed list, nine values in the model above, extended only by explicit decision rather than by whoever needs a new one on a Friday.
utm_medium names the traffic type: cpc, social, email, referral, affiliate, organic. Six values covers nearly everything and the list should be shorter than people expect.
utm_campaign names the specific activity, generated from a pattern rather than composed freely. Something like 2026-08-monsoon-launch sorts chronologically, groups naturally, and cannot be spelled two ways by two people.
Nine sources against a controlled medium list gives 24 valid combinations in the model, which fits on one sheet. If your combination count is in the hundreds, the taxonomy is doing work that a campaign field should be doing.
Why split rows hide more than they show
The damage is not that the rows are ugly. It is that small rows disappear.
Collapsing 47 values to 9 moves a modelled 34% of sessions out of rows too small to surface in a default report view. A channel genuinely producing 6% of traffic, split across seven spellings, appears as seven rows of under 1% each, and every one of them sits below the fold in a report sorted by volume.
That channel then gets described as not working. Budget moves away from it. Nobody is being careless; the number they looked at said what they said it said.
The effect compounds with creator and affiliate programs specifically, because those are the channels with the most partners and therefore the most hand-tagged links. It is the main reason creator programs get judged on codes instead, which has its own coverage problem, covered in tracking influencer sales without a discount code.
The thirty-minute fix, in order
Minutes 0 to 5. Export distinct utm_source and utm_medium values with session counts for the last twelve months. This is your inventory and it is usually the moment somebody says the number out loud in disbelief.
Minutes 5 to 15. Build the mapping table. Each existing value maps to one canonical lowercase value. Do not delete anything; the mapping is for grouping historical data, not for rewriting it.
Minutes 15 to 25. Build the generator. A sheet with three dropdowns and a formula that concatenates the finished URL, shared with everyone who ever makes a link. The dropdowns are the enforcement mechanism, not the documentation.
Minutes 25 to 30. Set the start date, announce it, and stop accepting hand-typed links from that day. Historical data stays as it was, grouped through the mapping table, and reproducible.
The last step is the one that fails most often. A standard nobody is required to use is a preference, and preferences degrade in about six weeks.
The four mistakes that survive a cleanup
Tagging internal links. UTMs on your own site’s links overwrite the original source in most setups, so a customer who arrived from a creator link and then clicked a tagged homepage banner is recorded as arriving from the banner. Use internal link tracking instead.
Using campaign as a dumping ground. When source and medium are too restrictive, people encode everything into campaign, and it becomes a free-text field with 400 values. Fix the source list rather than tolerating the overflow.
Putting personally identifying values in UTMs. Email addresses and customer identifiers in query strings end up in analytics platforms, referrer headers and shared screenshots, which is a problem you cannot retract.
Assuming UTMs cover partner traffic. A creator saying your URL out loud in a video carries no parameters at all. Partner traffic needs its own identifier at the redirect, not a query string that depends on somebody clicking.
Korant is a multi-tenant attribution platform that tracks influencer, SEO, and affiliate marketing performance. Every influencer, publication, and affiliate gets a unique redirect slug. Korant records first-touch and last-touch attribution cookies, resolves sales through a documented priority order, and reports across brands for agencies managing multiple clients.
Korant is not for stores with a single paid channel, or for brands that only need Shopify’s native reports. With one channel, a clean UTM taxonomy and a spreadsheet does the job, and the fix in this article is the whole solution rather than the first step of one.
What UTM hygiene does not fix
Clean tags produce clean rows and no additional truth. A session correctly labelled as instagram still tells you nothing about whether Instagram caused the purchase.
Nor does it help with the structural gaps. Cross-device journeys, view-through, word of mouth and every offline channel produce no parameters at all, and the tidiest possible taxonomy leaves them exactly as invisible as they were. The quantified version of that gap is in your attribution is wrong, and here is how wrong.
What it buys is that your per-channel numbers stop being wrong for a reason unrelated to the business. That is a low bar and most accounts do not clear it, which is why thirty minutes is a defensible use of an afternoon.
Questions people actually ask
Does UTM capitalisation actually matter?
Yes. Most analytics platforms treat utm_source values as case-sensitive strings, so Facebook, facebook and FaceBook become three separate rows with three separate session counts. Nothing warns you, the totals still add up correctly, and the per-channel numbers are all wrong in the same quiet direction.
What are the essential UTM parameters?
Source, medium and campaign carry almost all the value. Source names the platform, medium names the type of traffic, campaign names the specific activity. Term and content are useful for paid search and creative testing respectively, and are the first two people abandon when tagging by hand.
Should I tag internal links with UTMs?
No. UTMs on internal links overwrite the original source in most analytics setups, so a customer who arrived from a creator link and then clicked an internally tagged banner gets recorded as arriving from the banner. Use internal link tracking or event parameters instead.
How do I clean up UTM values that are already in my data?
Do not rewrite history. Apply the new standard going forward from a stated date, and build a mapping table that groups historical variants for reporting. Rewriting past data breaks reproducibility of any number anyone quoted before the cleanup.
What is the fastest way to enforce a UTM standard across a team?
Remove the ability to type one. A generator sheet with dropdown fields for source, medium and campaign that outputs the finished URL means the standard is the only path available, which works considerably better than a document explaining the standard.