UTM Source Naming Rules: What Works (and What Breaks) in GA4
Two campaign URLs. Both look professional:
Campaign A:
?utm_source=Newsletter&utm_medium=Email&utm_campaign=Spring Sale
Campaign B:
?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale
One tracks perfectly. The other creates attribution nightmares.
Which one? Campaign B.
GA4 doesn't just care whether you add UTM parameters. It cares HOW you format them.
Uppercase vs lowercase. Spaces vs dashes. Special characters. Reserved words.
Get any of these wrong, and your attribution breaks or becomes inconsistent.
Here are the complete naming rules that actually work in GA4.
🚨 Not sure what's breaking your tracking?
Run a free 60-second audit to check all 40+ ways UTM tracking can fail.
Scan Your Campaigns Free✓ No credit card ✓ See results instantly
Rule 1: Always Use Lowercase
The rule: All UTM parameter values should be lowercase.
Why:
GA4 is case-sensitive.
This means:
utm_source=Newsletterutm_source=newsletterutm_source=NEWSLETTER
Are treated as three different sources in GA4.
The problem this creates:
You send 4 email campaigns:
- March:
utm_source=Newsletter - April:
utm_source=newsletter - May:
utm_source=NEWSLETTER - June:
utm_source=NewsLetter
GA4 shows 4 different sources:
- Newsletter: 2,400 sessions
- newsletter: 2,100 sessions
- NEWSLETTER: 1,800 sessions
- NewsLetter: 1,600 sessions
Your email performance is fragmented across 4 rows instead of 1 combined row showing 7,900 total sessions.
What you wanted: All email traffic grouped under one source name.
What you got: 4 separate sources that you have to manually combine in every report.
Solution: Pick lowercase and use it consistently:
?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale
Exception: Proper brand names
If you're tracking a specific brand or partner with capitalization in their name:
utm_source=TechCrunch(publication name)utm_source=LinkedIn(platform name with capital letters)
Just be 100% consistent with that exact capitalization.
Rule 2: Replace Spaces with Hyphens or Underscores
The rule: Never use spaces in UTM values. Use hyphens (-) or underscores (_).
Why:
Spaces in URLs become encoded as %20:
You write:
?utm_source=email campaign&utm_medium=email
URL becomes:
?utm_source=email%20campaign&utm_medium=email
GA4 shows:
- Source:
email%20campaign(ugly, hard to read)
Or worse, some platforms strip the space entirely:
- Source:
emailcampaign(one word, inconsistent with other campaigns)
Or worst, the space breaks the URL structure:
?utm_source=email campaign&utm_medium=email
Browser interprets this as:
- utm_source:
email - Invalid text:
campaign - utm_medium:
email
Result: Broken URL that doesn't track properly.
Solution: Use hyphens or underscores:
Option 1: Hyphens (recommended)
?utm_source=email-campaign&utm_medium=email
?utm_campaign=spring-sale-2024
Option 2: Underscores
?utm_source=email_campaign&utm_medium=email
?utm_campaign=spring_sale_2024
Pick one format and use it consistently across all campaigns.
Most marketing teams prefer hyphens because:
- More readable:
spring-salevsspring_sale - Common in URLs:
yoursite.com/spring-sale - Consistent with web standards
😰 Is this your only tracking issue?
This is just 1 of 40+ ways UTM tracking breaks. Most marketing teams have 8-12 critical issues they don't know about.
• 94% of sites have UTM errors
• Average: $8,400/month in wasted ad spend
• Fix time: 15 minutes with our report
✓ Connects directly to GA4 (read-only, secure)
✓ Scans 90 days of data in 2 minutes
✓ Prioritizes issues by revenue impact
✓ Shows exact sessions affected
Rule 3: Avoid Special Characters
The rule: Only use letters, numbers, hyphens, and underscores in UTM values.
Forbidden characters:
| Character | Why It's Forbidden | Example Problem |
|---|---|---|
& | Starts new URL parameter | source=partner&affiliate breaks into two parameters |
? | Starts query string | source=what? breaks URL parsing |
# | Starts URL fragment | source=sale#1 treats #1 as anchor |
= | Key-value separator | source=a=b confuses parameter parsing |
% | URL encoding prefix | source=50% becomes double-encoded |
+ | Sometimes read as space | source=a+b might become a b |
/ | Path separator | source=social/fb can break routing |
\ | Escape character | source=a\b causes encoding issues |
| `` | Empty space | source= treated as empty/missing |
Example (broken):
?utm_source=partner&affiliate&utm_medium=referral
What GA4 sees:
- utm_source:
partner - New parameter:
affiliate(no value) - utm_medium:
referral
Result: utm_source is only "partner", and you have a random "affiliate" parameter doing nothing.
Example (fixed):
?utm_source=partner-affiliate&utm_medium=referral
Rule 4: Never Use Reserved Keywords
The rule: Avoid words that have special meaning in programming or GA4.
Complete forbidden list:
Programming keywords:
- null, undefined, nil, none, NaN, false, true, void
GA4 system values:
- (not set), (not provided), (direct), (none), unassigned, unknown
Ambiguous terms:
- test, testing, temp, placeholder, example, default, sample
Why these break attribution:
Example:
?utm_source=null&utm_medium=email&utm_campaign=launch
GA4 interprets utm_source=null as "no source was provided" (not "source is named null").
Result: Traffic shows as "(direct) / (none)" instead of attributed to your email campaign.
Solution: Use descriptive, specific names:
?utm_source=newsletter&utm_medium=email&utm_campaign=launch
Rule 5: Be Specific (Not Generic)
The rule: Use descriptive source names that identify the exact origin.
Generic (problematic):
?utm_source=social&utm_medium=social&utm_campaign=promo
Problems:
- Which platform? Facebook? Instagram? LinkedIn?
- Can't compare platform performance
- All social traffic lumped together
Specific (correct):
?utm_source=facebook&utm_medium=social&utm_campaign=product-launch
?utm_source=instagram&utm_medium=social&utm_campaign=product-launch
?utm_source=linkedin&utm_medium=social&utm_campaign=product-launch
Result: You can compare which social platform drives better results.
Good Specificity Examples
Email:
- ❌ Generic:
utm_source=email - ✅ Specific:
utm_source=newsletter,utm_source=klaviyo,utm_source=mailchimp
Social:
- ❌ Generic:
utm_source=social - ✅ Specific:
utm_source=facebook,utm_source=instagram,utm_source=linkedin
Partners:
- ❌ Generic:
utm_source=partner - ✅ Specific:
utm_source=techcrunch,utm_source=partnersite.com
Paid ads:
- ❌ Generic:
utm_source=ads - ✅ Specific:
utm_source=google,utm_source=facebook,utm_source=linkedin
Rule 6: Use Standard utm_medium Values
The rule: Use GA4's predefined medium values for proper channel grouping.
Standard utm_medium values:
| Medium Value | Channel Group | Use For |
|---|---|---|
organic | Organic Search | Organic search traffic |
cpc / ppc | Paid Search | Paid search ads |
email | Email marketing | |
social | Organic Social | Organic social posts |
paid-social | Paid Social | Paid social ads |
referral | Referral | Partner/blog links |
affiliate | Affiliate | Affiliate marketing |
display | Display | Display advertising |
Why this matters:
GA4 uses utm_medium to assign traffic to channel groups.
Custom medium values (like newsletter, partner, campaign) won't map to default channel groups.
Example:
?utm_source=newsletter&utm_medium=newsletter&utm_campaign=spring
Problem:
- Doesn't map to "Email" channel group
- Shows as "Unassigned" or custom channel
- Excluded from standard channel reports
Solution:
?utm_source=newsletter&utm_medium=email&utm_campaign=spring
Now it properly maps to the "Email" channel group.
Rule 7: Keep It Short and Readable
The rule: UTM values should be concise but descriptive (under 50 characters).
Too long (hard to read):
?utm_source=march-2024-newsletter-sent-to-engaged-subscribers
?utm_campaign=spring-sale-promotion-for-new-product-line-2024-q1
Problems:
- GA4 tables become wide and hard to read
- Sorting/filtering becomes cumbersome
- Higher chance of typos
Just right:
?utm_source=newsletter
?utm_campaign=spring-sale-2024
Guideline:
- utm_source: 8-20 characters
- utm_medium: 5-15 characters
- utm_campaign: 10-30 characters
Rule 8: Be Consistent Across Campaigns
The rule: Pick naming patterns and stick to them across ALL campaigns.
Inconsistent (nightmare):
- Campaign 1:
utm_source=Newsletter - Campaign 2:
utm_source=newsletter - Campaign 3:
utm_source=email-newsletter - Campaign 4:
utm_source=mail - Campaign 5:
utm_source=klaviyo
All refer to the same channel (email), but GA4 shows 5 different sources.
Consistent (perfect):
- All campaigns:
utm_source=newsletter&utm_medium=email
How to ensure consistency:
Create a naming standards document:
Email campaigns:
- utm_source:
newsletter - utm_medium:
email - utm_campaign:
{campaign-name}
Social organic:
- utm_source:
{"{"}{"{"}platform{"}"}{"}"}}(facebook, instagram, linkedin, twitter) - utm_medium:
social - utm_campaign:
{campaign-name}
Social paid:
- utm_source: Use platform auto-tagging (fbclid) instead of manual UTMs
- If manual: utm_source:
{"{"}{"{"}platform{"}"}{"}"}}, utm_medium:paid-social
Partners:
- utm_source:
{partner-domain}(techcrunch, partnersite.com) - utm_medium:
referral - utm_campaign:
{campaign-name}
✅ Fixed this issue? Great! Now check the other 39...
You just fixed one tracking issue. But are your Google Ads doubling sessions? Is Facebook attribution broken? Are internal links overwriting campaigns?
• Connects to GA4 (read-only, OAuth secured)
• Scans 90 days of traffic in 2 minutes
• Prioritizes by revenue impact
• Free forever for monthly audits
Join 2,847 marketers fixing their tracking daily
Complete UTM Naming Template
Email campaigns:
?utm_source=newsletter
&utm_medium=email
&utm_campaign=`{campaign-name}`
&utm_content=`{cta-location}`
Example:
?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale-2024&utm_content=hero-cta
Organic social:
?utm_source=`{"{"}{"{"}platform{"}"}{"}"}}`
&utm_medium=social
&utm_campaign=`{campaign-name}`
&utm_content=`{post-type}`
Example:
?utm_source=linkedin&utm_medium=social&utm_campaign=thought-leadership&utm_content=carousel
Paid social:
Use platform auto-tagging (fbclid, li_fat_id, ttclid)
Don't add manual UTMs on top of auto-tagging
Partner/referral:
?utm_source=`{partner-domain}`
&utm_medium=referral
&utm_campaign=`{campaign-name}`
&utm_content=`{link-location}`
Example:
?utm_source=techcrunch.com&utm_medium=referral&utm_campaign=product-review&utm_content=article-body
Display ads:
?utm_source=`{ad-network}`
&utm_medium=display
&utm_campaign=`{campaign-name}`
&utm_content=`{creative-variant}`
Example:
?utm_source=google-display&utm_medium=display&utm_campaign=retargeting-q1&utm_content=animated-300x250
Real Example: Before and After Cleanup
Client: SaaS company with 18 months of inconsistent UTM naming
Before (chaos):
Email sources in GA4:
- Newsletter: 12,400 sessions
- newsletter: 8,900 sessions
- NEWSLETTER: 3,200 sessions
- Email: 4,100 sessions
- email: 2,800 sessions
- mail: 1,900 sessions
- Mailchimp: 2,100 sessions
- klaviyo: 1,800 sessions
- Email Newsletter: 1,400 sessions
Total: 38,600 sessions fragmented across 9 different source names
Problem: Can't get accurate email performance without manually combining 9 rows in every report.
After (standardized):
Implemented naming rules:
- All new campaigns:
utm_source=newsletter&utm_medium=email - All lowercase
- Hyphens instead of spaces
- Consistent format
30 days after implementation:
Email sources in GA4:
- newsletter: 3,800 sessions (new campaigns)
- Legacy sources: 200 sessions (diminishing)
90 days after implementation:
- newsletter: 11,200 sessions (nearly all traffic)
- Legacy sources: <100 sessions (only from drip campaigns not yet updated)
Result: Clean, unified email reporting. One row instead of 9.
Validation Checklist for Every Campaign URL
Before launching any campaign, check:
✅ Format rules:
- All lowercase (no capitals)
- No spaces (use hyphens or underscores)
- No special characters (&, ?, #, =, %, +, /)
- No reserved keywords (null, undefined, test, none)
✅ Structure rules:
- utm_source present and descriptive
- utm_medium present and uses standard value
- utm_campaign present (recommended)
- All values under 50 characters
- Consistent with naming standards document
✅ Testing:
- Click URL in incognito browser
- Check GA4 Realtime report
- Verify source/medium show correctly
- Confirm not showing as "(direct)"
FAQ
Can I use CamelCase (like utm_source=NewsLetter)?
Technically yes, but it fragments reporting. If you use NewsLetter, every instance must be exactly NewsLetter (not newsletter or NEWSLETTER). Lowercase is safer.
Should I use hyphens or underscores?
Either works. Pick one and be consistent. Most teams use hyphens because they're more web-standard and readable.
What if my brand name has capitals (like YouTube)?
You can use utm_source=YouTube if you're 100% consistent always using that exact capitalization. Otherwise, use youtube (lowercase) to avoid fragmentation.
Can I include the date in utm_source?
Not recommended. utm_source should be the origin (newsletter, facebook, partner-site), not the campaign timing. Use utm_campaign for dates: utm_campaign=spring-sale-2024.
Are emojis allowed in UTM parameters?
Technically yes (they get URL-encoded), but don't use them. They make URLs unreadable, break in some systems, and complicate reporting.
How long can UTM values be?
No hard limit, but GA4 truncates very long values in reports (around 100+ characters). Keep values under 50 characters for readability.
Conclusion
UTM source naming rules for GA4:
- Always lowercase (avoid capitalization)
- No spaces (use hyphens or underscores)
- No special characters (only letters, numbers, -, _)
- No reserved keywords (null, undefined, test, none)
- Be specific (not generic)
- Use standard medium values (email, social, cpc, referral)
- Keep it short (under 50 characters)
- Be consistent (use same names across all campaigns)
Template:
?utm_source=`{specific-origin}`
&utm_medium=`{standard-channel}`
&utm_campaign=`{descriptive-name}`
Follow these rules, and your GA4 attribution will be clean, accurate, and consistent forever.
Related: Complete UTM Naming Standards Documentation