A UTM naming convention that survives a whole agency
Inconsistent UTMs are why GA4 splits 'Facebook / facebook / FB' into three lines and dumps traffic into Unassigned. The naming convention, the recognized medium values, and how to enforce it across a team.
TL;DR
UTMs break reporting in two ways, both fixable with a convention: inconsistency (Facebook vs facebook vs FB become three separate rows because GA4 is case-sensitive) and non-standard mediums (a utm_medium GA4 doesn't recognize dumps the traffic into Unassigned). The fix is a one-page standard everyone follows: lowercase everything, use GA4's recognized medium values, pick source names from a fixed list, follow one campaign-name pattern, no spaces, never hand-type. Enforce it with a shared builder and a periodic UTM audit. Below: the rules, the recognized values, a template, and how to make a team actually stick to it.
Open any agency's GA4 that's had more than one person tagging links and you'll see it: email and Email and e-mail as three channels, facebook and fb and Facebook splitting one source into three, and a fat Unassigned bucket where the bespoke mediums went to die. None of it is a GA4 bug — it's the absence of a UTM convention, and it quietly makes every channel report wrong. The fix costs one page and a little enforcement.
The two failure modes a convention prevents
- Case + spelling fragmentation. GA4 treats
source/medium/campaignas case-sensitive, exact strings.Newsletter≠newsletter≠news. Each variant is a separate row, so your "email" performance is scattered across three lines and never adds up. - Unrecognized mediums → Unassigned. GA4's default channel grouping keys almost entirely off
utm_medium, and it expects specific values. A creativemedium=blastormedium=fbmatches no channel rule and the session falls into Unassigned — invisible.
A convention kills both: one spelling, one case, recognized values.
The rules (the whole standard)
- Lowercase everything. Always. No exceptions. (This single rule prevents most fragmentation.)
- No spaces. Use hyphens:
spring-sale, notSpring Sale. utm_mediummust be a GA4-recognized value (see the table). This is non-negotiable — it's what keeps traffic out of Unassigned.utm_sourcecomes from a fixed list. Decide the canonical name for each platform once (facebook, notfb/meta/facebook.com) and never deviate.utm_campaignfollows one pattern. Pick a structure and reuse it, e.g.yyyy-mm_offer→2026-06_summer-sale. Consistency beats cleverness.utm_term/utm_contentfor keyword and creative/variant — optional, but same lowercase/no-space rules.- Never tag internal links. UTM-ing a link within your own site restarts the session and overwrites the real source — a self-inflicted attribution wipe.
The utm_medium values GA4 actually recognizes
Use these so traffic files into a named channel instead of Unassigned:
| Channel you want | Use utm_medium = |
|---|---|
| Paid Search | cpc, ppc, or paidsearch |
| Paid Social | paid-social (or social with a paid source) |
| Organic Social | social, social-network, social-media |
email (exactly — not newsletter/e-mail) | |
| Display | display, banner, cpm |
| Affiliate | affiliate |
| Referral | referral |
Anything genuinely bespoke (a QR code, an offline campaign) either maps to one of these or needs a custom channel group defined in GA4 — otherwise it's Unassigned by design.
A template
Standardize one row per channel and hand it to everyone:
| Channel | source | medium | campaign pattern |
|---|---|---|---|
| Google Ads | google | cpc | 2026-06_brand-search |
| Meta paid | facebook | paid-social | 2026-06_retargeting |
| LinkedIn paid | linkedin | paid-social | 2026-06_abm-q3 |
| Email newsletter | mailchimp | email | 2026-06_monthly |
| Partner/referral | partnername | referral | 2026_partner-co |
How to make a team actually follow it
A convention nobody enforces is a document, not a standard. Three moves:
- One shared builder. A locked Google Sheet or a UTM-builder tool that constructs the URL from dropdowns — so nobody hand-types a medium. Hand-typing is where every inconsistency is born.
- One source of truth per client. The canonical source/medium/campaign values live somewhere attached to the client, not in five people's memories.
- Audit on a cadence. Run a UTM audit on the property periodically to catch the non-standard mediums and case variants that crept in — they always do — before they pollute a quarter of reporting.
Where this fits
UTM hygiene is the cheap half of clean attribution (the other half is the conversion tracking itself). It's also exactly the kind of standard that's invisible until it's broken and a client asks why half their traffic is "Unassigned" or "Direct." Bake it into the measurement plan you build per client, and keep the canonical values where the rest of the client's tracking lives.
That's what Phloz is for: each client's tracking — UTMs, channels, pixels, conversions — modeled and health-checked as part of the tracking-infrastructure map, so "are this client's UTMs consistent, or are they leaking into Unassigned?" is a thing you can see across the book. The CRM for PPC agencies and pricing pages cover the workflow — but the convention above costs one page; write it down, share the builder, and stop hand-typing UTMs.