TapCub is live — analytics, insights and live chat, free on one platform

Free tool URL parser: every part and parameter, decoded

Paste a landing-page link, a redirect URL or a whole list of them. Each one is split into its parts, every query parameter is decoded in a table, and campaign tags and ad click IDs are labelled with the platform they belong to, along with the mistakes that stop analytics from reading them.

  • One URL or 200 at once
  • UTM and 18 click IDs
  • Runs locally
Parser

Parse URLs

One URL per line. The sample has a newsletter link, a Google Ads click and a single-page-app link with its tags after the #. Try the other samples for ad macros and developer URLs.

Full URLs, URLs without https://, app deep links (myapp://…) or relative paths such as mini-program pages. Up to 200 lines.

URLs

3

Parameters

12

In the query and in the fragment.

Tracking parameters

10

UTM, click IDs and other known tracking tags.

URLs with problems

2

Errors or warnings below.

Checks

  • WarningLine 1utm_source=Newsletter has capitals. UTM values are case-sensitive in reports, so Newsletter and newsletter become two rows.
  • WarningLine 1color appears 2 times. URLSearchParams.get() and the TapCub script read the first value; PHP's $_GET keeps the last. Keep one.
  • NoteLine 2TapCub's default channel rules assign a visit with gclid to Paid search, ahead of any UTM tags.
  • ErrorLine 3UTM tags after # (utm_source, utm_medium). The fragment is never sent to the server, and analytics scripts read the query string, so these tags are lost. Move them before the #.

Parts

LinePartValue
1Protocolhttps
1Hostshop.example.com
1Port443 (default)
1Path/products/trail-shoes
1Query?utm_source=Newsletter&utm_medium=email&utm_campaign=spring_sale&color=blue&color=red
1Fragment—
2Protocolhttps
2Hostwww.example.com
2Port443 (default)
2Path/pricing
2Query?gclid=Cj0KCQiA5rGuBhCnARIsAN11vgR&utm_source=google&utm_medium=cpc&utm_campaign=brand
2Fragment—
3Protocolhttps
3Hostapp.example.com
3Port443 (default)
3Path/
3Query—
3Fragment#/signup?utm_source=linkedin&utm_medium=social&li_fat_id=8f2c1e

Parameters

Decoded values. Raw text is shown only when it differs.

LineNameValue (decoded)RawTypeWhere
1utm_sourceNewsletter—UTMQuery
1utm_mediumemail—UTMQuery
1utm_campaignspring_sale—UTMQuery
1colorblue—ParameterQuery
1colorred—ParameterQuery
2gclidCj0KCQiA5rGuBhCnARIsAN11vgR—Click ID · Google AdsQuery
2utm_sourcegoogle—UTMQuery
2utm_mediumcpc—UTMQuery
2utm_campaignbrand—UTMQuery
3utm_sourcelinkedin—UTMAfter #
3utm_mediumsocial—UTMAfter #
3li_fat_id8f2c1e—Click ID · LinkedInAfter #
Without tracking parameters
https://shop.example.com/products/trail-shoes?color=blue&color=red
https://www.example.com/pricing
https://app.example.com/#/signup

UTM tags, click IDs and other tracking tags removed; everything else kept as written.

As JSON
[
  {
    "url": "https://shop.example.com/products/trail-shoes?utm_source=Newsletter&utm_medium=email&utm_campaign=spring_sale&color=blue&color=red",
    "scheme": "https",
    "host": "shop.example.com",
    "port": null,
    "path": "/products/trail-shoes",
    "query": {
      "utm_source": "Newsletter",
      "utm_medium": "email",
      "utm_campaign": "spring_sale",
      "color": [
        "blue",
        "red"
      ]
    },
    "fragment": null
  },
  {
    "url": "https://www.example.com/pricing?gclid=Cj0KCQiA5rGuBhCnARIsAN11vgR&utm_source=google&utm_medium=cpc&utm_campaign=brand",
    "scheme": "https",
    "host": "www.example.com",
    "port": null,
    "path": "/pricing",
    "query": {
      "gclid": "Cj0KCQiA5rGuBhCnARIsAN11vgR",
      "utm_source": "google",
      "utm_medium": "cpc",
      "utm_campaign": "brand"
    },
    "fragment": null
  },
  {
    "url": "https://app.example.com/#/signup?utm_source=linkedin&utm_medium=social&li_fat_id=8f2c1e",
    "scheme": "https",
    "host": "app.example.com",
    "port": null,
    "path": "/",
    "query": {},
    "fragment": "/signup?utm_source=linkedin&utm_medium=social&li_fat_id=8f2c1e"
  }
]

Repeated parameters become arrays.

Runs entirely in your browser. Nothing you type here is uploaded or stored by TapCub.

Version v1.0Updated Update history

Read the result

What each table tells you

Four counts on top, then the checks, the parts of each URL, every parameter and two ready-to-copy outputs.

Parts

Protocol, host, port, path, query and fragment as the browser sees them. Internationalised domains are shown both ways (xn--mnchen-3ya.de → münchen.de), and an encoded path is decoded next to the raw form.

Parameters

Each name and value, decoded. The Type column labels UTM tags, the 18 click IDs TapCub reads, other known tracking tags, and names that are one letter-case away from a UTM tag or click ID. Parameters after # are marked in red because analytics does not read them.

Checks

