A Practical UTM Naming Convention for Small Teams (and How GA4 Reads It)
UTM parameters are only as useful as the consistency behind them. Google Analytics 4 treats "Facebook", "facebook", and "fb" as three different sources, and a medium it does not recognise sends your traffic to the Unassigned channel. Three people tagging links their own way for six months produces reports nobody trusts.
This guide sets out a convention a team of two to twenty can adopt in an afternoon: which parameters to use, how to format values, which medium values GA4 understands, and the mistakes that most often break attribution.
What each parameter is for
GA4 reads five classic UTM parameters plus a few newer ones. You need source, medium, and campaign on every tagged link. The rest are optional and only worth using if someone will actually filter by them.
- utm_source: who sent the traffic. The site, platform, or publication: google, facebook, linkedin, newsletter, partner-name.
- utm_medium: the type of traffic. This value drives GA4 channel grouping, so it must come from a fixed list (see below).
- utm_campaign: the specific campaign or promotion: diwali-sale-2026, webinar-nov-2026.
- utm_content: which link or creative inside the campaign: header-button, video-a, carousel-2. Useful for A/B tests.
- utm_term: the paid keyword. Mostly filled automatically by ad platforms; rarely needed by hand.
- utm_id: a campaign ID, used when you import cost data into GA4 so cost rows can be joined to sessions.
The formatting rules
Write these rules down in a shared document and do not allow exceptions. Every exception becomes a separate row in a report.
- Lowercase everything. GA4 values are case-sensitive, and lowercase removes the most common source of duplicates.
- Use hyphens between words, never spaces. Spaces become %20 or + in URLs and are easy to type inconsistently. Pick hyphens or underscores once; hyphens are easier to read.
- No special characters beyond letters, digits, and hyphens. Ampersands, question marks, and hash symbols break URLs unless encoded.
- Use the same name for the same thing everywhere. Decide once whether it is facebook or meta, linkedin or li, and list the allowed source values.
- Put dates in campaign names as yyyy-mm or a month-year label (nov-2026) so campaigns sort and do not collide across years.
- Keep values short and readable. utm_campaign=bf-2026 is fine if the team knows what bf means; document abbreviations in the same sheet.
Choosing medium values GA4 recognises
GA4 assigns sessions to default channel groups using rules on source and medium. If your medium does not match a rule, the session lands in Unassigned and is effectively lost from channel reports. These are the values worth standardising on:
- email: matches the Email channel (GA4 also accepts e-mail and e_mail, but pick one).
- cpc: paid search when the source is a search engine (google, bing), paid social when the source is a social site (facebook, linkedin). GA4 treats any medium matching the pattern ^(.*cp.*|ppc|retargeting|paid.*)$ as paid.
- social: organic social posts. GA4 also accepts social-network, social-media, sm.
- display: banner and programmatic display ads (also banner, cpm, interstitial).
- affiliate: affiliate partners.
- referral: links placed on other sites that are not paid placements.
- paid-social is a safe explicit choice for social ads: it matches the paid.* pattern and, with a known social source, lands in Paid Social.
Good
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=pricing-update-nov-2026&utm_content=hero-button
https://example.com/webinar?utm_source=linkedin&utm_medium=paid-social&utm_campaign=webinar-nov-2026&utm_content=video-a
Breaks reporting
?utm_source=Newsletter&utm_medium=Email Blast&utm_campaign=Pricing Update (case, spaces, unknown medium)
?utm_source=facebook&utm_medium=boosted-post (unknown medium -> Unassigned)Common mistakes that corrupt attribution
Most UTM problems are not typos; they are links tagged in places where tags should not be.
- Tagging internal links. A UTM on a link from your own homepage banner to your own pricing page overwrites the visitor's real source. Use event parameters or GA4 content groups for internal promotion instead.
- Manually tagging Google Ads when auto-tagging is on. Google Ads adds a gclid parameter that GA4 uses for richer data. Manual UTMs alongside it are usually unnecessary and can conflict; keep auto-tagging and only add UTMs if a non-Google tool needs them.
- Losing parameters in redirects. Some shorteners, HTTP-to-HTTPS redirects, or app deep links drop the query string. Click every tagged link before launch and check GA4 Realtime or DebugView.
- Putting UTMs in the fragment. Parameters after a # are not sent to the server, and the canonical form is ?utm_source=..., with the fragment last if you need one.
- Using the source to describe the creative. utm_source=summer-banner belongs in utm_content; the source is who sent the visit.
- Changing names mid-campaign. Renaming a campaign halfway splits it into two rows; if a rename is necessary, record the mapping.
Running the convention as a team
A convention survives only if building a correct link is easier than building a wrong one. Keep a shared sheet with three tabs: allowed sources, allowed mediums, and a log of every campaign name with owner and dates. New values are added to the sheet before they are used, not after.
Generate links with a builder rather than typing them. The Neemtools UTM Builder assembles the full URL from separate fields, so nobody hand-types an ampersand in the wrong place; the Google Ads UTM Builder does the same for paid search landing pages. Run finished links through the URL Encoder if a value contains characters that need encoding, and paste the log into the Case Converter if you inherit a sheet full of mixed-case names that need cleaning.
Once a month, open GA4, go to Traffic acquisition, and set the dimension to Session source / medium. Sort ascending and look for near-duplicates and anything in Unassigned. Each fix you make there is a rule to add to the sheet.