UTM Builder_
Build a tagged campaign URL and have it checked as you type. Fill in the destination and the three parameters analytics actually needs, and the finished link appears below with every value percent-encoded correctly — spaces as %20, never as a plus sign, because analytics tools disagree about what a plus means outside a form.
The checking is the point. You get told when the destination is not an absolute URL, when a required parameter is missing, when a value carries uppercase or a space that will fragment your reports, when something looks like an email address or a phone number, and when the URL you pasted already has UTM parameters on it. Batch mode turns a list of campaigns into one link each. Nothing is stored — no account, no server, and no saved list that outlives the tab.
GA4 extras — three more parameters, rarely needed
GA4 accepts and stores these, but none of them appears in the default Traffic acquisition or User acquisition reports — you can only read them by building a free-form report in Explore. Leave them empty unless you know you need them.
Tagging a link so the report makes sense
Three parameters do the work
A UTM parameter is nothing clever — a query string on the end of a URL that analytics reads and files the visit under. There are five classic ones, but only three carry the report: source says where the visit came from, medium says what kind of channel it was, and campaign is the name everything groups beneath. Miss the medium and GA4 often files the session as an ordinary referral, quietly losing the campaign you were measuring. Term and content are refinements — the paid-search keyword, and a slot for telling two links in one campaign apart.
Source, medium and campaign are one decision
People fill these three in as if they were independent, and that is where the mess starts. They form a hierarchy read from the outside in: the campaign is what you are running, the medium is the type of channel it ran through, the source is the specific place within that channel. Newsletter traffic is source newsletter, medium email; a paid Facebook post is source facebook, medium cpc. Decide the vocabulary once, write it down, use it everywhere — a convention nobody can find is one nobody follows.
Consistency beats cleverness
Every UTM value is case-sensitive, and analytics does not forgive that. Facebook and facebook are two different sources in two different rows, splitting one campaign's numbers in half. So do email and e-mail, or a stray trailing space. This is the most common way UTM data goes wrong, and why lowercase normalisation is on by default here — it costs nothing and removes a whole class of error before it reaches a report you have to explain.
What UTMs cannot tell you
They record what you claimed about a link, not what happened. Anyone can edit them, strip them, or share the tagged URL onward — at which point a visitor who found your post organically arrives carrying somebody else's campaign tag. They also only describe the entry: once the visit is attributed, every later page belongs to that session, which is why tagging your own internal links is so destructive. Treat UTM data as a reasonable account of how people arrived, not a ledger.
How to use
- 01Paste the destination URL. It must be absolute — including the https:// — and any query string or fragment already on it is preserved, with the parameters appended in the right place.
- 02Fill in source, medium and campaign. Those three are required; term, content and campaign ID are optional, and the GA4 extras stay collapsed because they do not appear in standard reports.
- 03Read the warnings. They are specific — a missing required field, a value that will fragment reports, something resembling personal data, or a parameter already on the URL you pasted.
- 04Copy_URL takes the finished link. Turn on Batch mode to paste a list of campaigns and get one URL per line, with Copy_All for the lot.
Four campaigns this covers
A newsletter send
One link per issue, so you can see which edition drove signups rather than lumping all email together.
newsletter · email · march-issue
?utm_source=newsletter&utm_medium=email&utm_campaign=march-issue
Paid social, two creatives
Same campaign, different content values, so the report tells you which creative actually worked.
facebook,cpc,spring-sale,,video-a
one URL per creative, from one paste
An affiliate link
A partner gets a tagged URL and their traffic separates cleanly from organic referrals in the report.
partner-site · affiliate · spring-sale
attribution that survives the redirect
A printed QR code
Tag the URL here, then encode it as a QR code — offline traffic finally shows up as a measurable source.
flyer · print · summer-market
a URL ready for the QR generator
Every parameter, and what analytics does with it
| Parameter | Required | What analytics does with it | Example |
|---|---|---|---|
utm_source | Yes | Where the traffic came from. GA4 needs it for a manual campaign to register at all. | newsletter |
utm_medium | Yes | The channel. Without it GA4 often buckets the session as referral and the campaign is lost. | email |
utm_campaign | Yes | The campaign name — the row everything else groups under. | spring-sale-2026 |
utm_term | No | Paid-search keyword. Read by GA4 as “Manual term”. | running-shoes |
utm_content | No | Distinguishes two links in the same campaign — the A/B slot. | header-cta |
utm_id | No | Campaign ID; the join key to imported cost data. | q2-1187 |
utm_source_platform | No — GA4 extra | Stored by GA4 as “Manual source platform”. Not in default reports — visible only in an Explore free-form report. | google-ads |
utm_creative_format | No — GA4 extra | Stored as “Manual creative format”. Not in default reports — Explore only. | carousel |
utm_marketing_tactic | No — GA4 extra | Stored as “Manual marketing tactic”. Not in default reports — Explore only. | remarketing |
The last three are real parameters GA4 stores, but they are invisible in the default acquisition reports — only a free-form Explore report shows them. Hence the disclosure rather than the main form.
Conventions that keep a report in one piece
| Campaign type | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Email newsletter | newsletter | email | march-issue | top-banner |
| Paid social | facebook | cpc | spring-sale-2026 | video-a |
| Affiliate link | partner-site | affiliate | spring-sale-2026 | — |
| Printed QR code | flyer | print | summer-market | table-tent |
| Organic social post | linkedin | social | launch-week | post-3 |
Three rules do the work: lowercase everything, hyphens rather than spaces, and a short fixed vocabulary for medium — email, cpc, social, affiliate, print, referral. Source names the specific place, medium names the kind of channel; mixing those two up is what produces a report with forty sources and no pattern.
Tips & best practices
- Write the vocabulary down where the whole team can reach it, and never invent a medium in a hurry — a one-off value is a permanently split row.
- Leave lowercase normalisation on. It removes the single most common cause of fragmented campaign reports at no cost.
- Put the variable in utm_content, not the campaign — two creatives in one campaign compare cleanly, two campaigns do not.
- Never tag a link that points at your own site from your own site — see the gotchas, it is worse than doing nothing.
- Check the parameter breakdown before sending — it shows the encoded value that reaches analytics, not the one you typed.
- For a printed campaign, build the tagged link here and encode it with the QR code generator so offline traffic is measurable.
Gotchas — how UTM data goes wrong
Values are case-sensitive, so Facebook and facebook are two rows
Analytics does no normalisation. One capital letter splits a campaign into two lines in every report that touches it, and the halves are hard to recombine afterwards because the raw hits are stored that way. So does a trailing space or a swapped separator — e-mail and email are unrelated to the report. Pick lowercase and hyphens, and let the toggle enforce it.
Tagging internal links destroys the attribution you already had
The most damaging mistake people make with UTMs. A tagged link from one page of your site to another starts a brand-new session and overwrites the original source, so the visitor who arrived from your newsletter is re-attributed to whatever you put on the internal link, and the campaign that actually earned the conversion vanishes from the report. UTMs are for traffic arriving from outside; inside your own site use ordinary links and let analytics track the journey.
Personal data in a parameter breaches Google’s terms
An email address, name or phone number in any UTM value sends personal data to Analytics, which its terms prohibit and which can force you to delete the property’s data. It happens most often with mail-merge tags that expand a recipient’s address into utm_content. Use an opaque identifier you can join back to a person in your own systems — the page warns when a value looks like an address or a number.
Every tagged URL is a new URL to a search engine
Adding parameters creates a distinct address serving the same page, which can be crawled, indexed and treated as duplicate content. A self-referencing canonical tag resolves it by pointing every tagged variant back at the clean URL. Without one, publicly shared tagged links can compete with the page they point at.
Your visitors can read the parameters
UTM values sit in the address bar in plain sight and travel with the link when somebody shares it. A value naming an internal project, a pricing test, a customer segment or an unannounced client is public the moment the link goes out. Name campaigns as if the recipient will read them, because they can.
Technical details
- Encoding
- Values are percent-encoded with encodeURIComponent semantics — a space becomes %20, never a plus sign, which only means "space" in form encoding
- Existing URLs
- A query string already on the destination is preserved and appended to; a fragment always ends up last, after the query
- Duplicates
- A UTM parameter already present on the pasted URL is never added twice — the existing value is kept and the collision is reported
- Lowercase
- Applies to parameter values only. The base URL path is left exactly as typed, because most servers treat paths as case-sensitive
- Validation
- Non-absolute and malformed destinations, missing required parameters, spaces, uppercase, values resembling an email or phone number, and pre-existing UTM tags
- Batch mode
- One comma-separated campaign per line; blank lines are skipped and a malformed row is reported by line number rather than failing the paste
- Storage
- None. No account, no server, no saved campaign list — anything you build lives in the page until you close the tab, and then it is gone
- Round trip
- Any URL this page builds parses back into the values that produced it, asserted across thirteen fixtures in the test suite
FAQ
Which UTM parameters are actually required?
Source, medium and campaign. GA4 needs the source for a manual campaign to register at all, and without a medium it often files the visit as an ordinary referral. Term and content are optional refinements; the campaign ID only matters if you are joining to imported cost data.
Should spaces be plus signs or %20?
Percent-twenty. A plus only means a space in form encoding, and elsewhere tools disagree about decoding it — which can leave a literal plus in a campaign name. This page always emits %20; the safer answer is hyphens, avoiding the question.
Do UTM parameters hurt SEO?
Only if you ignore the duplicate they create. Each tagged URL is a separate address serving the same page, so a self-referencing canonical tag lets search engines consolidate them. Also avoid tagging links inside your own site — a separate and worse problem.
What are utm_source_platform and the other GA4 parameters?
Three newer parameters GA4 accepts and stores as "Manual source platform", "Manual creative format" and "Manual marketing tactic". They are real, but none of them shows up in the default acquisition reports — you need a free-form Explore report to see them, which is why they sit behind a disclosure here rather than in the main form.
Is my campaign data sent anywhere?
No. The URL is assembled in the page, nothing is uploaded and nothing is saved — no account, no stored campaign list. Close the tab and every link you built is gone, which is deliberate rather than a missing feature.
Can I put a customer’s email in a UTM parameter?
No. It sends personal data to Analytics, which breaches Google’s terms and can cost you the property’s data. It also puts the address in the visitor’s address bar and in any link they forward. Use an opaque ID that you can join back to the person in your own database.