Why Campaign Details in utm_source Break Your GA4 Reports
You open GA4's Traffic Acquisition report to see how email is performing.
Instead of one clean "mailchimp" entry, you see:
newsletter_january_2024- 340 sessionsnewsletter_february_2024- 298 sessionsnewsletter_march_2024- 412 sessionspromo_email_spring_sale- 521 sessionspromo_email_black_friday- 789 sessionswelcome_email_series- 156 sessionsabandoned_cart_email- 203 sessions
That's 7 rows for what should be 1 row: "mailchimp."
Now multiply this by 12 months, 4 campaign types, and 3 email platforms.
You have 144 separate "source" entries when you should have 3.
Your reports are impossible to read. Your month-over-month comparisons are broken. You can't see overall channel performance.
This is what happens when you put campaign details in utm_source.
🚨 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
What utm_source Is Supposed to Be
utm_source should identify the platform or vendor sending traffic.
mailchimp- Email platformfacebook- Social platformgoogle- Search engineimpact- Affiliate networkpartnersite- Specific referral partner
utm_source answers: "Where did this traffic come from?"
It should be:
- Stable (doesn't change frequently)
- Generic (platform name, not campaign name)
- Consistent (same value across campaigns)
What Happens When You Add Campaign Details
When marketers put campaign-specific information in utm_source, they create this:
Email campaigns:
utm_source=newsletter_january_2024
utm_source=newsletter_february_2024
utm_source=promo_email_spring_sale
utm_source=promo_email_black_friday
utm_source=welcome_series_day_1
utm_source=welcome_series_day_7
utm_source=cart_abandonment_email
Social campaigns:
utm_source=facebook_spring_sale_2024
utm_source=facebook_product_launch
utm_source=facebook_retargeting_q1
utm_source=linkedin_webinar_promo
utm_source=linkedin_ebook_download
Affiliate campaigns:
utm_source=impact_bloggers_q1
utm_source=impact_influencers_spring
utm_source=shareasale_coupon_sites
Each campaign creates a new utm_source value.
Why This Destroys Your GA4 Reports
Problem 1: Impossible to See Platform Performance
You want to know: "How is email performing overall?"
GA4 Traffic Acquisition report shows:
Session source | Sessions | Conversions
-----------------------------|----------|------------
newsletter_january_2024 | 340 | 8
newsletter_february_2024 | 298 | 6
newsletter_march_2024 | 412 | 11
promo_email_spring_sale | 521 | 18
promo_email_black_friday | 789 | 34
welcome_email_series | 156 | 4
abandoned_cart_email | 203 | 9
...42 more email source rows
Question: What's the total email performance?
Answer: You have to manually add 49 separate rows.
If utm_source was just "mailchimp":
Session source | Sessions | Conversions
------------------|----------|------------
mailchimp | 2,719 | 90
One row. Instant insight.
Problem 2: Broken Month-Over-Month Comparisons
You want to compare January vs February email performance.
January:
Session source | Sessions
-----------------------------|----------
newsletter_january_2024 | 340
welcome_series_day_1_jan | 89
promo_email_new_year | 234
February:
Session source | Sessions
-----------------------------|----------
newsletter_february_2024 | 298
welcome_series_day_1_feb | 103
promo_email_valentines | 401
There's no overlap. Every row is different.
You can't set up a month-over-month comparison in GA4 because the source values don't match across time periods.
Problem 3: Report Clutter (Pagination Hell)
GA4 Traffic Acquisition reports default to showing 10 rows.
With fragmented utm_source values:
- Page 1: Rows 1-10 (various newsletters)
- Page 2: Rows 11-20 (more newsletters)
- Page 3: Rows 21-30 (promotional emails)
- Page 4: Rows 31-40 (transactional emails)
You have to paginate through 5+ pages just to see all email traffic.
With clean utm_source:
- Row 1:
mailchimp- 2,719 sessions (all email in one row) - Row 2:
facebook- 3,200 sessions (all social in one row) - Row 3:
google- 4,100 sessions (all search in one row)
Everything on page 1.
Problem 4: Segment and Filter Chaos
You want to create a GA4 segment for "All Email Traffic."
With fragmented utm_source, you have to add 49 separate conditions:
Session source = newsletter_january_2024
OR Session source = newsletter_february_2024
OR Session source = promo_email_spring_sale
OR Session source = promo_email_black_friday
...OR Session source = (45 more values)
Every time you launch a new email campaign, you have to update the segment.
With clean utm_source:
Session source = mailchimp
Done. One condition. Never needs updating.
😰 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
Real Example: 347 Source Entries for 4 Actual Platforms
Client: B2B SaaS company Marketing channels: Email (Mailchimp), Paid Social (Facebook, LinkedIn), Affiliates (Impact)
What they expected in GA4:
Session source | Sessions
------------------|----------
mailchimp | 4,200
facebook | 3,800
linkedin | 2,100
impact | 890
What GA4 actually showed:
Session source | Sessions
--------------------------------------------|----------
mailchimp-newsletter-january-2024 | 203
mailchimp-newsletter-february-2024 | 189
mailchimp-promo-spring-sale | 412
mailchimp-promo-product-launch | 298
mailchimp-welcome-series-day1 | 67
mailchimp-welcome-series-day7 | 45
...87 more mailchimp source rows
facebook-spring-sale-2024 | 521
facebook-product-launch-video | 340
facebook-retargeting-cart | 289
...43 more facebook source rows
linkedin-webinar-q1-2024 | 234
linkedin-ebook-download | 178
...31 more linkedin source rows
impact-bloggers-q1 | 156
impact-influencers-spring | 103
...29 more impact source rows
Total source entries: 347 Actual platforms: 4
Client's frustration:
"I can't see which platform is performing best. I can't compare month-over-month. I can't filter reports. Every campaign creates a new source. It's chaos."
We consolidated utm_source to platform names only:
After fix:
Session source | Sessions | Conversions | Cost per Session
------------------|----------|-------------|------------------
mailchimp | 4,200 | 112 | $1.43
facebook | 3,800 | 89 | $3.16
linkedin | 2,100 | 67 | $4.76
impact | 890 | 34 | $2.25
347 rows reduced to 4 rows.
Insights instantly visible:
- Mailchimp has lowest cost per session
- LinkedIn has highest cost per session but strong conversion rate
- Impact has highest conversion rate (34 conversions from 890 sessions = 3.8%)
Client shifted $8,000/month budget from LinkedIn to Impact based on ROAS. Would have been impossible to see with fragmented source data.
Why Marketers Make This Mistake
Reason 1: Trying to Be Too Descriptive
Intent: "I want to know exactly which campaign this traffic came from."
Wrong implementation:
utm_source=spring_sale_email_2024
utm_medium=email
utm_campaign=20_percent_off
The thinking: "More detail in utm_source means better tracking."
Reality: utm_campaign already provides this detail. Duplicating it in utm_source fragments reports.
Right implementation:
utm_source=mailchimp
utm_medium=email
utm_campaign=spring-sale-20-percent-off
Reason 2: Following Outdated Templates
Many UTM templates from 2015-2018 recommend putting campaign context in utm_source:
Old template example:
utm_source=[CAMPAIGN_NAME]_[PLATFORM]
utm_medium=[CHANNEL]
utm_campaign=[DATE]
Result:
utm_source=spring_sale_email
utm_medium=newsletter
utm_campaign=2024-03-15
This creates a new source value for every campaign.
Reason 3: Not Understanding UTM Parameter Hierarchy
utm_source, utm_medium, and utm_campaign work together as a hierarchy:
- utm_source = Broad platform (stable)
- utm_medium = Channel type (stable)
- utm_campaign = Specific campaign (changes frequently)
When you put campaign details in utm_source, you reverse the hierarchy and break reporting.
Reason 4: Trying to Avoid Duplicate utm_campaign Values
Some marketers think: "I'm running Spring Sale campaigns on email AND social. If I use utm_campaign=spring-sale for both, won't they merge?"
Answer: No. GA4 tracks source + medium + campaign together.
Email campaign:
utm_source=mailchimp
utm_medium=email
utm_campaign=spring-sale
Social campaign:
utm_source=facebook
utm_medium=paidsocial
utm_campaign=spring-sale
GA4 sees these as two separate campaigns because source+medium differ.
You don't need unique utm_campaign names across channels. The combination makes them unique.
How to Check If You Have This Problem
Method 1: GA4 Traffic Acquisition Report (2 minutes)
- GA4 → Reports → Traffic Acquisition
- Change primary dimension to "Session source"
- Scroll through the list
Look for patterns like:
- Multiple entries for the same platform (
mailchimp-jan,mailchimp-feb,mailchimp-mar) - Campaign names in source values (
spring-sale-email,product-launch-email) - Dates in source values (
newsletter-2024-01,newsletter-2024-02)
If you see these patterns, you have campaign details in utm_source.
Method 2: Count Unique Sources (3 minutes)
- GA4 → Explore → Create Free Form
- Add dimension: Session source
- Add metric: Sessions
- Export to CSV
- Count rows in Excel/Sheets
Healthy range:
- 10-30 unique sources (typical for small-to-medium businesses)
- 30-100 unique sources (large businesses with many partners)
Problem range:
- 100-500 unique sources → Likely have campaign details in utm_source
- 500+ unique sources → Definitely have this problem
Method 3: Pattern Analysis (5 minutes)
- GA4 → Explore → Free Form
- Dimension: Session source
- Metric: Sessions
- Sort by Sessions (descending)
- Look at top 50 sources
Red flags:
- Sources with dates:
newsletter-2024-01-15 - Sources with campaign names:
spring-sale-facebook - Sources that describe campaigns:
black-friday-promo-email - Sources with underscores separating multiple concepts:
mailchimp_newsletter_january
The Fix: Separate Platform from Campaign
Step 1: Identify Current utm_source Patterns
Export all utm_source values from GA4:
- GA4 → Explore → Free Form
- Dimension: Session source
- Download CSV
- Group by platform type
Example:
Current utm_source | Platform | Campaign Detail
-------------------------------------|----------|------------------
newsletter_january_2024 | email | january newsletter
newsletter_february_2024 | email | february newsletter
promo_email_spring_sale | email | spring sale promo
facebook_spring_sale_2024 | facebook | spring sale 2024
facebook_product_launch | facebook | product launch
linkedin_webinar_q1 | linkedin | webinar q1
Step 2: Define Standard utm_source Values
For each platform, choose one stable utm_source value:
| Platform Type | Standard utm_source |
|---|---|
| Email (Mailchimp) | mailchimp |
| Email (SendGrid) | sendgrid |
| Email (HubSpot) | hubspot |
| Paid Social (Facebook) | facebook |
| Paid Social (LinkedIn) | linkedin |
| Paid Social (TikTok) | tiktok |
| Affiliates (Impact) | impact |
| Affiliates (ShareASale) | shareasale |
| Referral Partners | [specific-partner-name] |
Step 3: Update All Campaign Templates
Email platform defaults:
Mailchimp:
- Settings → Tracking → Google Analytics
- Set
utm_sourcedefault:mailchimp - Set
utm_mediumdefault:email - Leave
utm_campaignvariable (changes per campaign)
HubSpot:
- Settings → Marketing → Tracking
- Update default UTM parameters
- utm_source:
hubspot - utm_medium:
email
Social media scheduler (Hootsuite/Buffer):
- Settings → Link Tracking
- utm_source:
[platform](use platform name token) - utm_medium:
socialorpaidsocial
Step 4: Restructure Campaign Naming
Move campaign details from utm_source to utm_campaign.
Before (wrong):
utm_source=newsletter_spring_sale_2024
utm_medium=email
utm_campaign=march
After (correct):
utm_source=mailchimp
utm_medium=email
utm_campaign=spring-sale-2024-march
Before (wrong):
utm_source=facebook_product_launch_video
utm_medium=paidsocial
utm_campaign=awareness
After (correct):
utm_source=facebook
utm_medium=paidsocial
utm_campaign=product-launch-video-awareness
✅ 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
Best Practices: utm_source Naming Standards
Rule 1: Platform Name Only
utm_source should ONLY identify the platform or vendor:
- ✅
mailchimp,sendgrid,hubspot - ✅
facebook,linkedin,tiktok - ✅
google,bing - ❌
mailchimp_spring_sale - ❌
facebook_ads_2024
Rule 2: Lowercase, Hyphens for Multi-Word
- ✅
google-display - ✅
partner-blog - ❌
GoogleDisplay - ❌
partner_blog(underscores fragment searches)
Rule 3: Consistent Across Campaigns
Use the EXACT same utm_source for every campaign from that platform:
Mailchimp campaigns:
- Newsletter →
utm_source=mailchimp - Promotional →
utm_source=mailchimp - Transactional →
utm_source=mailchimp - Welcome series →
utm_source=mailchimp
All use the same source. Campaign details go in utm_campaign.
Rule 4: Don't Duplicate Platform in Source and Medium
Wrong:
utm_source=facebook
utm_medium=facebook-ads
Right:
utm_source=facebook
utm_medium=paidsocial
utm_source and utm_medium serve different purposes. Don't duplicate.
Rule 5: For Multiple Sub-Sources, Use Specific Names
If you have multiple partners or sub-platforms, use specific names in utm_source:
Affiliate programs:
utm_source=impact(affiliate network)utm_source=shareasale(different network)utm_source=individual-blogger-name(specific partner)
Email platforms:
utm_source=mailchimp(marketing emails)utm_source=sendgrid(transactional emails)
This is fine because each source is still stable across campaigns.
FAQ
Won't I lose campaign-level detail if I simplify utm_source?
No. Campaign details belong in utm_campaign, not utm_source. You get the same granularity with better organization:
Before:
utm_source=newsletter_spring_sale
utm_campaign=2024
After:
utm_source=mailchimp
utm_campaign=newsletter-spring-sale-2024
You can still filter by campaign name. But now email traffic is aggregated under one source.
What if I have campaign details already in utm_source for 2 years of historical data?
Historical data stays as-is. GA4 doesn't allow retroactive changes. Focus on fixing future campaigns. Over time, clean data will accumulate and fragmented old data will age out of default reporting windows.
How do I compare old fragmented data with new clean data?
Create two segments:
- "Old Email (Fragmented)" → Include all old utm_source values
- "New Email (Clean)" → utm_source = mailchimp
Use these segments for historical comparisons during the transition period.
Can I use custom dimensions instead of utm_source?
Yes, but utm_source is a default dimension in all GA4 reports. Custom dimensions require manual setup in Explorations. It's better to fix utm_source than work around it.
What about A/B tests? Should I put variant in utm_source?
No. Use utm_content for variants:
utm_source=mailchimp
utm_medium=email
utm_campaign=spring-sale
utm_content=variant-a (or variant-b)
GA4 will show utm_content as a secondary dimension for comparison.