UTM Builder

Tag a list of destination URLs with consistent utm_ parameters, without leaving the browser.

Runs on your deviceWeb & SEOWorkingNo account needed

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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?
No. Parsing and tagging happen in this browser tab and no request is made to any destination, so the tool still works with the network disconnected and there is nothing to log.
What happens to parameters already on the address?
Every parameter that is not one of the six utm_ names — ref, gclid, a product ID, a filter — keeps its name and its value, and the campaign tags are appended after it. The query is rebuilt rather than spliced, though, so the encoding can shift: a comma or a tilde comes back percent-escaped, %20 becomes +, and a key with no value gains a trailing =. Those decode to the same thing, but a query string that was signed or hashed will not survive the round trip.
Why does "leave as spaces" still show a plus sign?
Query strings encode a space as +, so leaving spaces alone writes utm_campaign=spring+sale into the URL and analytics reads it back as spring sale. Picking the plus separator puts a real plus in the value, which has to be written as %2B and arrives in the report as spring+sale. Choose by the wording you want in the report, not by how the address looks.
Why is my medium flagged as a problem?
It is compared against the channel groupings GA4 recognises: email, cpc, ppc, social, referral, affiliate, display, organic, banner, sms, push and qr. Anything else still builds, but those sessions often land under Unassigned.
What if a URL already has tags and replacing is off?
It keeps the tags it arrived with, none of your new values are added, and the table marks the row as kept — beyond the parser's own tidying of the scheme, host and path, nothing moves. Merging your values into an existing set is not offered: per URL it is one or the other, and one existing utm_ parameter is enough to trigger it.
Should I tag links between my own pages?
No. UTM parameters on an internal link start a fresh session and overwrite the source that brought the visitor in, so the original channel vanishes from the report. Tag only the links people arrive on.
Can it shorten the finished link?
No. Long results are worth watching, though, which is why anything past 2,048 characters is flagged — some mail clients truncate there. Shortening needs a redirect service, which is a different job.

Related tools