Campaign Tracking

A UTM Taxonomy That Survives an Agency Handover

Published 

A campaign dashboard showing click-through rate and cost-per-conversion tiles

Open the Traffic Acquisition report on any account older than eighteen months and look at the source/medium list. You will find email, Email, e-mail, newsletter, and EMAIL — five rows in the report, one channel in reality. Somewhere in there is (not set) and a healthy block of Unassigned traffic.

Nobody did this on purpose. It happens because UTM parameters are free text typed by whoever built the link, and the number of people who build links grows over time. An in-house marketer, two agencies, a partner running co-marketing, and a designer who built one email in a hurry.

The fix is not a better spreadsheet. It is a taxonomy short enough that people can remember it, plus a mechanism that makes the correct thing easier than the incorrect thing.

The five parameters and what each is for

utm_source — where the traffic came from. A specific platform or publication: google, facebook, linkedin, newsletter, partner-acme. Not a channel type.

utm_medium — the marketing channel. This is the most important parameter because GA4's default channel grouping keys off it. Use the values GA4 already recognises: cpc, email, social, organic, referral, affiliate, display. Invent one and your traffic lands in Unassigned.

utm_campaign — the campaign. This is where your structure lives, so it is where a convention pays off most.

utm_content — which creative or placement. Distinguishes variants of the same campaign: hero-cta, footer-link, variant-b.

utm_term — the paid keyword. Largely vestigial now that auto-tagging handles Google Ads.

The rules

Six rules. Short enough to fit on a page someone will actually read.

1. Everything lowercase, always. GA4 is case-sensitive and does not normalise. Facebook and facebook are two sources in every report, permanently. This single rule prevents more mess than the other five combined.

2. Hyphens, never spaces or underscores. A space becomes %20 and looks broken. Underscores are harder to read at a glance. Pick hyphens and never deviate.

3. utm_medium comes from a fixed list. Publish the list. cpc, email, social, paid-social, display, affiliate, referral, partner. Nothing else, ever, without a decision to add it to the list and to the GA4 channel group.

4. utm_campaign follows one pattern. Something like yyyy-qn-name:

12026-q1-spring-sale
22026-q1-brand-always-on
32026-q2-product-launch-northbound

Date prefix first, so campaigns sort chronologically in reports and last year's spring sale does not sit next to this year's. Any consistent pattern works; consistency is the whole value.

5. Never tag internal links. A UTM on a link between two pages of your own site starts a new session and overwrites the original acquisition source. The user who arrived from a paid ad and clicked an internally-tagged banner is now attributed to that banner. This is a genuinely destructive mistake and it is common — internal campaign tracking should use a different mechanism entirely.

6. Never manually tag Google Ads traffic. Auto-tagging adds gclid, which carries far more than UTMs can. Adding manual UTMs on top can override it depending on your settings, and you lose the Ads integration data. Leave auto-tagging on and leave the links alone.

UTM values are permanent. Once Email is in your data, it is in your data. GA4 has no retroactive rewrite. You can create a custom channel group to fold variants together going forward and for historical reporting in some surfaces, but the underlying source/medium values never change. This is why the convention has to exist before the campaigns, not after.

Why it breaks

Nobody disagrees with the rules. Implementations fail for structural reasons.

The spreadsheet is not where the links are built. There is a documented convention in a shared drive and a marketer building a link at 5pm on a Friday. The convention loses. Any process that relies on someone opening a second document to build a link will decay.

Agencies have their own conventions. They are not being difficult — they have a taxonomy that works across their whole client base and yours is one of thirty. Unless your convention is in the contract and in the onboarding, theirs wins.

Nobody owns it. "Marketing owns it" means nobody owns it. One named person needs to own the medium list and approve additions.

Nothing checks. The mistake is invisible until someone opens a report weeks later and finds Email and email as separate rows.

Making the right thing easier than the wrong thing

The only reliable enforcement is to remove the opportunity for error.

