Key takeaways
- Parameter names must be lowercase: UTM_Source is ignored by most tools.
- A UTM parameter that appears twice is read inconsistently — most tools take the first value and drop the rest.
- Parameters after a # are part of the fragment and never reach your analytics as query parameters.
- A missing or non-standard utm_medium is the most common reason GA4 reports traffic as "Unassigned".
What the UTM parser checks
Paste any link — from an email you received, an ad platform export, a colleague's spreadsheet — and the parser shows each UTM value on its own line, separates out ad click IDs (gclid, fbclid, msclkid, ttclid, li_fat_id and others) and lists everything else in the query string. Then it runs the same lint rules as our UTM builder:
| Check | Why it matters | Severity |
|---|---|---|
| utm_source missing | Without a source, GA4 and most tools discard the other UTM values. | Error |
| Parameter name not lowercase (UTM_Source) | Analytics scripts look for the exact lowercase names. | Error |
| UTMs after the # fragment | The fragment never reaches the server and most trackers ignore it. | Error |
| utm_medium missing | GA4 can't apply its channel rules, so the visit lands in Unassigned or is guessed from the source. | Warning |
| utm_medium not recognized by GA4 | Values like tweet, post or newsletter don't match any default channel rule. | Warning |
| Uppercase letters in values | "LinkedIn" and "linkedin" become two rows in reports. | Warning |
| Spaces in values | Encoded as %20 or + depending on the tool, creating near-duplicates. | Warning |
| Duplicate parameters | Tools read either the first or the last value — not both. | Warning |
| utm_source looks like a URL | Use a short name (newsletter) rather than https://…. | Warning |
| Special characters | Allowed, but they get percent-encoded and are easy to mistype. | Note |
How to audit a campaign's links
- 1.Collect the final links exactly as they were sent — copy them from the sent email, the published post or the ad platform's preview, not from the brief. Link shorteners and email tools sometimes rewrite them.
- 2.Paste each URL into the parser and read the lint results. Errors mean the click won't be attributed as intended; warnings mean it will, but in a messy way.
- 3.Fix the source of the problem, not just the link: update the spreadsheet template, the email tool's default UTM settings or the ad platform's tracking template.
- 4.For a whole list of links, use the bulk mode of the UTM builder, which re-tags every row with a consistent naming convention.
- 5.Check where a corrected link will be classified with the referrer channel checker.
Example: a link with five problems
https://example.com/pricing?utm_source=LinkedIn&utm_medium=post&utm_campaign=spring sale&utm_campaign=dup- utm_source=LinkedIn has a capital L, so it won't merge with the lowercase linkedin used elsewhere.
- utm_medium=post isn't a medium GA4 recognizes — this visit will show as Organic Social only because the source happens to be a social site; with another source it would be Unassigned. Use social.
- utm_campaign=spring sale contains a space.
- utm_campaign appears twice; most tools keep the first value.
- The clean version: ?utm_source=linkedin&utm_medium=social&utm_campaign=spring-sale
UTM parameters vs click IDs
Click IDs are added by ad platforms when auto-tagging is on. gclid (Google Ads), fbclid (Meta), msclkid (Microsoft Ads) and ttclid (TikTok) identify a specific ad click so the platform can match conversions back to it. They don't describe the campaign in a way other tools understand: GA4 reads gclid natively, but a privacy-focused or self-hosted analytics tool generally sees only the UTMs. If you care about attribution outside the ad platform's own dashboard, keep UTMs on paid links as well — unless the platform warns that manual tags conflict with auto-tagging, as Google Ads can.
Common mistakes when reading UTM data
- Assuming every visit from a campaign is tagged. Forwarded emails, copied links and screenshots of QR codes lose or keep tags unpredictably; treat UTM counts as a floor.
- Comparing campaign totals across tools. GA4, ad platforms and cookieless analytics count sessions, clicks and visitors differently — expect 10–30% gaps.
- Reading utm_source as the referrer. They often differ: a newsletter link clicked in Gmail has a referrer of mail.google.com (or none) but a source of newsletter. UTMs win in GA4's reports.
- Forgetting that UTMs on internal links reset attribution. If the parser shows UTMs on a link to your own site from your own site, remove them.
Turning parsed UTMs into revenue reporting
Clean UTMs are the input; the output you want is which campaign produced customers. VisitTrack stores utm_source, utm_medium and utm_campaign on each visit and connects them to Stripe, Paddle, Lemon Squeezy, Polar or Razorpay payments, so campaign reports show revenue rather than just visits. It runs without cookies in cookieless mode and filters bots before they reach your numbers (how bot filtering works).
Frequently asked questions
How do I extract UTM parameters from a URL?
Paste the URL into the parser above and it lists each utm_ parameter separately. In code, use the URL API: new URL(link).searchParams.get("utm_source") returns the value (or null), and the same works for utm_medium, utm_campaign, utm_term and utm_content.
Why is my UTM traffic showing as Unassigned in GA4?
Usually because utm_medium is missing or isn't a value GA4's default channel rules recognize. Use standard mediums such as email, social, cpc, paid_social, referral, affiliate or display. The referrer channel checker shows which rule a combination matches.
Are UTM parameter names case-sensitive?
Yes. Analytics scripts look for lowercase names, so UTM_Source or Utm_Medium is ignored by most tools. Values are case-sensitive too: "Email" and "email" appear as separate rows.
What happens if a UTM parameter appears twice?
Tools read it inconsistently. Most take the first occurrence and ignore the rest, some take the last. Either way one of your values is silently lost, so remove duplicates — often they come from a tool appending UTMs to a link that already had them.
Do UTM parameters work after a # in the URL?
No. Everything after # is the fragment, which browsers don't send to the server and most analytics scripts don't parse as query parameters. Put the UTMs before the #, e.g. example.com/?utm_source=x#pricing.
Is fbclid or gclid a UTM parameter?
No. They are click IDs that ad platforms add automatically to identify an individual ad click. GA4 reads gclid, but most other analytics tools only understand UTMs, so keep UTMs on paid links if you want consistent attribution across tools.
Related tools and guides
- UTM builderTag one link or a whole CSV with consistent naming.
- Referrer channel checkerWhich GA4 channel does this source/medium land in?
- UTM parameters explainedGlossary definition with examples.
- Revenue attributionConnecting campaigns to payments.
- Bot filtering docsKeep bot clicks out of campaign numbers.
- VisitTrack blogGuides on analytics, attribution and growth.