Your UTMs are lying to you, and the fix takes ten minutes
Five UTM mistakes that quietly corrupt attribution, why the damage is invisible in the dashboard, and the checks I run before any campaign goes live.
the short answer: broken UTMs do not throw an error. they produce a clean looking report with the wrong numbers in it, which is worse than no report at all, because you will act on it.
managing around $300k a month across channels, the tracking is the part that decides whether any of the rest was worth doing. these are the five failures i check for every single time, in the order they cause the most damage.
Capitalisation splits one channel into three
Facebook, facebook and FaceBook are three different sources to most analytics tools. so are CPC and cpc.
the result is not an error message. it is a source list where your biggest channel appears three times at a third of its real size, ranked below channels that were never actually bigger. budget decisions get made off that ranking.
pick lowercase for everything and never deviate. it is an arbitrary rule and that is the point: arbitrary and consistent beats sensible and negotiable.
UTMs on your own internal links
this one destroys more data than the other four combined.
if a link from your homepage to your pricing page carries UTM parameters, most analytics tools treat that click as a brand new session from a new source. the visitor who arrived from your ad and then clicked through your own site is now recorded as two people, and the ad loses credit for whatever they did next.
UTMs are for traffic arriving from outside. never tag a link that points from your site to your site.
Auto-tagging fighting manual tagging
Google Ads adds its own click identifier automatically. if you also hand-write UTM parameters on the same ads, the two can disagree about what the campaign was called, and which one wins depends on settings most people have never opened.
pick one. if you are running Google Ads, let auto-tagging do it and do not hand-tag on top.
Redirects that eat the parameters
link shorteners, vanity domains and some redirect rules strip query strings. the click happens, the person lands, and every parameter you carefully set is gone, so the session files itself under direct traffic.
direct traffic that grows every time you launch a campaign is not direct traffic. it is your campaign, unattributed.
test the actual final URL after every hop, not the one you pasted into the ad.
Campaign names nobody can read three months later
campaign=test2 was legible on the day you made it. in the quarterly review it is landfill.
the fix is a naming convention decided once and applied without exceptions, so the report reads itself: channel, objective, audience, creative, date. boring and consistent, same principle as the lowercase rule.
The ten minute version
before anything goes live: build the links in one place with the same convention, paste every final URL through a checker to confirm the parameters survive the redirect, and confirm no internal link on the site carries a UTM.
that is what the UTM builder and the UTM checker are for, and the campaign name builder handles the convention so you are not inventing one per campaign.
none of this is clever. it is the difference between a report you can spend money against and a report that looks exactly as trustworthy while being wrong.
want someone to audit the tracking before the spend scales? the breakdown call is free. Let’s talk Growth.