UTM Link Parser – Read What a Campaign Link Actually Says
A tagged link is a sentence written in a syntax nobody proofreads. It gets pasted into a scheduler, forwarded through a shortener, copied out of a spreadsheet and typed again by hand, and by the time it is live the UTM parameters on it may not say what anyone intended. This UTM link parser is the reading half of campaign tagging: paste one URL or a whole batch, and each address is taken apart into the parameters it really carries, with the raw value and the decoded value side by side. It is the inverse of a campaign URL builder — nothing here writes, rewrites or cleans a link. Everything runs in your browser, and the tool makes no network request of any kind.
The anatomy strip: where a tag lives decides whether it exists
The first thing you see is the URL drawn as labelled segments — scheme, host, path, query string, fragment — with every key=value pair inside the query rendered as its own chip. Recognised UTM keys, unknown keys and problem keys each carry a word as well as a colour, so the picture reads the same in monochrome. The segment that catches people out is the last one: anything after the # is a fragment, it never reaches a query parser, and a tag stranded there is simply not on the link as far as query-string reading goes. Seeing that once tends to fix it permanently.
Decoding, where naive parsers go wrong
A query string is application/x-www-form-urlencoded, the encoding URLSearchParams implements, and in it a + means a space. So utm_campaign=summer+sale is the value summer sale. Run the same text through decodeURIComponent instead and the plus survives as a literal plus — the two functions are not interchangeable, and this tool never mixes them. A fragment is not form-encoded at all, so a + there is genuinely ambiguous and both readings are shown rather than one being chosen for you. Malformed escapes such as %zz are caught instead of being allowed to break the parse, and a repeated key like ?utm_source=a&utm_source=b is listed as two rows, because repetition is legal in a URL.
summer+sale and summer%20sale decode identically, but the two links are not byte-identical, and that difference is invisible if you only ever see the decoded form.Batch audit: one campaign, several spellings
Paste a list and the consistency panel groups every distinct value found for each parameter, with counts and proportional bars. Values that differ only by letter case, by surrounding whitespace, or by a hyphen where another link used an underscore are pulled together under a collision marker — Summer_Sale on twelve links sitting directly above summer-sale on three is the single most useful thing a report like this can show you, and it is far more legible than a sentence describing it. A per-URL table sits underneath, any row opens into the full single-link view, and the whole thing exports to CSV with spreadsheet formula characters neutralised so a campaign value starting with = cannot execute when the file is opened.
What this tool will not tell you
It describes URLs, and only URLs. How any analytics product ingests, attributes, deduplicates or lowercases these parameters is behaviour inside that product, which cannot be observed from a link, so no claim about it appears anywhere here. A shortened address cannot be expanded either — that needs a request to the shortener — so a short link is parsed exactly as given. A misspelled key is suggested a correction and never silently given one; what the link says is what you see.