gizmobench

UTM Builder

Paste the link you want to tag, fill in source, medium and campaign, and the tagged link is ready to copy. What is different here is what happens to the link you pasted: it goes through the browser's own URL parser rather than being treated as a string to staple parameters onto, so a link that already carries ?ref=news keeps it, in its original position, and a #fragment stays at the end where it belongs. A utm_source that is already on the link is rewritten in place rather than joined by a second one, and a tag whose box you clear is taken off rather than left behind to contradict the form. The finished parameters are printed as a table with the value you typed beside the encoded form the link actually carries, so a space is visibly %20 and nothing about the escaping is left to guess. Paste a link that is already tagged and the boxes fill from it. Build a set of links for one send, keep them as rows and export the lot as CSV.

The tagged link appears here as soon as the link and the three required boxes are filled in.

Existing parameters keptTags replaced, not doubledNothing uploadedWorks offline
Parameters written
0
Kept from the link
Waiting
Fragment
Waiting

Paste the link you want to tag, then fill in source, medium and campaign. A link that already carries parameters or a #fragment keeps them, and a link that already carries utm tags fills these boxes instead of gaining a second set.

Campaign parameters

Source, medium and campaign are the three every analytics tool reads. The other three are optional. Values go in exactly as you type them: capitals stay capitals, and a space is written as %20 rather than dropped.

The six campaign parameters

What the link actually carries

The table fills in as soon as the link and the three required boxes are filled in. It shows the value you typed beside the encoded form the link carries, so nothing about the escaping is left to guess.

Campaign rows

Add each finished link to the list and export the lot as a CSV, which is the sheet most teams keep their campaign links in. The list and the last source and medium are remembered in this browser. Start over, above the tool, forgets them.

No rows yet. Build a link above and press Add row: the boxes keep their values, so a second link for the same send is usually one edit away.

0 of 200 rows

Worked examples

  • A plain linkthe three required parameters, nothing else on the URL
    https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale
  • A link that already has ?ref=news#pricingthe parameter and the fragment both survive
    https://example.com/docs?ref=news&utm_source=partner&utm_medium=referral&utm_campaign=docs-push#pricing
  • A campaign name with a spacewritten as %20, never as a plus
    https://example.com/?utm_source=facebook&utm_medium=social&utm_campaign=summer%20sale

Paste a link that already carries utm tags into the top field and the boxes fill from it, so editing an existing campaign link never means building a second set of tags. A tag you clear is taken off the link rather than left behind to contradict the boxes.

What each parameter is for.
  • utm_source: Where the click came from: newsletter, google, a partner's site.
  • utm_medium: How it travelled: email, cpc, social, referral, qr.
  • utm_campaign: Which push it belongs to: spring-sale, launch-week.
  • utm_term: The paid keyword, when there is one.
  • utm_content: Which link in the same campaign: hero-banner, footer-link.
  • utm_id: A campaign row in an ad platform, for joining the data back up.
Accuracy. Exact URL construction: the browser's own parser encodes the parameters, an existing tag is replaced rather than duplicated, and anything already on the link, including the fragment, is kept. It checks the shape of the URL, not whether your analytics account expects those campaign names.

Common questions

What does each UTM parameter do?
utm_source is where the click came from: a newsletter, google, a partner's site. utm_medium is how it travelled: email, cpc, social, referral, a printed QR code. utm_campaign is the push it belongs to, such as spring-sale or launch-week. Those three are the ones analytics tools read to attribute a visit, and this page treats them as required. Three more are optional: utm_term is the paid keyword, utm_content tells two links in the same campaign apart, such as a hero banner and a footer link, and utm_id joins the link back to a campaign row in an ad platform. Every one of the six has its own box here, and the boxes you leave empty add nothing to the link.
Should UTM values be uppercase or lowercase?
Pick one convention and keep it, because the choice matters far less than the consistency. Analytics tools generally treat these values as text, so Facebook and facebook can arrive as two separate rows in a report that you then have to add up by hand. Lowercase with hyphens is the common house style for that reason. This page does not decide for you: it writes the values as you type them, with no lowercasing, no slugging and no opinion about your campaign names, and the only change it makes is trimming blank space off the ends, which is never what anyone meant to type. It checks the shape of the URL, not what your analytics account expects to see in it.
What happens to a link that already has parameters, or a #fragment?
They are kept. The link is handed to the browser's URL parser, so every parameter that is not one of the six utm fields stays exactly where it was, with the value it had, in the order it was in: a ?ref=news, a gclid, even a bare flag with no value at all. A #fragment is carried through to the end of the finished link, after the query, which is where a fragment belongs and where a builder that concatenates strings usually fails to put it. If the link already carries utm tags, they are read into the boxes rather than duplicated: pasting a tagged link into the top field fills the form from it, and building again replaces each tag once, in the position it already held.
Should I use spaces, underscores or hyphens in a campaign name?
A space is allowed and this page encodes it as %20, which is what a link needs outside a form submission, where a plus would be read as a plus rather than a space. The encoded column in the table shows you that happening. Even so, hyphens or underscores make a better campaign name: the link stays readable when someone pastes it into a chat message or a spreadsheet, and there is no %20 in the middle for a text editor or an email client to mangle. Underscores and hyphens are equally safe here, so the usual advice is hyphens for words in a name, underscores only where your team has already standardised on them.
Is my link or my campaign list sent anywhere?
No. The tagging happens in your browser, so there is no server in this, no account and nothing logged. This page has no connection to Google Analytics or any other analytics tool: it builds the link, and what your account does with the visit afterwards is between the two of them. The campaign rows and the last source and medium you used are remembered in this browser so a second link for the same send is one small edit away, and the Start over button above the tool forgets them. The CSV is written by your own browser when you press the button and is never uploaded.
Why will it not tag a mailto: or a javascript: link?
Because campaign parameters travel on a web address and nowhere else. A mailto: link opens an email client, a javascript: link runs code in the page, an ftp: link fetches a file: none of them arrives at a page where an analytics tag can read a utm_source, so tagging one produces something that only looks like a tracked link. Only http and https are accepted, and anything else is refused with a message naming the scheme it found. A link with no scheme at all, such as example.com/pricing, gets its own message asking you to write https:// in front of it, because guessing the scheme for you is the sort of silent repair that ships broken links.

Exact URL construction: the browser's own parser encodes the parameters, an existing tag is replaced rather than duplicated, and anything already on the link, including the fragment, is kept. It checks the shape of the URL, not whether your analytics account expects those campaign names.