Errors break attribution (tags after #, broken encoding). Warnings split or lose data in reports (capital letters, duplicates, unfilled macros). Notes explain how TapCub will treat a click ID.

Clean URL and JSON

The clean version drops tracking parameters but keeps everything else as written, which is handy for canonical tags and sharing. The JSON gives the parts and a parameter object for code, with repeats as arrays.

The parser follows the WHATWG URL standard that browsers implement, and reads the raw text separately, so problems the browser silently "fixes" (such as a ? after the #) are still reported.

How to use it

Three steps

Nothing to install and nothing to click to run.

  1. 1

    Paste URLs

    Copy them from an ad preview, an email, a server log or the address bar. One per line; a column copied from a spreadsheet works too.

  2. 2

    Read the checks

    Fix errors first: tags after #, broken escapes, unreadable URLs. Then look at warnings such as capital letters or a parameter sent twice.

  3. 3

    Copy what you need

    Copy a single decoded value from the table, the clean URLs for a canonical tag, or the JSON for a test.

Rules

Anatomy of a URL

RFC 3986 defines the generic parts; browsers parse by the WHATWG URL standard. A query parameter is decoded by the form-encoding rules: split on &, then on the first =, turn + into a space and undo %XX escapes.

  • The fragment (after #) stays in the browser and is never sent in the HTTP request
  • Parameter names and values are case-sensitive: utm_Source is not utm_source
  • The same parameter can appear more than once; which value wins depends on the reader
  • Non-ASCII hosts are sent in Punycode (xn--); non-ASCII paths and values are sent as UTF-8 %XX escapes
Parts of https://shop.example.com:8443/products/shoes?utm_source=newsletter&color=red#reviews
PartValueSent to the server?
ProtocolhttpsDecides how to connect
Hostshop.example.comYes (Host header)
Port8443 (443 if omitted)Decides where to connect
Path/products/shoesYes
Queryutm_source=newsletter&color=redYes; analytics reads tags here
FragmentreviewsNo; stays in the browser
Worked example

Three sample links, three kinds of problem

What the parser reports for the default sample.

Findings for the sample URLs
URLRecognisedFindingFix
shop…/trail-shoes3 UTM tagsNewsletter has a capital; color appears twiceLowercase UTM values; keep one color
www…/pricinggclid (Google Ads) + 3 UTM tagsTapCub assigns Paid search because of gclidNothing to fix
app…/#/signupli_fat_id (LinkedIn) + 2 UTM tagsAll three are after #, so none reach analyticsPut the query before #: /?utm_source=…#/signup

The third case is common with single-page apps that use hash routing. The router reads its route from the fragment, but analytics scripts read location.search, which is empty here.

Common mistakes

Why parameters go missing in reports

The link works, the page loads, and the campaign still shows as Direct or Other.

Tags after the #

Anything after # is fragment. Put UTM tags and click IDs in the query, before the #, even on single-page apps.

Mixed letter case

utm_Source is ignored, and Facebook and facebook are two rows. Pick lowercase and keep to it.

A parameter added twice

Link builders and redirects often append a second utm_source. Readers disagree on which one counts.

Placeholders left in

{campaignid} or __CLICKID__ in a live URL means the ad platform did not fill the macro, or you opened the template link directly.

FAQ

URL parser questions

Still have a question?

Chat with the team behind TapCub — we usually reply within a few hours on business days.

What does a URL parser do?

It splits a URL into protocol, host, port, path, query string and fragment, and decodes each query parameter into a name and a value. This one also labels campaign tags and ad click IDs and checks for problems that stop analytics from reading them.

How do I get the parameters out of a URL?

Paste the URL; the Parameters table lists every name and decoded value. In code, new URL(link).searchParams does the same in a browser or Node.js. The JSON output gives you the result as an object to copy.

Why are my UTM parameters not showing in analytics?

The usual causes: the tags sit after # where scripts cannot read them, the name has a capital letter (utm_Source), a redirect stripped the query, or the page loads before the analytics script runs. The checks flag the first two.

What is the difference between the query and the fragment?

The query (after ?) is sent to the server and read by analytics. The fragment (after #) stays in the browser; it jumps to a section or drives a single-page app router. Tags placed in the fragment are invisible to the server and, by default, to analytics.

Which click IDs does it recognise?

The 18 parameters TapCub reads: gclid, wbraid, gbraid, dclid, fbclid, ttclid, msclkid, twclid, li_fat_id, ScCid, epik, rdt_cid, yclid, plus clickid (Ocean Engine), bd_vid (Baidu), gdt_vid and qz_gdt (Tencent Ads) and callback (Kuaishou). It also labels a few other tracking tags, such as srsltid and gad_source from Google, as not being click IDs.

Should + in a URL be a space?

In a query string, by the form-encoding rules browsers use, yes: q=caf%C3%A9+cr%C3%A8me is "café crème". In the path, + is a literal plus. Untick the option if your server treats + literally.

Is it safe to paste URLs with tokens or emails?

Parsing happens in your browser and nothing is uploaded or put in a share link. The checks will still warn you: a token or email in a query string ends up in logs and in the Referer sent to other sites.

Changelog

Update history

New features, fixes and data refreshes for this tool, newest first.

  1. · v1.0

    LaunchedFirst release.

Data this tool relies on

  • Ad platform click ID parameters — checked 2026-11-10, reviewed every 6 months (next review by 2027-05-10)

Missing something or found an error? Tell us — requests that come up often go into the next update. All tool updates

Next step

See which links actually bring visitors

Add TapCub to your site and every tagged link and ad click is grouped into channels and campaigns automatically.

See your data clearly. Find your growth.

Every click, backed by data. Install one line of code and see your first numbers in a minute.

No credit card · Free plans for analytics and chat · Cookieless analytics