UTM Builder
Tag a list of destination URLs with consistent utm_ parameters, without leaving the browser.
What this tool does
UTM Builder takes a list of destination URLs, one per line, and writes the campaign parameters onto each of them using the browser's own URL parser. Source and medium are required; campaign, term, content and utm_id are optional and appear only when you give them a value. Because each address is parsed rather than concatenated, query strings you already had survive — a link ending in ?ref=docs keeps that parameter and gains the tags after it — and a fragment such as #pricing stays at the end of the result where it belongs. Parsing also tidies the address on the way through: the host is lowercased, a default :443 or :80 disappears, and a path with ../ in it is resolved.
The normalisation settings are the reason to do this in a tool rather than by hand. Lowercasing is on by default, because analytics counts Email and email as two separate mediums and splits one channel across two rows. Spaces become hyphens, underscores or plus signs, so that one colleague's spring sale and another's spring-sale do not become two campaigns. The values are also checked as they are built: a missing utm_campaign, a utm_source that looks like a whole address rather than a short name, a medium outside the channel groupings GA4 recognises, and any result longer than 2,048 characters each produce a note beneath the table.
All of this happens in this browser tab. No URL is uploaded and none is fetched, which also names the tool's real limits: it never confirms that the destination exists, that it answers with a 200, or that your analytics is set up to read what you wrote. It emits six specific parameters — the five Google Analytics uses plus utm_id — and cannot produce Matomo's mtm_ set or any other vendor's naming. It applies one set of values to the entire batch, so a different utm_content per link means running it once per variant, and it does not shorten anything. The batch is also all or nothing: one unusable line — an ftp address, a mailto, a host that is really a typo — aborts the run with an error instead of being skipped, and nothing at all comes back until you fix or delete it.
How to use it
- Paste the destination URLs. One per line. Lines starting with # are skipped, so you can label groups. An address with no scheme is upgraded to https://, and a line that is not an http or https address stops the run.
- Fill in the source and the medium. Both are required and the job stops without them. Campaign, term, content and utm_id sit below and are written only when filled in.
- Choose the casing and the separator. Lowercasing is on by default. Decide whether spaces turn into hyphens, underscores or plus signs, or are left alone.
- Decide what to do with tags already present. Replacing existing utm_* parameters is on by default. Switch it off and any URL that already carries one keeps its own tags and gains none of yours.
- Read the table, then copy. Each row names the input, whether it was tagged, replaced or kept, and the finished address. Copy takes that last column, one line per URL, kept rows included.
Processing & privacy
Runs on your device. Your file is processed directly in this browser.
Common use cases
Tagging one newsletter issue
Every link in a single send can carry the same source and campaign, so the issue reports as one row rather than a scattering of unattributed visits.
Handing a tracking link to a partner
Give an affiliate or a sponsor an address you tagged yourself, and the attribution follows your naming rather than whatever they would have invented.
Comparing two placements
Tag the same landing page twice with different utm_content values, header-cta and footer-cta, and the report separates which position earned the click.
Retagging a list someone else built
Paste addresses that already carry stale tags, leave replacing switched on, and the old utm_ values are stripped and rewritten in a single pass.
Questions
Are my URLs uploaded anywhere?
What happens to parameters already on the address?
Why does "leave as spaces" still show a plus sign?
Why is my medium flagged as a problem?
What if a URL already has tags and replacing is off?
Should I tag links between my own pages?
Can it shorten the finished link?
Related tools
- Meta Tag Preview — See how your title and description look in search results.
- Redirect Checker — Follow a redirect chain and see every hop.
- WCAG Contrast Checker — Test colour pairs against AA and AAA thresholds.
- Favicon Generator — Generate a full favicon set from one source image.
- Open Graph Preview — Preview how a link unfurls on social platforms.
- Social Card Preview — Check Twitter, LinkedIn and Slack card rendering.