UTM Checker

Parameter values are case sensitive. Meta and meta are two different sources, and they become two different rows in every report you look at. The reason this is hard to catch is that each URL is perfectly correct on its own — the problem only exists across the set. So paste the whole set.

🔒 Your data never leaves your browser.

The three parameters reports are built on

utm_source, utm_medium, utm_campaign are required. A missing one does not produce an error — it produces (not set), which silently merges that traffic with everything else that is also missing it.

Recommended alongside them: utm_id, utm_source_platform, utm_term, utm_content. And two that are documented but which Analytics properties do not currently report on at all: utm_creative_format, utm_marketing_tactic — not wrong, just invisible.

Why a typo is worse than a missing tag

utm_med is not a parameter. It is not corrected, not warned about, and not reported — it is simply ignored, so the URL looks tagged, the campaign looks live, and the report shows nothing. A missing parameter at least shows up as (not set).

And why the fragment eats them

Anything after a # is never sent to the server. UTM parameters placed there are invisible to analytics while looking entirely normal in the address bar.

Build one

Values are lower-cased and spaces become hyphens, because those two habits are what prevent the splitting described above. The result is checked by the same rules before it is offered to you.

Every check this tool runs (10 rules)

UTM-R01 Missing a required parameter

Source, medium and campaign are the three that reports are built on. A missing one does not fail — it shows up as "(not set)", which quietly merges that traffic with everything else that is also missing it.

Fix: Add the parameter. "(not set)" in a report is almost always a tagging gap rather than an analytics problem.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-C01 Values differing only by case

Parameter values are case sensitive: utm_source=google and utm_source=Google are two different sources, and Meta and meta are two different values. Across a set of campaign URLs this splits one channel into several rows, and every one of the URLs looks correct on its own.

Fix: Pick one casing — lowercase is the usual convention — and apply it everywhere. Existing data cannot be merged retroactively.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-C02 Values differing only by separator

spring_sale and spring-sale are as different to a report as they are to a computer. Mixed separator habits fragment a campaign the same way mixed casing does, just less visibly.

Fix: Settle on one separator across the whole account.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-U01 Upper-case in a value

Nothing rejects an upper-case value, but because comparison is case sensitive it is the most common way a channel ends up split. Lower case throughout is the convention precisely because it removes the decision.

Fix: Lower-case the value.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-S01 Space in a value

A space has to be encoded, and it gets encoded two different ways — %20 by most tools, + by some. Those two are then different values in the report, so a space quietly becomes the same fragmentation problem as inconsistent casing.

Fix: Use a hyphen or an underscore instead of a space.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-P01 Unrecognised utm_ parameter

The parameter starts with utm_ but is not one Google documents. A typo such as utm_med or utm_campain is simply ignored, so the URL looks tagged and the report shows nothing.

Fix: Correct the spelling; the closest documented parameter is suggested where one is obvious.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-X01 Documented but not reported

utm_creative_format and utm_marketing_tactic are documented parameters that Google Analytics properties do not currently report on. They are not wrong; they will just not appear anywhere.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-F01 Parameters after the fragment

Anything after a # is a fragment and is never sent to the server. UTM parameters placed there are invisible to analytics, and the URL still looks perfectly tagged.

Fix: Put the query string before the fragment: ?utm_source=… #section, not #section?utm_source=…

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-D01 Duplicate parameter

The same parameter appears twice in one URL. Which one wins depends on the reader, so the value that ends up in your report is not something you chose.

Fix: Keep one.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

UTM-N01 Consistently tagged

Every URL carries the required parameters, and no value collides with another by case or separator.

Source: Google Analytics Help — URL builders: Collect campaign data with custom URLs

Parameter names, requirement levels and the case-sensitivity rule come from Google Analytics Help — URL builders: Collect campaign data with custom URLs. This tool checks the tagging; it cannot tell you whether the campaign was any good.