The mistake that only exists across a set
Tag a single link wrong and you notice. Tag six links slightly differently over three months and you never notice, because each one looks perfectly reasonable on its own. That is the failure this tool exists for, and it is invisible to any builder that works one link at a time.
The mechanism is simple and unforgiving. Analytics platforms group campaign values by exact string match. They are case-sensitive and they do no fuzzy matching whatsoever. So facebook, Facebook and FB are not one source with the combined traffic of all three. They are three separate rows, each carrying a third of the sessions, each looking too small to be worth defending in a budget conversation. Nothing warns you. The report is correct; the tagging was not.
The same thing happens to campaigns through separators. spring_sale and spring-sale are different strings, so they are different rows, and the split is invisible unless you are looking at every value side by side. Which is exactly what the table above does.
What this checks, and why each one matters
- Capitalisation drift. The same value written with different capitalisation. The highest-frequency and highest-cost finding, because it is the easiest one to introduce by hand.
- Separator drift. Underscores against hyphens against spaces. Same idea, different cause, usually two people following two conventions.
- Typo-level near duplicates. Two values one or two characters apart. Flagged, never auto-corrected, because only you know which spelling was intended.
- Surrounding whitespace. A leading or trailing space survives URL encoding and creates a bucket that looks identical to the correct one in every report you will ever read.
- Empty values. A parameter present with nothing after the equals sign, which is worse than leaving it off, because it creates a real grouping bucket containing nothing.
- Parameters set on some links but not others. Checked for the five UTM fields only. Flagging every one-off click ID as missing everywhere else would bury the findings that matter.
Why it does not fix everything it finds
The corrected output normalises the three things where the right answer is unambiguous: capitalisation, separators and whitespace. It deliberately leaves two alone.
Near-duplicates are left because a tool cannot know whether spring_sale and spring_sail are a typo or two genuinely different campaigns, and quietly merging them would corrupt data in a way that is very hard to notice later. Missing parameters are left for the same reason: guessing that a link with no utm_medium should inherit the medium from its neighbours is a decision about your taxonomy, not a formatting fix. Abbreviations get the same treatment, which is why FB is not silently rewritten to facebook. It might be deliberate.
The convention is the actual fix
Auditing catches drift after it happens. The thing that stops it happening is a written convention that everyone tagging links follows: pick lowercase, pick one separator, write down the allowed values for source and medium, and keep that list somewhere the whole team can see before they build a link rather than after. A shared sheet beats any tool here, because the failure is human coordination rather than technology.
Once the convention exists, this page is the check that it is being followed. Run a quarter's links through it and the findings tell you whether the convention survived contact with reality.
Where this sits next to the other tools
Build individual links with the UTM builder, which handles the ad-platform macros and keeps a local history. Use the link decoder when you want to understand one URL in depth rather than compare many, including the click IDs that ad platforms add on top of your own tags. If you are unsure what belongs in each field in the first place, utm_source against utm_medium and UTM naming conventions both take a position rather than hedging. And the UTM builder comparison is honest about when a spreadsheet beats any tool, including this one.