Build a campaign URL with UTM parameters — and watch every value get percent-encoded correctly as you type.
Same tool, different names: UTM builder · UTM generator · UTM maker · url builder · campaign URL builder · Google campaign URL builder. All six describe one job — appending UTM parameters to a URL so analytics can tell where a visit came from. This page is that tool, with the encoding shown live as you type.
Fill in the destination and the parameters. The link is generated as you type — this is the part every campaign URL builder does.
What you typed, versus what actually goes into the URL. RFC 3986 unreserved characters A-Z a-z 0-9 - _ . ~ are kept; everything else is percent-encoded as UTF-8 bytes. Most UTM generators hand you the finished link and stop there — this one shows you the step in between.
| Parameter | You typed | Goes into the URL | What changed |
|---|
The parameters are right, the campaign still reports wrong — because of how characters were (or were not) encoded. Every case below is a real failure mode, and none of them care which tool produced the link: a UTM maker, a UTM generator, a url builder, a campaign URL builder or the Google campaign URL builder will all hand you a broken link if the value is encoded wrongly. Encoding behaviour breaks the report — not the choice of tool.

& inside a value ends the value and starts a new parameterutm_campaign=spring-sale®ion=usutm_campaign=spring-sale + an orphan region=us nobody reports onutm_campaign=spring-sale%26region=us# inside a value cuts off everything after it&utm_campaign=q3-launch&utm_content=hero#toputm_content=hero is dropped — everything after # is the fragment, not the query stringutm_content=hero%23top= inside a value splits the name from the valueutm_campaign=a=butm_campaign=a + a stray butm_campaign=a%3Dbutm_campaign=spring saleutm_campaign=spring and "sale" is plain text. Even a Google campaign URL builder link breaks here, because the break happens in the mail client, not in the URLutm_campaign=spring%20sale+ is ambiguous — it may read as a space or as a literal plusutm_campaign=spring+saleutm_campaign=spring%20sale — %20 means space everywhere, no guessingutm_campaign=spring sale (already encoded once)%20 → %2520spring%2520sale — a campaign name nobody recognises. It is the most common way a url builder quietly double-encodesencodeURIComponent over the entire URL? becomes %3F, & becomes %26, = becomes %3D — the server sees one long path and zero query parameters? & = # as separators only% is an invalid escapeutm_campaign=50%-off%-o is not a valid escape; strict decoders reject it or leave it literal, and the value arrives corrupted. A UTM generator that does not escape the percent sign emits this without warningutm_campaign=50%25-offutm_campaign=caféutm_campaign=caf%C3%A9 — UTF-8 bytes, percent-encodedEvery UTM maker has to make this choice — UTF-8 or Latin-1 — and getting it wrong stays invisible until the report shows mojibake. Type an accented or non-ASCII value into block 1 and watch block 2 encode it correctly as UTF-8.
No login · Unlimited use · No watermark · Runs only in your browser. This builder encodes every value once, as RFC 3986 with UTF-8, and leaves the structural characters to do their job.
Learn what source, medium, and campaign labels mean, and how to encode values safely before assembling a trackable link.
Every tool on this site runs entirely in your browser. Pick the encoding problem you have: