UTM Naming Conventions: The Complete Guide
UTM parameters are only useful if they're consistent. In Google Analytics, "facebook," "Facebook," and "fb" show up as three separate sources — splitting your data and hiding what's actually working. Here's how to build a naming convention that doesn't fall apart.
The 5 UTM parameters explained
Every UTM-tagged URL can include up to five parameters. Three are required for meaningful tracking; two are optional. Here's what each one does and how to use it correctly.
- utm_source (required)
- Identifies where the traffic comes from — the specific platform, site, or publication. Examples:
linkedin,twitter,newsletter,google. Always lowercase, no spaces. This is the single most important parameter: it tells you which platform sent the click. - utm_medium (required)
- Identifies the marketing channel type. Examples:
social,email,cpc,display,referral. Use GA4's default channel groupings (more on this below) so your traffic gets classified correctly. Don't invent your own — "social-media" and "social_organic" will both end up as "Unassigned." - utm_campaign (required)
- Names your specific campaign or promotion. Examples:
spring-launch-2026,black-friday-sale,product-webinar-march. Use hyphens to separate words and include the year. This is what you'll filter by in GA4 to see how a campaign performed across all sources and mediums. - utm_term (optional)
- Originally designed for paid search keywords, but useful for any audience segment or targeting criteria. Examples:
marketing-managers,brand-awareness,retargeting-30d. Lowercase, hyphen-separated. - utm_content (optional)
- Differentiates ads or links that point to the same URL. Use it for A/B test variants, ad creative identifiers, or link placement. Examples:
hero-image-a,cta-red,sidebar-banner,top-nav-link.
Common naming mistakes (and why they wreck your data)
UTM parameters are case-sensitive. One inconsistency means split data in your reports. Here are the mistakes we see most often:
- Capitalization inconsistency
LinkedInvslinkedinvsLinkedin— these are three separate sources in GA4. Your LinkedIn traffic is now split across three rows, and none of them show the real number. Pick lowercase and stick with it.- Spaces vs hyphens vs underscores
spring launchvsspring-launchvsspring_launch— spaces get encoded as%20in URLs (ugly and error-prone). Underscores and hyphens are both valid, but pick one. We recommend hyphens because they're more readable in GA4 reports.- Abbreviations without a standard
fbvsfacebookvsmeta— if half your team uses "fb" and the other half uses "facebook," your Facebook traffic is permanently split. Document your source names and enforce them.- Missing parameters
- If
utm_mediumis missing on half your links, that traffic shows up as "(not set)" in GA4. You can see the source, but you can't tell whether it was paid, organic, or email. Always include source, medium, and campaign — all three. - Special characters
spring-launch!vsspring-launchvsspring&launch— exclamation marks, ampersands, and other special characters break URL parsing or get encoded unpredictably. Strip them. Your campaign name should only contain lowercase letters, numbers, and hyphens.
A naming convention template you can copy
Here's a concrete, copy-paste-ready convention. Adopt it as-is or adjust it to your team — the important thing is that everyone uses the same rules.
- utm_source
- Always the lowercase platform name. No abbreviations, no brand capitalization.
Use:linkedin,twitter,facebook,newsletter,google,bing,reddit
Don't use:LinkedIn,fb,Meta,Twitter/X - utm_medium
- Use GA4's default channel grouping values so traffic gets classified automatically.
Use:social,email,cpc,display,organic,referral,affiliate,video
Don't use:social-media,paid-social,Social,EMAIL - utm_campaign
- Lowercase, hyphen-separated, with the year. Be descriptive enough that you'll recognize it in six months.
Use:spring-launch-2026,black-friday-sale-2026,product-webinar-march-2026
Don't use:Spring Launch,campaign1,test,BF_sale!! - utm_term
- Lowercase, hyphen-separated keyword or audience segment.
Use:marketing-managers,brand-awareness,saas-tools
Don't use:Marketing Managers,kw1 - utm_content
- Variant or creative identifier. Keep it short but meaningful.
Use:hero-image-a,cta-red,sidebar-banner,email-header-link
Don't use:version 2,FINAL_final,test123
The full pattern:
?utm_source=linkedin&utm_medium=social&utm_campaign=spring-launch-2026&utm_term=marketing-managers&utm_content=hero-image-a
How MissingLinkz enforces naming automatically
Naming conventions only work if they're enforced. MissingLinkz sanitizes every UTM parameter automatically when you run mlz build or mlz preflight. Here's what happens to your input:
- Converts to lowercase
LinkedInbecomeslinkedin.Spring-Launchbecomesspring-launch. No more case-sensitivity splits in your reports.- Replaces spaces with hyphens
spring launchbecomesspring-launch. No more%20in your URLs.- Strips special characters
spring-launch-2026!@#becomesspring-launch-2026. Only lowercase letters, numbers, and hyphens survive.- Collapses double hyphens
spring--launchbecomesspring-launch. Keeps your URLs clean even when stripping characters creates gaps.- Warns on inconsistencies
- If you've used
linkedinas a source before and now typelinked-in, MissingLinkz flags it. This catches typos and drift before they fragment your data.
Example: You type "Spring Launch 2026!@#" as your campaign name. MissingLinkz outputs:
input: "Spring Launch 2026!@#"
sanitized: spring-launch-2026
You don't need to remember the rules. The tool enforces them for you. See the full step-by-step guide for how to use the CLI.
GA4 channel grouping alignment
Google Analytics 4 uses "default channel groupings" to classify your traffic into buckets like Organic Social, Paid Search, Email, and so on. The classification depends almost entirely on your utm_medium value. If it doesn't match GA4's expected values, your traffic gets dumped into "Unassigned" — a black hole where you can't tell what channel drove the visit.
Here are the utm_medium values that map to GA4's default channel groupings:
- Organic Social
- Set
utm_mediumtosocial. Source should be the platform name (linkedin,twitter,facebook). Don't use "social-media" or "organic-social" — neither maps correctly. - Paid Social
- Set
utm_mediumtopaid-socialorpaidsocial. GA4 recognizes both. Source should be the platform name. - Set
utm_mediumtoemail. That's it. Not "Email," not "e-mail," not "newsletter" (that's a source, not a medium). - Paid Search
- Set
utm_mediumtocpc(cost per click). GA4 also recognizesppcandpaid-search, butcpcis the most widely used standard. - Display
- Set
utm_mediumtodisplay,banner, orcpm. These all map to the Display channel group. - Affiliate
- Set
utm_mediumtoaffiliate. GA4 requires this exact value. - Referral
- Set
utm_mediumtoreferral. Used for partner links, guest posts, and non-paid mentions on other sites. - Video
- Set
utm_mediumtovideo. Used for YouTube descriptions, video ad click-throughs, and embedded video CTAs.
The rule is simple: if you use a utm_medium value that doesn't match any of GA4's recognized patterns, your traffic goes to "Unassigned." That's why inventing custom medium values like "social_organic" or "outbound-email" is dangerous — you lose channel-level visibility in every standard GA4 report.
Related reading
- AI Agent Campaign Links
- How AI agents build, validate, and deploy UTM-tagged campaign links automatically — with consistent naming enforced by default.
- Build UTM Links with an AI Agent
- A walkthrough of using Claude Code, Cursor, or other AI agents to generate UTM links without manual parameter entry.
- Campaign Link Preflight Check
- Why you should validate your landing page before launching a campaign — and how MissingLinkz catches broken OG tags, redirect chains, and slow pages.
- The Cost of Broken Campaign Links
- What happens to your ad spend when campaign links break: lost attribution, wasted budget, and invisible failures in your analytics.
- Step-by-Step Guide
- How to install MissingLinkz and run your first preflight check in under a minute.
For Agents
MissingLinkz is built for AI agents. Install the CLI, and your agent can build UTM links with enforced naming conventions in a single command.
npm install -g missinglinkz
Naming conventions are enforced automatically — no configuration needed:
mlz build --url "https://yoursite.com/landing" --campaign "Spring Launch 2026" --source "LinkedIn" --medium "social"
tracked_url: https://yoursite.com/landing?utm_source=linkedin&utm_medium=social&utm_campaign=spring-launch-2026
# "LinkedIn" → "linkedin", "Spring Launch 2026" → "spring-launch-2026"
Read the SKILL.md for the full agent integration spec.