The short version
- Without UTM tags, GA4 files most campaign traffic as direct or referral — it is not lost, it is just unattributable.
- Three parameters do the real work:
utm_source,utm_mediumandutm_campaign. The other two are for paid keywords and A/B variants. - The expensive mistake is not missing tags. It is inconsistent ones —
Facebook,facebookandFBare three different sources. - Never put UTM tags on links between your own pages. It restarts the session and overwrites the original source.
- Build a tagged link free — encoded correctly, with a QR code for anything going into print.
Why it matters: the “direct traffic” problem
Open Google Analytics, go to traffic acquisition, and look at how much of your traffic is filed under Direct. On most sites it is the largest single row, and on some it is close to half. Direct is supposed to mean somebody typed your address into the address bar. Almost nobody does that. What it actually means is that GA4 received a visit with no information about where it came from, and had nowhere else to put it.
That happens constantly. A link in a newsletter opened in a desktop mail client sends no referrer. A link tapped inside the Instagram app arrives through an in-app browser that strips it. A link in a PDF, a WhatsApp forward, a QR code on a poster, a shortened URL in a bio — all of them land as direct. So the channel you spent a week on shows up in your reports as an anonymous blob, and the honest answer to “did the newsletter work?” becomes “something worked”.
UTM parameters solve this by carrying the answer in the URL itself. Instead of hoping the browser volunteers where a visitor came from, you tell Analytics directly, in the link. It is the only mechanism GA4 has for attributing a visit to a specific campaign you ran.
An untagged campaign is not measured badly. It is not measured at all — it is just added to a pile marked “direct” and forgotten.
What each of the five parameters does
There are five, and they are not equally important. Three carry the weight; two are specialist.
utm_source — the specific place
The individual site, publication or list the click came from: google,
newsletter, linkedin, partner-blog. This is the one
parameter GA4 genuinely needs. If you only ever set one, set this.
utm_medium — the kind of channel
Not the individual site, the category: email, cpc,
organic_social, referral, affiliate. GA4 uses this
to sort traffic into its default channel groups, which is why an invented value matters
more than it looks — a medium of emailer or fb-ad does not
match any grouping rule, so the traffic lands in “Unassigned” and quietly
disappears from every channel report you build.
utm_campaign — the thing you are running
The campaign these links belong to: spring-launch-2026,
black-friday, webinar-may. Every link in one campaign must carry
the identical value. One typo and your reporting splits into two rows that each look
half as successful as the campaign really was.
utm_term — the paid keyword
Mostly relevant to search advertising, and Google Ads fills it in automatically when auto-tagging is on. For most people running social and email, this stays empty.
utm_content — which version
The parameter people skip and then wish they had used. It separates two links that are
otherwise identical: the hero button versus the sign-off link in the same email,
variant-a versus variant-b, image-1 versus
image-2. Without it you know the email worked. With it you know
which part of the email worked, which is the thing you can act on next month.
Free tool · Nothing leaves your browser
Build the link properly instead of typing it by hand
Source, medium and campaign, encoded correctly, lower-cased by default, with a QR code for anything going into print. No signup, and the URL is assembled in your browser.
A naming convention that survives a team
Here is the failure that costs more than missing tags altogether. GA4 treats parameter
values as literal strings, and it is case-sensitive. So Facebook,
facebook and FB are three separate sources. One campaign run by
three people over two months turns into six rows, none of which shows the real number,
and the whole thing gets written off as “analytics being unreliable”.
The fix is a convention written down somewhere both of you can see it. Four rules cover almost everything:
- Lower case, always. There is no situation where capitalisation earns you anything, and every situation where it costs you a split row.
- Hyphens, never spaces. A space becomes
%20if you are lucky and truncates the URL if you are not. - Mediums come from a fixed list. Agree on
email,cpc,organic_social,referral,affiliate,qrand stop inventing new ones. - Campaign names include the period.
webinar-2026-05is findable in a year.webinaris not.
The builder on this site lower-cases source and medium by default for exactly this reason. It is a small thing that removes the single most common cause of broken campaign reporting.
Five places worth tagging first
1. Your email newsletter
source=newsletter, medium=email,
campaign=march-update, and — this is the valuable part —
content=hero-cta on the top button and content=signoff on the
link at the bottom. Two months of that tells you where in an email people actually click,
which changes how you write the next one.
2. The link in your Instagram or LinkedIn bio
source=instagram, medium=organic_social,
campaign=bio-link. Social apps route clicks through an in-app browser that
strips the referrer, so untagged bio traffic is invisible — it becomes part of that
direct pile. This is the single highest-value tag most people are missing.
3. Printed material and QR codes
source=flyer, medium=qr, campaign=store-opening.
Generate the QR code from the tagged URL and an offline channel becomes as
measurable as a paid ad. Different code per venue, per print run, per event, and you
finally know which one was worth repeating.
4. Meta Ads and other paid social
source=facebook, medium=cpc, campaign matching your ad set name.
Meta can populate these dynamically with URL parameters, which is worth setting up: it
removes the naming drift that comes from a human typing the campaign name into forty ads.
5. Guest posts, podcasts and partner links
source= the publication, medium=referral,
campaign=guest-posts-2026. Referrer data mostly works here, but it collapses
the moment somebody copies your link into a newsletter or a Slack channel — and the
tag keeps working when it does.
Use these together
- Canonical Tag Generator — Generate a correct canonical link tag and learn when a page needs one.
- Conversion Rate Calculator — Calculate your conversion rate and see how many more conversions each target rate would need.
- Marketing ROI Calculator — Work out cost per lead, cost per acquisition, ROI and ROAS — with every formula shown.
- The full set of twelve — free, no signup, and for nine of them nothing you type leaves your browser.
Why use this builder rather than another
There are plenty of UTM builders. Most of them are fine. Three things make this one worth bookmarking instead.
Nothing you type leaves your browser. The URL is assembled in JavaScript on your machine. Campaign names leak product launches, client names and pricing tests before they are public, and there is no reason for any of that to be posted to a server you do not control. No account, no email gate, no logging.
It is opinionated where it should be. Source and medium are lower-cased by default, spaces and ampersands and accented characters are percent-encoded for you, and an existing query string on your landing page is preserved rather than clobbered. Those are the three things that break hand-built links.
The QR code is real. It is generated in your browser by a dependency-free encoder written for this site — Reed-Solomon error correction, mask selection and all — and it comes out as an SVG, so it stays sharp on a banner as easily as on a business card. No image API, so the URL is never sent to a third party just to draw a square.
One rule worth tattooing somewhere
Never put UTM parameters on a link between two of your own pages. GA4 reads the tag, decides a new campaign has started, ends the current session and re-attributes the visitor — so somebody who found you through Google gets recorded as arriving from your own newsletter. Only tag links that arrive from outside your site.
What to do this week
- Open GA4 and look at your direct traffic percentage. Write the number down. That is your baseline.
- Tag your bio link. Ten seconds of work, and it usually moves that number more than anything else on this list.
- Tag the next email you send — including
utm_contenton at least two links, so you learn something rather than just measuring something. - Write the convention down in whatever document your team actually opens. Lower case, hyphens, a fixed list of mediums.
- Check back in a month. Direct should be smaller and your channel report should have rows you recognise.
One caveat, because it is the thing that makes people give up: clean tags only pay off if the conversions on the other end are being counted. If GA4 is not recording form submissions or WhatsApp clicks as events, perfect attribution just tells you which channel sent traffic you cannot value. That side of the job is covered in the guide on tracking, and once both halves are in place the ROI calculator turns the result into a number your accountant recognises.
FAQ
Which UTM parameters are actually required?
utm_source is the minimum GA4 needs. In practice you want
utm_medium and utm_campaign as well, because those three
answer “where from, what kind of channel, which campaign”.
utm_term and utm_content are optional extras for paid
keywords and A/B variants.
Why is so much of my traffic showing as direct?
Because the visit arrived with no referrer and no campaign tag. Email clients, in-app browsers on Instagram and LinkedIn, PDFs, QR codes, messaging apps and some privacy-focused browsers all strip referrer information. The traffic is real; GA4 just has nothing to attribute it to. Tagging the links you control is the only fix.
Do UTM parameters hurt SEO?
Not if the page carries a self-referencing canonical tag, which it should anyway. The
canonical tells Google that /page/?utm_source=x and /page/
are the same page, so ranking signals stay pooled on one URL rather than splitting
across every variant somebody shares. You can generate one with the
canonical tag generator.
Should I use a URL shortener with UTM links?
You can — the parameters survive the redirect, so GA4 still reads them. It is worth doing for anything printed or spoken aloud. Just be aware that you are now depending on the shortener staying alive, and that some services strip query strings on their free tier, which silently removes your tags. Test one link before you print five thousand.
Is anything I type stored or uploaded?
No. The link and the QR code are both built in JavaScript in your browser. Nothing is sent to a server, logged or retained — which matters more than it sounds, because campaign names routinely give away launches and client work before they are public.