Why Campaign Details in utm_source Break Your GA4 Reports

UTMGuard Team
8 min readtroubleshooting

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 sessions
  • newsletter_february_2024 - 298 sessions
  • newsletter_march_2024 - 412 sessions
  • promo_email_spring_sale - 521 sessions
  • promo_email_black_friday - 789 sessions
  • welcome_email_series - 156 sessions
  • abandoned_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 platform
  • facebook - Social platform
  • google - Search engine
  • impact - Affiliate network
  • partnersite - 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

Get Your Free Audit Report

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:

  1. utm_source = Broad platform (stable)
  2. utm_medium = Channel type (stable)
  3. 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)

  1. GA4 → Reports → Traffic Acquisition
  2. Change primary dimension to "Session source"
  3. 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)

  1. GA4 → Explore → Create Free Form
  2. Add dimension: Session source
  3. Add metric: Sessions
  4. Export to CSV
  5. 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)

  1. GA4 → Explore → Free Form
  2. Dimension: Session source
  3. Metric: Sessions
  4. Sort by Sessions (descending)
  5. 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:

  1. GA4 → Explore → Free Form
  2. Dimension: Session source
  3. Download CSV
  4. 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 TypeStandard 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:

  1. Settings → Tracking → Google Analytics
  2. Set utm_source default: mailchimp
  3. Set utm_medium default: email
  4. Leave utm_campaign variable (changes per campaign)

HubSpot:

  1. Settings → Marketing → Tracking
  2. Update default UTM parameters
  3. utm_source: hubspot
  4. utm_medium: email

Social media scheduler (Hootsuite/Buffer):

  1. Settings → Link Tracking
  2. utm_source: [platform] (use platform name token)
  3. utm_medium: social or paidsocial

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

Run Complete UTM Audit (Free Forever)

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:

  1. "Old Email (Fragmented)" → Include all old utm_source values
  2. "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.


Related: Campaign Details in Source Rule Documentation