Templates per channel. A marketer building an email link should not be choosing a medium. The template has utm_medium=email fixed and asks only for the campaign name. Fewer free-text fields, fewer inconsistencies.

Fixed dropdowns for source and medium. If the medium is picked from a list, it cannot be typed wrong.

Automatic lowercase and hyphenation. Do it at build time so it does not depend on anyone remembering.

A shared link history. The single highest-value feature, and the one most people lack. When someone can see the last ten links built for this client, they copy the pattern. A shared history is a living convention document that people actually consult, because it is where they already are.

Bulk generation. A launch with forty links across six channels built one at a time will contain errors. Built from one template in one operation, it will not.

Cleaning up what already exists

Audit what you have. Export twelve months of source/medium from GA4 and sort by sessions. The mess is usually concentrated — a handful of high-volume variants account for most of the confusion, and a long tail of one-off typos that do not matter.

Build a custom channel group. In Admin → Data display → Channel groups, create rules that fold the variants together: any medium matching email|e-mail|newsletter maps to Email. This does not change the stored data, but it makes reports usable, and in most GA4 surfaces you can apply it retroactively.

Fix the live links. Anything still in market — email footers, partner placements, social bios, QR codes on print — is still generating bad data every day. Prioritise by ongoing volume, not by how wrong it is.

Then publish the convention and the tooling together. Publishing rules without a mechanism produces the same drift again in eighteen months.

The handover clause

If agencies build links for you, put the taxonomy in the engagement, not in a follow-up email:

  • The medium list, verbatim, with a note that additions require your approval.
  • The campaign naming pattern with two worked examples.
  • The lowercase and hyphen rules.
  • Where links must be built (your tool, so they land in your history).
  • A named owner on your side who approves new mediums.

That last one is what makes the rest hold. Without a named owner, the first campaign that does not fit the pattern sets a precedent, and precedents compound.

While you are documenting the handover, the same logic applies to platform access — an agency that finishes an engagement and keeps Editor on your GA4 property is the other half of this problem. Running an access audit covers that side.

How Tagfire helps

UTM Builder exists to make the correct link the easy one:

  • Templates per channel — Google, Facebook, LinkedIn, email, and your own — so source and medium are fixed and the marketer only fills in what actually varies.
  • Bulk generation for launches, so forty links come out of one template rather than forty separate attempts.
  • Saved link history, shared across your workspace, so the last ten links for this client are visible while someone builds the eleventh. This is the enforcement mechanism that works, because it is passive.
  • QR codes generated from the tagged URL, so print and offline placements carry proper attribution instead of arriving as Direct.

Because it is workspace-aware, an agency working in your Tagfire workspace builds links into your history against your templates. The convention travels with the account rather than with whoever happens to be running the campaign.

On the diagnosis side, the GA4 Audit includes a traffic-sources pass that flags exactly the symptoms this article opens with — case-variant mediums, Unassigned traffic, and auto-tagging conflicts with manual UTMs.

The UTM Builder documentation covers templates, bulk generation, and link history.

Related reading
Hand-drawn wireframes of three page layouts sketched side by side
GA4

The 2026 GA4 + GTM Setup Checklist

A complete technical checklist for Google Analytics 4 and Google Tag Manager — collection, configuration, consent, campaign tracking, and governance. Verify each item before you trust a single report.

Read article
An analytics dashboard of charts and trend lines filling a laptop screen
GA4

How to Audit a GA4 Property in 10 Minutes

A repeatable GA4 audit process: what to check, in what order, and how to tell a real problem from a cosmetic one. Includes the six findings that appear in almost every account.

Read article
Two colleagues working at laptops, seen through a glass office partition
Analytics Governance

Who Has Access to Your GA4 and GTM?

How to audit user access across Google Analytics 4 properties and Google Tag Manager containers — the roles that matter, what an access review should produce, and how to keep it current.

Read article