Free UTM Builder
A UTM builder adds tracking tags to a link so analytics can tell you which campaign the visit came from. Paste your URL, fill in the source, medium and campaign, and copy the tagged link. It runs entirely in your browser, so nothing you type leaves this page and there is no limit on how many links you build.
Existing query parameters and anchors are kept. Paste the URL exactly as it is.
Where the click comes from: the site, the platform or the list. google, linkedin, newsletter.
The kind of traffic it is: cpc, email, social, referral, affiliate. This is what most channel reports group on.
The specific push this link belongs to. Keep one name per campaign across every channel or the report splits in two.
Paid search keyword. Usually filled in automatically by the ad platform, so leave it empty unless you are tagging by hand.
Which link it was, when one page or email has several. header-cta, footer-link, variant-b.
Your own campaign identifier. GA4 uses it to join a click to imported cost data, so leave it empty unless you do that.
Your tagged URL
What each parameter is for
| Parameter | Answers | Example | Notes |
|---|---|---|---|
| utm_source | Where did it come from? | newsletter | The specific site, platform or list. Case sensitive: Facebook and facebook are two sources. |
| utm_medium | What kind of traffic is it? | The channel type, and what channel grouping is built on. An uppercase value matches no GA4 channel rule and lands in Unassigned. | |
| utm_campaign | Which push is it part of? | spring-sale | One name per campaign, across every channel. Case sensitive, so one spelling only. |
| utm_term | Which keyword? | running shoes | Paid search only, and usually filled in automatically by the ad platform. No channel rule reads it. |
| utm_content | Which link on the page? | header-cta | Tells two links to the same page apart. No channel rule reads it. |
| utm_id | Which campaign record? | 2026-spring-01 | GA4 only. Joins the click to cost data you import. |
The three mistakes that break tracked links
Tagging your own internal links. Putting UTMs on a link from one page of your site to another overwrites the real source of that visit with your own site. The person who arrived from a Google ad is re-attributed to your homepage, and the ad gets no credit. UTMs belong only on links coming in from somewhere else.
Inconsistent naming. "Facebook", "facebook" and "FB" are three sources in GA4, which stores what it is given and merges nothing. An uppercase medium is worse still: the default channel rules match lowercase strings, so utm_medium=Email is filed as Unassigned rather than Email. Agree the spellings once, write them down, and leave the lowercase toggle on.
Bolting parameters on with string concatenation. A URL that already has a query string or an anchor needs the tags merged into the right place, not appended to the end. Get it wrong and the tags land after the #, where analytics never sees them, and the link looks like it works because the page still loads. This builder parses the URL and rebuilds it properly.
Frequently asked questions
What is a UTM builder?
A UTM builder assembles a tracking URL by adding utm_ parameters to a link. When somebody clicks the tagged link, analytics reads those parameters and files the visit under the source, medium and campaign you named, instead of lumping it in with direct or referral traffic. This one runs entirely in your browser: nothing you type is sent anywhere.
What are the five UTM parameters?
utm_source is where the click came from (google, newsletter, linkedin). utm_medium is the type of traffic (cpc, email, social). utm_campaign is the specific push the link belongs to. utm_term is the paid keyword, usually filled in by the ad platform. utm_content distinguishes two links that point to the same page. GA4 adds a sixth, utm_id, which joins a click to imported cost data.
Which UTM parameters are required?
None are required by the URL itself, but source, medium and campaign are what almost every report groups on, so a link missing them ends up in an "other" or "unassigned" bucket. Term and content are genuinely optional and worth leaving empty unless you have a reason. Adding an empty parameter is worse than leaving it out: it makes the link longer and can create a blank row in reports.
Are UTM parameters case sensitive?
Yes, all of them, and GA4 does nothing to help. It has no normalisation step: values are stored exactly as they arrive and rows that differ only by case are never merged, so "Facebook", "facebook" and "FB" are three separate sources. Case does more damage in utm_medium than anywhere else, because GA4's default channel rules match exact lowercase strings: utm_medium=Email matches no channel at all and the session is filed as Unassigned rather than Email. Pick lowercase, write it down, and stick to it.
Can I use spaces in a UTM parameter?
You can type them, and this builder encodes them correctly so the link still works. They are still a bad idea: an encoded space shows up as %20 in the URL bar, which looks broken to anyone who reads the link, and some email clients and chat apps mangle it. Hyphens are the usual convention: spring-sale rather than "spring sale".
Do UTM parameters hurt SEO?
Not if they are used on links you control from other channels, which is what they are for. The risk is having the same page indexed at several tagged URLs. Google normally picks one via the canonical tag, and every page on a well-built site should already declare one. Where you should not add UTMs is on internal links between pages of your own site: that restarts the session attribution and overwrites the real source of the visit with your own.
What happens to UTM parameters after the click?
Analytics reads them from the landing page URL, records them against the session, and from then on the visit carries that attribution. The parameters stay in the address bar until the visitor navigates away, which is why some sites strip them with JavaScript after they load. Stripping is cosmetic: the data is already recorded by then.
Is this UTM builder free?
Yes, with no signup and no limit. The whole thing is a form in your browser, with no server call behind it, so there is nothing for us to meter and nothing to rate-limit.