UTM Parameters Explained: Tag Links So GA4 Tells the Truth
Campaign Tracking

UTM Parameters: How to Tag Links So Analytics Tells You the Truth

Half your traffic is probably filed under “direct” in Google Analytics, which is analytics-speak for “no idea”. Untagged links are why. Here is what each UTM parameter does, the naming convention that stops one campaign splitting into three rows, and the five places worth tagging first.

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_medium and utm_campaign. The other two are for paid keywords and A/B variants.
  • The expensive mistake is not missing tags. It is inconsistent ones — Facebook, facebook and FB are 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:

  1. Lower case, always. There is no situation where capitalisation earns you anything, and every situation where it costs you a split row.
  2. Hyphens, never spaces. A space becomes %20 if you are lucky and truncates the URL if you are not.
  3. Mediums come from a fixed list. Agree on email, cpc, organic_social, referral, affiliate, qr and stop inventing new ones.
  4. Campaign names include the period. webinar-2026-05 is findable in a year. webinar is 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

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

  1. Open GA4 and look at your direct traffic percentage. Write the number down. That is your baseline.
  2. Tag your bio link. Ten seconds of work, and it usually moves that number more than anything else on this list.
  3. Tag the next email you send — including utm_content on at least two links, so you learn something rather than just measuring something.
  4. Write the convention down in whatever document your team actually opens. Lower case, hyphens, a fixed list of mediums.
  5. 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.

Thejas Acharya — Digital Growth Consultant, Bangalore

Written by

Thejas Acharya

Digital growth consultant based in Bangalore, working with founders and marketing teams across India and the US. I build websites, landing pages, Meta Ads campaigns and AI automation that are judged on one thing: whether they generate leads. The free tools on this site are the checks I run on client work, opened up.

Free · No signup · No data stored

Tag your next campaign link in about twenty seconds.

Fill in three fields and copy a link that Google Analytics can actually attribute. Everything is built in your browser — nothing you type is uploaded, logged or stored.

Correct percent-encoding Lower-case enforcement Live preview as you type SVG QR code for print

Free · No obligation · India & US clients · I reply to every email within 24 hours