A UTM Naming Convention That Keeps GA4 Clean

A UTM naming convention is a written, enforced rule for how each of the five UTM parameters is formatted — always lowercase, a single separator, a fixed list of allowed utm_source values, and a fixed list of allowed utm_medium values. Without that rule, GA4 reports fragment: Email, email, and e-mail become three separate sources for one channel, and credit splits across rows that should have been one. The convention's whole job is to make every link tag collapse into the right bucket on the first try.

This matters because GA4's link tags are case-sensitive and value-literal. GA4 reads utm_medium to decide a session's default channel groupcpc lands in Paid Search, email in Email — and if a value doesn't match a rule, the traffic falls into Unassigned. A naming convention is the only thing standing between a clean Acquisition report and a pile of near-duplicate sources.

The taxonomy: a copy-paste starting point

A convention has three moving parts: an allowed source list, an allowed medium list, and a campaign-naming pattern. The medium list is the one to get exactly right, because GA4 matches it against fixed channel-grouping rules. Use GA4-recognized spellings here, not stylistic variants.

| Parameter | Rule | Allowed values (examples) | | --- | --- | --- | | utm_source | The exact origin. Lowercase, hyphenated. Keep a closed list. | google, meta, linkedin, tiktok, x, bing, plus named owned sources like weekly-newsletter, partner-acme | | utm_medium | The marketing channel. Must match GA4's channel rules. | cpc, paid_social, display, email, affiliate, referral, organic_social, sms, push, video | | utm_campaign | The initiative. Pattern: {yyyy}-{theme}-{geo}. | 2026-q2-launch-us, 2026-spring-sale-eu | | utm_content | Which creative or variant. | hero-banner, carousel-a, footer-cta | | utm_term | Paid-search keyword only. | vibe+coding+analytics |

Two notes on the medium list. GA4's default channel grouping recognizes cpc, display, affiliate, and email directly, and it groups paid social when the medium is one of social, social-network, social-media, sm, or social paid against a paid pattern (GA4 default channels reference). The underscore styling above is the most common house convention and reads cleanly in reports, but verify against your own property's channel grouping — if organic_social shows up as Unassigned in your Traffic acquisition report, switch that medium to a value GA4's rule actually matches. The goal is reports, not aesthetics.

The rules that keep values from drifting

A taxonomy is only as good as the discipline around it. Five rules do most of the work:

  • Lowercase, always. GA4 treats Email and email as two different mediums. One stray capital splits a channel in two. Normalize everything to lowercase before the link ships.
  • One separator org-wide. Pick the hyphen or the underscore for multi-word values and never mix them. paid-social and paid_social are different strings to GA4. Whichever you choose, document it and hold the line.
  • Two to four words per value. Long enough to be unambiguous, short enough to scan. 2026-q2-launch-us reads; spring_2026_big_product_launch_campaign_final_v2 does not.
  • Never reuse a value for two meanings. If partner means an affiliate this quarter and a co-marketing deal next quarter, your reports lie. One value, one meaning, forever.
  • Review monthly for drift. Pull the list of distinct sources and mediums GA4 actually received and compare it to the approved taxonomy. New rows that aren't on the list are typos or rogue links — fix them at the source.

Governance: stop humans free-typing values

The fastest way to break a convention is to let people type UTM values by hand into Google's Campaign URL Builder one at a time. The builder is a fine tool, but it does not enforce your list — it will happily accept Facebook, FB, and meta for the same source on three different days from three different people.

Governance means two things. First, the taxonomy lives in a single document that everyone references and that one owner maintains. Second, a shared builder sits between marketers and the link: it normalizes input (trim, lowercase), validates each value against the approved list, and logs every link it produces. That log is what makes the monthly drift review fast — you compare links you issued against sources GA4 received, and the difference is your error rate.

How VibeTraker's Campaign-Link Builder enforces this

VibeTraker ships a Campaign-Link Builder built around exactly this discipline. It carries a canonical medium list — cpc, paid_social, display, email, affiliate, referral, organic_social, sms, push, video — so every link starts from a known set. As you type a source or campaign, datalist autocomplete surfaces your past values, so the second link reuses the spelling of the first instead of inventing a new one. A drift warning compares new input against existing values using edit distance (Levenshtein) and flags near-duplicates — linkedin versus linkedln, meta versus meata — before they reach GA4.

Under the hood, every value runs through one shared normalization helper that trims and lowercases. The same helper powers VibeTraker's GA4 read-back and its owned-event source extraction, so a tag and an in-app event for the same source collapse to one bucket instead of two — the normalized-metrics layer is where that consolidation happens. The canonical medium list is VibeTraker's internal normalization; for GA4's own channel grouping, pair it with the GA4-recognized spellings above and confirm the result in your property's reports.

A worked example

A spring promotion runs across a paid LinkedIn ad and the weekly newsletter. Two links, one convention:

https://app.example.com/?utm_source=linkedin&utm_medium=paid_social&utm_campaign=2026-spring-sale-eu&utm_content=carousel-a

https://app.example.com/?utm_source=weekly-newsletter&utm_medium=email&utm_campaign=2026-spring-sale-eu&utm_content=footer-cta

Both share one utm_campaign, so GA4 rolls them into a single campaign row while still splitting the LinkedIn paid traffic from the email traffic by medium. For the deeper mechanics of constructing tags, see how to build UTM links for GA4; for what happens when a value doesn't match a channel rule, see why GA4 traffic shows as Unassigned.

A convention is not a one-time setup. The list grows as channels do, and the monthly review is where you catch the Email that slipped through. The teams whose GA4 reports stay readable are the ones who treat the taxonomy as a living document and refuse to let anyone free-type a value into a link.

FAQ

Frequently asked questions

Why does GA4 split one channel into multiple sources?

GA4 treats UTM values as case-sensitive, literal strings, so 'Email', 'email', and 'e-mail' register as three different sources for one channel. A naming convention that forces lowercase and a fixed value list keeps them collapsed into one bucket.

What utm_medium values should I use for GA4?

Use values GA4's default channel grouping recognizes: cpc for paid search, email, display, and affiliate map directly, and paid social groups on values like 'social' or 'paid-social' that match GA4's social rule. Stylistic variants that no rule matches land in Unassigned.

What is a good utm_campaign naming pattern?

A lowercase, hyphenated pattern such as {yyyy}-{theme}-{geo} (for example 2026-spring-sale-eu) keeps campaigns sortable and unambiguous. Two to four words is enough to be unique without becoming unreadable.

How do you stop UTM values from drifting over time?

Keep the taxonomy as a living document with one owner, route every link through a shared builder that normalizes and validates against the approved list, and run a monthly review comparing the sources GA4 received against the values you issued.