Benchvale

Why UTM names split your reports

Facebook, facebook, and fb are three sources, not one source with three spellings. Analytics products treat utm_source, utm_medium, and utm_campaign as exact strings. The split is the data model, not a reporting glitch. Decide one spelling, use it everywhere, and check a finished URL against that vocabulary before the link goes out.

The split, with a concrete URL

Two people on the same campaign each build a link. One types utm_source=Facebook. The other types utm_source=facebook. Both URLs load the landing page. Both look finished. A week later the report has two source rows for what everyone thought was one campaign, and neither row matches the plan.

A third person uses fb because that is what last quarter's spreadsheet said. That is a third row. None of these is a malformed URL. The UTM validator will pass all three if source, medium, and campaign are present and unambiguous. Validity is the wrong check for this problem.

Exact strings, not nicknames

Campaign parameters are stored and grouped as the characters that arrived. Facebook and facebook differ by one bit of case. Analytics products do not have a built-in list of brand nicknames, and they should not: mail and email might be the same channel in one team and two channels in another. Guessing would silently merge rows a person meant to keep apart.

That is why the split is not a glitch. The product did what the field asked: treat the value as a string. The same rule applies to medium and campaign. Paid Social, paid-social, and paid_social are three mediums. Fall Launch and fall_launch are two campaigns. Hyphens, underscores, spaces, and capital letters are all load-bearing.

Encoding can hide a fourth kind of drift. A space in a query value may appear as a plus in one copy of a URL and as %20 in another. Both decode to a space. A name that was typed with a plus as a literal character is a different string. The URL encoder is the place to see that difference rather than to argue about it in a spreadsheet.

What a builder cannot prevent

Google's Campaign URL Builder, and this site's UTM builder, will both emit a tagged URL. That is the job. Neither one can know that last month the team saved facebook and this week someone typed Facebook. A builder checks that the parameter names are spelled utm_source, not that the values match a vocabulary the team agreed on.

Structural checks still matter. Duplicate utm_source keys, empty values, and tags placed after the fragment will wreck attribution in a different way. Run those through the validator. Then run the same URL through a naming check, because a clean structure can still split the report.

Pick one spelling and keep it

The cheapest rule that works is lowercase, hyphens or underscores picked once, and no spaces. Write it down. The specific convention matters less than using it twice. A document that says "Facebook ads are facebook / paid_social" is enough, as long as the next link is compared with that document before it is sent.

The naming-consistency checker stores that vocabulary in this browser after an explicit save. It flags case, spacing, and punctuation drift against the saved form. It does not rewrite the URL, and it does not guess that fb means facebook. Those are aliases a person has to decide. Automatic correction would be dangerous when a destination system expects the value you typed.

The vocabulary stays on the device. It is a guard at the moment a tagged link is made, not a hidden team workspace. Sharing it would need an account or a server, which these tools do not have.

What this page does not claim

It does not claim that any named analytics product is broken. It does not claim that Benchvale is the only place to catch the split. It claims one checkable thing: if two URLs carry different exact strings in the same UTM field, they will land in different rows, and you can catch that in the browser before the link is published.

Maintained by Aaron Wilson
Published . Last updated . Method and formula: how we build tools. Something wrong? Tell us and it goes in the changelog.