UTM Builder

Build a campaign URL with UTM parameters — and watch every value get percent-encoded correctly as you type.

← Back to the URL Encoder

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.

Everything runs in your browser. Nothing you type is uploaded to any server.

1Build the campaign URL

Fill in the destination and the parameters. The link is generated as you type — this is the part every campaign URL builder does.

The full destination page. Existing query parameters and any #fragment are preserved.
Space encoded as
%20 is unambiguous everywhere. See block 3 for why + is risky.

2Every value, encoded live

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.

ParameterYou typedGoes into the URLWhat changed
Fill in a parameter above to see its value encoded.

3How bad encoding breaks a UTM link

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.

UTM campaign URL made from a destination and source, medium, and campaign parameters.
Start the query once with ?, then separate encoded parameter values with &.

An & inside a value ends the value and starts a new parameter

You intended utm_campaign=spring-sale&region=us
Parsed as utm_campaign=spring-sale + an orphan region=us nobody reports on
Consequence campaign name is cut short and the stray parameter pollutes your reports — no campaign URL builder can repair it afterwards, the split happens inside the URL itself
Correct utm_campaign=spring-sale%26region=us

A # inside a value cuts off everything after it

You intended &utm_campaign=q3-launch&utm_content=hero#top
Parsed as utm_content=hero is dropped — everything after # is the fragment, not the query string
Consequence utm_content never reaches analytics at all, whichever UTM generator produced the link
Correct utm_content=hero%23top

An = inside a value splits the name from the value

You intended utm_campaign=a=b
Parsed as utm_campaign=a + a stray b
Consequence the campaign name arrives mangled — a UTM maker outputs this happily, because it is doing exactly what you asked
Correct utm_campaign=a%3Db

A raw space breaks the link itself, before analytics ever sees it

You intended utm_campaign=spring sale
What happens many email clients and chat apps end the clickable link at the space — the click arrives as utm_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 URL
Correct utm_campaign=spring%20sale

+ is ambiguous — it may read as a space or as a literal plus

You intended utm_campaign=spring+sale
What happens under form-style decoding it becomes "spring sale"; under a strict RFC 3986 reader it stays "spring+sale". One campaign lands under two names.
Consequence one campaign splits into two rows in your reports — the UTM builder did its job, the value did not survive the trip
Correct utm_campaign=spring%20sale — %20 means space everywhere, no guessing

Double-encoding turns a real space into literal characters

You intended utm_campaign=spring sale (already encoded once)
Encoded twice %20 → %2520
Consequence reports show the literal text spring%2520sale — a campaign name nobody recognises. It is the most common way a url builder quietly double-encodes
Correct encode each value exactly once

Encoding the whole URL instead of each value kills every parameter

What people do run encodeURIComponent over the entire URL
Result ? becomes %3F, & becomes %26, = becomes %3D — the server sees one long path and zero query parameters
Consequence nothing is recorded at all — the campaign URL builder output looks right and tracks nothing
Correct encode each value; keep ? & = # as separators only

A lone % is an invalid escape

You intended utm_campaign=50%-off
What happens %-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 warning
Correct utm_campaign=50%25-off

Non-ASCII text needs UTF-8, not Latin-1

You intended utm_campaign=café
Encoded as Latin-1 you get mojibake; left raw, some servers mangle it on the way through
Correct utm_campaign=caf%C3%A9 — UTF-8 bytes, percent-encoded

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

Watch: UTM Campaign URLs Explained

Learn what source, medium, and campaign labels mean, and how to encode values safely before assembling a trackable link.

Watch on YouTube

Related tools

Every tool on this site runs entirely in your browser. Pick the encoding problem you have: