Open your GA4 acquisition report and there is a decent chance you will see “Facebook,” “facebook,” and “FB” sitting on three separate rows. Same channel, three identities, one fractured picture. Multiply that across every source, medium, and campaign your team has ever tagged by hand, and your attribution quietly falls apart — not because the tracking failed, but because nobody agreed on how to spell things. A UTM naming convention fixes this at the root. This guide gives you the five rules that matter, a copy-paste controlled-vocabulary template you can drop into a shared spreadsheet today, and a campaign-naming pattern with a worked example.
Why UTM naming conventions matter
A UTM naming convention matters because UTM values are case-sensitive in Google Analytics 4. “Email” and “email” are stored as two distinct values, so inconsistent capitalization splits one channel into duplicate rows that no longer sum correctly. The same fragmentation happens when one person types utm_source=newsletter and another types utm_source=mailchimp for the identical send. Once the data is fragmented, you cannot cleanly merge it after the fact — reporting becomes a manual reconciliation exercise, and any spend decision built on those numbers is built on sand.
The downstream cost is concrete. GA4 maps your utm_medium value to a default channel grouping using rules it expects to see (for example, cpc and ppc route to Paid Search; email routes to Email). Feed it a free-typed medium like e-mail or paidsocial-fb and GA4 cannot match the rule, so the traffic lands in “Unassigned” or the wrong bucket. A consistent vocabulary is the difference between a channel report you trust and one you spend Monday mornings cleaning. The fix is cheap: decide the spelling once, write it down, and enforce it.
The 5 rules of a clean UTM convention
These five rules cover the failures responsible for almost every fragmented report. They are deliberately strict — a naming convention only works if there is no room for personal interpretation. Apply them to every link you use for campaign tracking, without exception.
1. Use lowercase, always
Because values are case-sensitive, mixed casing is the single most common cause of duplicate rows. Lock every parameter to lowercase — sources, mediums, campaign names, all of it. “Google” and “google” should never both exist in your data. Lowercase is the easiest rule to follow and the easiest to break under deadline pressure, which is exactly why it belongs at the top of the list and why automated enforcement (covered below) pays off.
2. Use hyphens, never spaces or underscores
Spaces in a URL get encoded as %20, so spring sale becomes spring%20sale — unreadable in reports and prone to copy-paste breakage. Use hyphens to separate words: spring-sale. Avoid underscores too; they read poorly and some tools treat them inconsistently. One word-separator across all values keeps your campaign names scannable and your URLs clean.
3. Define a controlled vocabulary (don’t free-type)
This is the rule that separates a real convention from a wish. A controlled vocabulary is a pre-approved list of allowed values for each parameter — a small taxonomy that everyone draws from instead of inventing source and medium names on the fly. If “linkedin” is the approved source, then “LinkedIn,” “li,” and “linked-in” are simply not options. The template below is exactly this list. If you also want a refresher on the role of each tag, see web analytics fundamentals for how utm_source, utm_medium, and utm_campaign feed your reports.
4. Keep values short and descriptive
A good value tells you what the link is without a decoder ring, and does it in as few characters as possible. q2-webinar-signup beats both w (too cryptic) and q2-2nd-quarter-product-webinar-registration-page-final (too long to scan in a report column). Aim for human-readable but compact. Consistency in length and structure also makes the data easier to filter and group later.
5. Never UTM-tag internal links
UTM parameters are for traffic arriving from outside your site. Tagging internal links — a button from your homepage to a landing page, say — restarts the session and overwrites the original acquisition source. A visitor who came from google / organic suddenly looks like homepage / banner, and your real source data is destroyed. Use internal-link tracking or events for on-site navigation; reserve UTMs strictly for inbound campaign tracking.
A controlled-vocabulary template you can copy
This is the artifact most “best practices” posts skip. Below is a starter taxonomy: approved utm_source values, approved utm_medium values mapped to their GA4 channel group, and a campaign-naming pattern. Paste it into a shared spreadsheet, trim it to your channels, and treat it as the only place new values get added.
| Approved utm_medium | Use for | GA4 channel group |
|---|---|---|
cpc | Paid search (Google Ads, Microsoft Ads) | Paid Search |
display | Banner / programmatic display ads | Display |
paid-social | Paid placements on social platforms | Paid Social |
social | Organic social posts | Organic Social |
email | Newsletters and email campaigns | |
affiliate | Affiliate and partner links | Affiliates |
referral | Sponsorships, listings, partner sites | Referral |
| Approved utm_source | Platform |
|---|---|
google | Google (ads or organic posts) |
facebook | Facebook / Meta |
instagram | |
linkedin | |
x | X (formerly Twitter) |
newsletter | Your email newsletter |
partner-site | Named partner or sponsor domain |
A campaign-naming pattern with a worked example
For utm_campaign, a fixed pattern beats free text. A simple, durable structure is {period}-{product}-{offer}: a time marker, what you are promoting, and the hook. Worked example — a Q2 promotion for an analytics suite running 20% off would be:
utm_source=newsletter utm_medium=email utm_campaign=q2-analytics-20off
Every link in that campaign — email, paid social, display — shares the identical utm_campaign value and varies only source and medium. That is how you roll one campaign report up across channels instead of chasing fragments. Note the use of q2 as a relative period marker rather than a hard date; more on dates in the FAQ.
Governance: keep it a single source of truth
Rules written once and forgotten drift within a quarter. The convention needs a home and an owner. Keep the controlled vocabulary in one shared spreadsheet that is the single source of truth — not a screenshot in an old deck, not tribal knowledge. Assign one person (usually analytics or marketing ops) to own it: they approve new source and medium values, retire dead ones, and answer “what do I use for X?” so nobody free-types under pressure.
- One sheet, one owner. New values are requested, not invented. The owner adds the approved spelling.
- Periodic validation. Once a month, pull a list of distinct UTM values from GA4 and compare against the approved list. Anything off-list is a leak to fix — and a coaching moment.
- Onboard new people to it. The convention is part of campaign setup, not an afterthought. Link the sheet in your campaign brief template.
Validation is where consistency is actually maintained. Without a recurring audit, even a good convention erodes as new hires and rushed launches introduce off-list values that quietly recreate the duplicate, fragmented data problem you set out to solve.
Common UTM naming mistakes (and the fix)
| Mistake | Why it breaks your data | Correct form |
|---|---|---|
Facebook vs facebook | Case-sensitive values split one source into duplicate rows | facebook |
utm_campaign=spring sale | Space becomes %20, breaking readability and grouping | spring-sale |
Free-typed source (fb, FB, meta) | No controlled vocabulary means endless variants of one channel | One approved value: facebook |
| Tagging an internal homepage button | Overwrites the real acquisition source and inflates self-referrals | No UTM on internal links |
Medium e-mail or paidsocial | Doesn’t match GA4 channel grouping rules → Unassigned | email / paid-social |
Enforce your convention automatically
A convention is only as good as compliance, and humans typing parameters by hand will always drift. The reliable fix is to remove hand-typing entirely: encode the approved vocabulary into a tagging tool so every link is generated to spec — lowercase, hyphenated, on-taxonomy. Build your links with the UTM Builder instead of editing query strings manually.
Frequently asked questions
Should utm_campaign include dates?
Use relative period markers (q2, fy26-h1) rather than hard dates inside the value when the campaign is recurring or spans a window. Hard dates make rolling reports awkward and clutter the value. If a precise launch date genuinely matters for one-off sends, keep it short and ISO-style (2026-04) at the end, after product and offer.
Are UTM values case-sensitive?
Yes. In GA4, Email and email are stored as separate values and report on separate rows. This case sensitivity is the most common cause of fragmented campaign data, which is why the first rule of any convention is to force everything to lowercase.
Underscores or hyphens in UTM values?
Hyphens. They read cleanly in URLs and reports, and you avoid the inconsistent handling some tools apply to underscores. Whichever you choose, pick one separator and apply it everywhere — mixing spring-sale and spring_sale fragments the same campaign. Spaces are never acceptable because they encode to %20.
How do I roll a convention out across a team?
Publish the controlled vocabulary in one shared spreadsheet, name an owner, and make it part of campaign setup rather than an optional reference. Then remove the temptation to free-type: have everyone build standardized campaign links from the approved lists. Audit distinct UTM values monthly and correct any off-list entries early, before they spread.
The next step
Clean campaign data is not a tooling problem — it is an agreement problem. A UTM naming convention is that agreement, written down. Decide your controlled vocabulary, write it into one spreadsheet, give it an owner, and audit it monthly. Then make compliance the default by generating every link to spec. Copy the template above, adapt it to your channels, and start tagging with the UTM Builder so the convention enforces itself.