Docs · UTM · Taxonomy

UTM Naming Conventions: A Framework That Scales

Controlled vocabularies, separator rules, campaign name structure, abbreviations, and governance that marketers can apply under deadline pressure — and analysts can parse years later.

· Updated

A naming convention isn’t a style guide. It’s a data schema enforced by people instead of a database — which is why it fails, and why the design has to assume deadline pressure and half-attention.

Prefer the interactive Tracking Standards tool to encode these rules — approved values, aliases, live validation and platform templates — instead of a forgotten spreadsheet.

Success looks like this: two marketers tagging the same campaign independently produce the same string, and an analyst can SPLIT() it two years later. Channel and parameter habits sit in how to optimize UTM tags; catching drift is in monitoring and fixing UTM issues.

Design principles

Universal rules (every parameter)

  1. All lowercase. Values are case-sensitive; Email ≠ email forever.
  2. Hyphens within a field. black-friday, not black_friday or blackfriday.
  3. Underscores between fields. 2026-q3_black-friday_apac splits cleanly on _.
  4. ASCII only. Accents and emoji URL-encode into unreadable (sometimes broken) values.
  5. No spaces. Spaces become %20 or + — two variants of one value.
  6. No reserved characters: & ? = # % + / \ " ' < >.
  7. No PII. Query strings land in GA, logs, referrers and shared URLs.
  8. Fixed field order. Same components, same position, every time — so position-based parsing works.

Parameter-by-parameter

utm_source — closed list

One canonical value per platform:

google  bing  meta  linkedin  tiktok  reddit  pinterest
youtube  x  mailchimp  klaviyo  hubspot  partner-name  newsletter

Never mix facebook / meta / fb. For partners, use the bare domain: techcrunch.com.

Email decision: ESP name (mailchimp) vs stable identity (newsletter). The second survives an ESP migration — pick once and document it (Mailchimp setup).

utm_medium — strictly closed

Most consequential for GA4 channel grouping. Keep it short and aligned with GA4’s rules:

ValueUse for
cpcPaid search
paid-socialPaid social (contains paid)
displayDisplay / programmatic
emailAll email
organic-socialUnpaid social posts
affiliateAffiliate programmes
referralPartner / PR links
smsText message
pushPush notifications
qrQR codes / print
videoPaid video placements

Anything else is a defect. Don’t put campaign names, formats, agencies or dates here. Traps: social on paid ads → Organic Social; paidsearch ≠ GA4 paid search — use cpc.

utm_campaign — structured free text

One template for the account:

{yyyy-qq}_{initiative}_{audience-or-region}

2026-q3_summer-sale_uk
2026-q3_product-launch-atlas_enterprise
2026-q4_black-friday_global
2026-q3_always-on-brand_dach

Date first = free chronological sort. Use yyyy-mm for monthly cycles; yyyy-mm-dd only for one-offs. Funnel-first alternative if that matters more than geography:

{yyyy-mm}_{funnel-stage}_{initiative}
2026-08_tofu_industry-report
2026-08_bofu_demo-retargeting

Pick one pattern. Two patterns in one account is the same as none.

Platform IDs ({campaignid}, Meta {{campaign.id}}) are more robust than names — renames don’t split history — if you can join IDs to labels in BI. No BI layer? Use the structured name and treat renames as data-breaking. Placement on Google Ads: Ideal tracking template setup.

utm_content — semi-closed

Creative / placement within the campaign:

hero-cta        header-banner    sidebar-300x250
footer-link     inline-text-1    product-card-2
variant-a       variant-b        static-v3

Paid: ad-level ID ({creative}) is stricter. Email: human placement names answer “which part of the email worked.”

utm_term — targeting

Keyword or segment. Google Ads: {keyword}. Email/social: lapsed-90d, lookalike-1pct-purchasers. Leave empty rather than repurposing — empty is honest; misuse corrupts a dimension.

utm_id — campaign ID

GA4 manual campaign ID and cost-import join key. Short stable code from your registry: cmp-2026-0412. Optional if you never import cost; mandatory if you do.

Abbreviation discipline

Systematically or not at all. Publish the table:

enterprise → ent        small-business → smb
remarketing → rmkt      prospecting → prosp
awareness → awr         consideration → cons

Never let ent, enterprise and enterp coexist. Keep campaign names under ~50 characters — past that, UIs truncate and readability dies.

Making it stick

A convention nobody follows is worse than none — it creates false confidence.

Worked example

Same Q3 UK product launch across three channels — shared campaign + id, different source/medium/content:

Google Ads Final URL suffix:

utm_source=google&utm_medium=cpc&utm_campaign=2026-q3_product-launch-atlas_uk&utm_content={creative}&utm_term={keyword}&utm_id=cmp-2026-0412

Newsletter:

?utm_source=newsletter&utm_medium=email&utm_campaign=2026-q3_product-launch-atlas_uk&utm_content=hero-cta&utm_id=cmp-2026-0412

Organic LinkedIn:

?utm_source=linkedin&utm_medium=organic-social&utm_campaign=2026-q3_product-launch-atlas_uk&utm_content=launch-post-1&utm_id=cmp-2026-0412

Initiative rolls up. Channels stay clean. Content tells you which asset worked. That’s the whole point.

FAQ

Hyphens or underscores?

Hyphens within a field, underscores between fields. Consistency matters more than which you picked historically — but don’t mix both schemes mid-flight without versioning.

Should campaign names include dates?

Yes — yyyy-qq or yyyy-mm prefix for sort and recency.

How long should utm_campaign be?

Under ~50 characters.

IDs or names in utm_campaign?

IDs if you can join to labels; names if you can’t. Renaming a named campaign splits history.

Correct utm_medium values?

Closed list of about ten: cpc, paid-social, display, email, organic-social, affiliate, referral, sms, push, qr (plus video if you need it). Anything else risks misclassification.

Can I change the convention later?

Yes — version it with an effective date so parsers know where the boundary sits.

Related

← All documentation