Your campaign report has more channels than you run
Paste your campaign URLs. We find the casing drift, the synonyms, the stray spaces and the missing parameters that split one campaign into three rows — and hand you the vocabulary you should have used. Everything runs in your browser.
lowercase · hyphens · one canonical value per channel · never empty
Analytics groups on the exact string. Facebook and facebook are two sources; spring-sale and Spring Sale are two campaigns. Nothing errors — your numbers just split in half.
The fix is a written vocabulary plus a validator you actually run before launching a campaign.
Nothing leaves your browser. Paste real URLs — we never see them.
—
Paste at least one URL to run the check.
—
| # | OK | Host | Source | Medium | Campaign | Content |
|---|
The taxonomy that survives a marketing team
| Parameter | Rule | Good | Bad |
|---|---|---|---|
| utm_source | The platform. One canonical value each. | FB, Facebook, facebook.com | |
| utm_medium | The delivery mechanism, from a closed list. | cpc | paid-social, PPC, paid_search |
| utm_campaign | The initiative. Lowercase, hyphenated, dated. | spring-sale-2026 | Spring Sale, spring sale |
| utm_content | The creative or placement variant. | video-a | Video A (final v2) |
| utm_term | Keyword, for search only. | running-shoes | Running Shoes |
| utm_id | Stable platform campaign id, if available. | 23851234567 | (left empty) |
Want this enforced instead of remembered? The taxonomy workspace in Signals stores your canonical vocabulary, flags drift as it happens, and builds compliant links.
Frequently asked questions
Why do my campaigns split into multiple rows?
Because analytics groups on the exact string. "Facebook" and "facebook" are two different sources. "spring-sale" and "Spring Sale" are two different campaigns. Nothing warns you — the report just quietly reports half the numbers, twice.
What should my UTM convention be?
Lowercase everything, hyphens instead of spaces or underscores, one canonical value per channel, and never leave utm_source, utm_medium or utm_campaign empty. Write it down once and validate against it, because a convention nobody can check is a convention nobody follows.
What is the difference between source and medium?
Source is where the traffic came from (facebook, google, newsletter). Medium is how it got there (cpc, email, social, referral). The most common mistake is putting the platform in both, which makes medium useless for grouping.
Should I use utm_id?
If your ad platform supports it, yes — it survives better than a hand-typed campaign name and gives you a stable join key against the platform's own reporting.
Do UTMs survive redirects?
Not always. Link shorteners, 301 chains and some consent flows drop query parameters. Capture them server-side on the first request that lands, before any redirect can eat them.
Is this tool sending my URLs anywhere?
No. The parsing runs entirely in your browser. Nothing is uploaded, stored or logged.
A vocabulary your team cannot drift from.
Signals keeps the canonical list, validates every new campaign against it, and builds the links for you — so the report stays one row per campaign, permanently.
More free tools
Same deal — instant, no signup.