How to build a UTM naming convention that survives GA4
Inconsistent UTM tags split one campaign across five rows in GA4. Here is the naming convention that keeps every link reporting into the same place.
A UTM naming convention is a written set of rules for how everyone on your team fills in utm_source, utm_medium, and utm_campaign, so every link reports into the same row. Without one, the same Facebook post shows up as facebook, Facebook, and FB, and GA4 counts them as three sources. The fix costs an afternoon and saves you from arguing with your own numbers every month.
GA4 is case-sensitive and has no normalization layer. It doesn't lowercase your tags before storing them, and it won't merge rows that differ only by case. So utm_source=Google and utm_source=google sit in two separate rows forever. Multiply that by every channel and every person who builds a link by hand, and your acquisition report turns into confetti.
Start with utm_medium, because it decides your channel
GA4 reads utm_medium first, and the value you pass decides which default channel the session lands in. Get it wrong and the traffic falls into Unassigned, the bucket nobody looks at. Lock these values and use nothing else:
- Paid search:
cpc. GA4 also acceptsppcandpaidsearch, so pick one and stop there. - Email:
email. Don't writenewsletter. That single word is the most common reason email traffic lands in Unassigned. - Organic social:
social. - Paid social:
paid-social. The medium has to contain the word paid for GA4 to route it to the Paid Social channel. - Display:
displayorbanner. - Affiliate:
affiliate.
Anything outside that list needs a custom channel rule or it goes to Unassigned. Keep the list short and treat it as closed.
Force everything to lowercase, with hyphens
Case is where most conventions break. Since GA4 splits LinkedIn from linkedin, the rule is one line: every UTM value is lowercase, always. Use hyphens for spaces, never underscores or blanks, so paid-social and black-friday each stay one clean token.
Google's own Campaign URL Builder lowercases as you type, which is a cheap way to stop the problem at the source. If your team builds links in a spreadsheet instead, add a LOWER() column and copy the tag from that, not from the raw cell.
Give every source one spelling
Write down the exact string for each source and let nobody improvise. LinkedIn is linkedin. Your email tool is mailchimp or klaviyo, whichever you actually send from. A partner site is its bare domain, like producthunt. One name per source, chosen once.
Source answers where the click came from. Medium answers what type of traffic it is. Keep them apart. utm_source=newsletter with utm_medium=email is right; utm_source=email wastes a slot, because the medium already said that.
Structure the campaign name in a fixed order
The campaign field is where teams get creative and reports get unreadable. Pin a format and hold to it. A pattern that works: quarter-theme-asset, for example 2026q3-pricing-launch-webinar. Read left to right, it sorts and filters cleanly in GA4.
Two more fields exist for when you need them. utm_content separates two links in the same email, or two creatives in the same ad campaign. utm_term holds the keyword on paid search. GA4 also reads utm_id, which maps to a campaign ID if you run one. Skip the ones you don't need. Empty is better than guessed.
Put the convention in one document and check links before launch
A convention only works if it lives somewhere every marketer can see it. One shared doc: the medium list, the source spellings, the campaign format, and three worked examples. Link it inside your campaign brief so it sits in front of people while they build.
Then add one habit. Before any campaign goes live, paste its links into a scratch tab and read the UTMs out loud. Wrong medium, stray capital, underscore where a hyphen should be: you catch all three in ten seconds, before the data is dirty. Cleaning UTMs after the fact is close to impossible, since GA4 stores what it received and never rewrites history.
This is the same discipline behind analytics you'll actually use to make decisions: the report is only as trustworthy as the tags feeding it. It matters more now that AI referral traffic is its own channel, because a clean convention is what lets you see ChatGPT and Perplexity as distinct sources instead of a pile of Unassigned.
If you want help turning this into a tagging system your whole team actually follows, that's the kind of measurement plumbing we set up.