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
LinkedIn vs linkedin vs Linkedin — 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 launch vs spring-launch vs spring_launch — spaces get encoded as %20 in 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
fb vs facebook vs meta — 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_medium is 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! vs spring-launch vs spring&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
LinkedIn becomes linkedin. Spring-Launch becomes spring-launch. No more case-sensitivity splits in your reports.
Replaces spaces with hyphens
spring launch becomes spring-launch. No more %20 in your URLs.
Strips special characters
spring-launch-2026!@# becomes spring-launch-2026. Only lowercase letters, numbers, and hyphens survive.
Collapses double hyphens
spring--launch becomes spring-launch. Keeps your URLs clean even when stripping characters creates gaps.
Warns on inconsistencies
If you've used linkedin as a source before and now type linked-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_medium to social. Source should be the platform name (linkedin, twitter, facebook). Don't use "social-media" or "organic-social" — neither maps correctly.
Paid Social
Set utm_medium to paid-social or paidsocial. GA4 recognizes both. Source should be the platform name.
Email
Set utm_medium to email. That's it. Not "Email," not "e-mail," not "newsletter" (that's a source, not a medium).
Paid Search
Set utm_medium to cpc (cost per click). GA4 also recognizes ppc and paid-search, but cpc is the most widely used standard.
Display
Set utm_medium to display, banner, or cpm. These all map to the Display channel group.
Affiliate
Set utm_medium to affiliate. GA4 requires this exact value.
Referral
Set utm_medium to referral. Used for partner links, guest posts, and non-paid mentions on other sites.
Video
Set utm_medium to video. 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.