Free tool

UTM parser: decode and lint any tagged URL

A UTM parser splits a tagged link into its utm_source, utm_medium, utm_campaign, utm_term and utm_content values and checks them for the mistakes that fragment analytics reports — capital letters, spaces, duplicate parameters and missing or unrecognized mediums. Paste a URL below; nothing leaves your browser.

Updated

UTM parameters

utm_source
LinkedIn
utm_medium
post
utm_campaign
spring sale
utm_term
—
utm_content
—
utm_id
—

Other parameters

fbclid
IwAR0abc
click id
Host example.com · path /pricing

Lint results

  • Warning: utm_source has uppercase letters ("LinkedIn"). UTM values are case-sensitive, so "LinkedIn" and "linkedin" become two rows.
  • Warning: utm_campaign contains spaces ("spring sale"). They get encoded as %20 or + and are easy to mistype — use dashes or underscores.
  • Warning: utm_medium "post" isn't one GA4's default channel rules recognize. Use email, social, cpc, paid_social, referral, affiliate, display or similar.
  • Warning: utm_campaign appears more than once. Tools usually read the first value and drop the rest.

Click IDs (gclid, fbclid, msclkid…) are added by ad platforms, not by you. They identify the ad click; they don't replace UTMs in non-Google tools.

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:

CheckWhy it mattersSeverity
utm_source missingWithout 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 # fragmentThe fragment never reaches the server and most trackers ignore it.Error
utm_medium missingGA4 can't apply its channel rules, so the visit lands in Unassigned or is guessed from the source.Warning
utm_medium not recognized by GA4Values 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 valuesEncoded as %20 or + depending on the tool, creating near-duplicates.Warning
Duplicate parametersTools read either the first or the last value — not both.Warning
utm_source looks like a URLUse a short name (newsletter) rather than https://….Warning
Special charactersAllowed, but they get percent-encoded and are easy to mistype.Note

How to audit a campaign's links

  1. 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. 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. 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. 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. 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

Know which campaign brought the customer, not just the click

VisitTrack records every UTM campaign and links it to the revenue it produced. Cookie-free, bot-filtered, live in two minutes. 14 days free.