UTM Campaign URL Builder

Runs in your browser — your data is never uploaded.

Add UTM parameters to a link and get a URL that actually works. String concatenation gets this wrong in three predictable ways — a fragment left in the middle, a second question mark on a URL that already had parameters, and mixed-case values that GA4 reports as separate sources forever. This builds the URL properly and normalises the values on the way through.

How to use UTM Builder

  1. 1

    Paste the destination URL, including any parameters it already has.

  2. 2

    Fill in source, medium and campaign — the three that make a report readable.

  3. 3

    Click “Generate” and copy the tagged URL.

Share

Embed this tool on your site

Paste this where you want the tool to appear. It runs entirely in your visitor's browser — no uploads, no account, no tracking.

Please keep the attribution line — it's what keeps these tools free.

Need a different size, a dark theme, or a different tool? Build an embed lets you preview it first.

Frequently asked questions

Why does case matter?+

GA4 does not fold case in campaign parameters. Facebook, facebook and FaceBook become three rows in the acquisition report, and no amount of later filtering merges them cleanly. Lowercasing everything on the way out is the only reliable fix, which is why it is on by default.

Which parameters do I actually need?+

utm_source is required — without it the others are ignored. utm_medium is what puts the traffic in the right channel group; leave it out and GA4 files the visit under “(not set)”. utm_campaign separates this send from the next one. term and content are for paid keywords and A/B variants, and are usually noise otherwise.

Should I tag links between pages of my own site?+

No. A UTM-tagged internal link starts a new session in GA4 and reassigns the credit to whatever you put in utm_source — so the visitor Google Search sent you gets re-attributed to your own newsletter tag. Use internal link tracking or an event instead.

What happens to the #anchor on my URL?+

It stays at the end, where it belongs. Parameters appended after a fragment are not a query string at all — they become part of the fragment, are never sent to the server, and analytics records nothing. This is the single most common bug in hand-built campaign URLs.