UTM Builder
Add utm_source, utm_medium, utm_campaign and optional parameters to a link, with correct encoding and warnings for mixed case and spaces.
The page people land on. Existing parameters and the #fragment are kept. Without http:// or https://, https:// is assumed.
Where the traffic comes from, e.g. google, newsletter, linkedin. Required.
The channel type, e.g. cpc, email, social. Required.
Your name for the campaign or promotion. Required.
Optional. Paid search keyword.
Optional. Tells apart links or ads that point to the same page.
Optional. An identifier for the campaign.
Values are case-sensitive in reports, so Google and google show up as separate rows.
Spaces are written as %20 by default.
How it works
Enter the page you want to send people to, then fill in the source, medium and campaign name. The finished link appears as you type and the copy button takes it to your clipboard. Nothing is uploaded: the link is assembled in your browser, never opened, and never shortened or tracked.
The tool adds up to six parameters, always in this order: utm_source, utm_medium, utm_campaign, then utm_id, utm_term and utm_content if you filled them in. Per Google Analytics Help, utm_source names the referrer (for example google or newsletter4), utm_medium the channel type (cpc, email), utm_campaign the product, slogan or promo code, utm_term a paid keyword, utm_content what tells two creatives apart, such as two links in one email, and utm_id a campaign ID.
What happens to your URL
- Scheme. Only
http://andhttps://are accepted. If you typeexample.com/shop,https://is added. Anything else, such asjavascript:,data:,ftp:ormailto:, is rejected. - Host. A scheme-less entry must look like a host, meaning it contains a dot, or is
localhostor an IPv6 address. A single word likehellois rejected. The host is lowercased and an internationalized domain becomes punycode, somünchen.deis writtenxn--mnchen-3ya.de. Path case and existing query values are left as typed. - Existing query. Parameters already in the URL keep their order and the UTM parameters are appended after them.
- Fragment. The
#fragmentstays at the end and the UTM parameters go before it. - Encoding. Each value is percent-encoded as UTF-8.
&,=,#,?,+and%inside a value would break the URL, so they are encoded too. Letters outside ASCII are encoded byte by byte, which is why ş becomes%C5%9F.
Two options
Convert values to lowercase runs toLowerCase() on the UTM values only, never on the path or on other parameters. It is locale-independent: a capital I becomes i, and a Turkish İ becomes i followed by a combining dot above (U+0307), which is non-ASCII and is encoded as %CC%87.
Spaces in values is %20 by default, or you can replace each run of whitespace with _ or -.
Examples
| Input | Result |
|---|---|
| https://example.com/page source newsletter, medium email, campaign spring_sale | https://example.com/page?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale |
| Same, plus term "running shoes", content logo_link, ID abc123 | …&utm_campaign=spring_sale&utm_id=abc123&utm_term=running%20shoes&utm_content=logo_link |
| example.com/shop | https://example.com/shop?utm_source=… |
| https://example.com/p?a=1#section-2 | https://example.com/p?a=1&utm_source=…&utm_campaign=…#section-2 |
| https://example.com/p?utm_source=old&x=1 | https://example.com/p?x=1&utm_source=newsletter&… (the old utm_source is replaced, a note appears) |
| Campaign "summer sale 2026" | utm_campaign=summer%20sale%202026 |
| Same, spaces replaced with a hyphen | utm_campaign=summer-sale-2026 |
| Campaign "şeker bayramı" | utm_campaign=%C5%9Feker%20bayram%C4%B1 |
| Content "größe" | utm_content=gr%C3%B6%C3%9Fe |
| Campaign "a&b=c#d" | utm_campaign=a%26b%3Dc%23d |
| Source Google, medium CPC, campaign Spring, lowercase on | utm_source=google&utm_medium=cpc&utm_campaign=spring |
| javascript:alert(1) | Rejected, no link is produced |
Things to watch for
- Pick one naming convention and keep it. Google's documentation says values are case sensitive and recommends a strict naming convention;
Newsletterandnewsletterbecome two rows. A short written list of allowed sources and mediums for your team prevents most reporting clutter. - This tool does not know your analytics setup. It writes the parameters you ask for. How a given medium or source value is grouped or labelled depends on your analytics property and its settings, and that is not checked here.
- UTM parameters are visible. Anyone can read them in the address bar. Do not put names, e-mail addresses or anything private into a value.
- Do not put credentials in a link. A URL of the form
https://user:password@example.comis accepted without a warning, and it would travel with the link. Leave login details out. - Internal links. This page makes no claim about what your analytics does with UTM links placed on your own site. Check your tool's documentation and test before relying on it.
- Page reports can look different. Google notes that UTM parameters are left out of the Landing page + query string and Page path + query string dimensions and appear in Page location. Do not look for them in the first two.
- Length. Inputs up to 2,048 characters are accepted (500 per UTM field). A finished URL longer than 2,000 characters triggers a warning, a cautious limit rather than a specification one, because some browsers, servers and link shorteners may cut longer ones.
- Shortening is a separate step. If you shorten the link afterwards, test that the short link lands on the page with the parameters intact.
- The result is text. It is deliberately not a clickable link. Copy it and test it in a new tab before sending a campaign.
Frequently asked questions
Last updated: 10/11/2026
Related tools
Create a wa.me click-to-chat link from a phone number and an optional pre-filled message. The number is cleaned and the text is encoded for you.
Turn a URL or any text into a static QR code. Choose error correction, colors and an optional logo, then download it as SVG or PNG.