attribution-errorsUpdated 2025

utm_source Without utm_medium: Why Your Campaigns Disappear

Added utm_source but campaign traffic shows as (direct)? utm_medium is required—here's how GA4's attribution hierarchy actually works.

7 min readattribution-errors

Your URL looks perfect:

Code
https://store.com/sale?utm_source=instagram&utm_campaign=summer-promo

You posted it across all your social channels.

GA4 shows 2,847 sessions as "(direct) / (none)".

Zero sessions attributed to Instagram.

Your $8,000 influencer campaign just became invisible.

What went wrong? You're missing one word: utm_medium

Without it, GA4 ignores your utm_source completely and defaults to "(direct)" traffic.

Here's why this happens and how to fix it in under 90 seconds.

🚨 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

GA4's Attribution Hierarchy (The Rule Book)

GA4 doesn't randomly assign traffic. It follows a strict order:

1. Platform click IDs (highest priority)

  • gclid (Google Ads)
  • fbclid (Facebook/Instagram Ads)
  • ttclid (TikTok Ads)
  • etc.

2. Manual UTM parameters

  • Requires BOTH utm_source AND utm_medium
  • Missing either? GA4 skips to step 3

3. HTTP referrer

  • Where the user came from (if available)
  • Email has no referrer, so defaults to step 4

4. Direct traffic (last resort)

  • "(direct) / (none)"
  • Where unattributed traffic goes to die

When you only add utm_source:

  • Step 1: No click ID present → Skip to step 2
  • Step 2: utm_source found but utm_medium missing → Can't use, skip to step 3
  • Step 3: Check referrer → Email/direct link has no referrer → Skip to step 4
  • Step 4: Classify as "(direct) / (none)"

Your utm_source is there. GA4 just can't use it without utm_medium.

Why utm_medium is Required (Not Optional)

GA4 uses utm_medium to determine channel grouping.

Channel grouping = how GA4 categorizes traffic into buckets:

  • Organic Search
  • Paid Search
  • Organic Social
  • Paid Social
  • Email
  • Referral
  • Direct

utm_source alone is ambiguous:

Example 1: utm_source=google

  • Is this organic search?
  • Is this a Google Ad?
  • Is this a Google Display ad?
  • Is this Google Discover?

utm_medium adds context:

  • utm_source=google&utm_medium=organic → Organic Search
  • utm_source=google&utm_medium=cpc → Paid Search
  • utm_source=google&utm_medium=display → Display

Example 2: utm_source=facebook

  • Organic post on your page?
  • Shared link in a group?
  • Paid ad?
  • Influencer post?

utm_medium clarifies:

  • utm_source=facebook&utm_medium=social → Organic Social
  • utm_source=facebook&utm_medium=cpc → Paid Social
  • utm_source=facebook&utm_medium=referral → Shared link

Without utm_medium, GA4 can't determine which channel group to use.

So it doesn't use utm_source at all.

😰 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: $18,000 LinkedIn Campaign Vanished

Client: B2B software company Campaign: Sponsored content on LinkedIn Budget: $12,000 ad spend + $6,000 content creation

LinkedIn campaign URLs:

Code
https://software.com/demo?utm_source=linkedin&utm_campaign=lead-gen-q2

What they expected:

  • Source: linkedin
  • Medium: (auto-detected as paid)
  • Sessions: ~1,200
  • Leads: ~60 (expected 5% conversion)

What GA4 showed:

  • Source / Medium: "(direct) / (none)"
  • Sessions from LinkedIn: 0
  • Actual sessions in Direct: 1,247
  • Leads attributed to Direct: 63

What the CEO said: "Our direct traffic is converting at 5%! Let's double down on brand awareness. And pause LinkedIn—it's generating nothing."

What was actually happening:

  • All 1,247 sessions WERE from LinkedIn
  • Missing utm_medium caused them to show as Direct
  • CEO about to kill the only lead gen channel that worked
  • About to increase "brand awareness" spend on a channel that was already LinkedIn

The fix:

  1. Added utm_medium=paid-social to all LinkedIn campaign URLs
  2. Next week's data showed LinkedIn correctly
  3. Reallocated budget back to LinkedIn
  4. Generated 240 leads over next 3 months (original plan was to pause)

Revenue saved by fixing one missing parameter: $180,000 in closed deals.

How to Identify Missing utm_medium

Test 1: URL Inspection (10 seconds)

Look at your campaign URLs. Check the pattern:

❌ Missing utm_medium:

Code
?utm_source=newsletter
?utm_source=twitter&utm_campaign=launch
?utm_source=partner-blog&utm_campaign=guest-post&utm_content=header-link

✅ Complete:

Code
?utm_source=newsletter&utm_medium=email
?utm_source=twitter&utm_medium=social&utm_campaign=launch
?utm_source=partner-blog&utm_medium=referral&utm_campaign=guest-post

Test 2: GA4 Source/Medium Report (2 minutes)

  1. GA4 → Reports → Traffic Acquisition
  2. Look at "Session source / medium" column
  3. Find patterns like: {"{"}{"{"}source{"}"}{"}"}} / (none)

Examples of broken tracking:

  • newsletter / (none)
  • instagram / (none)
  • partner-site / (none)

These should never exist. Every source needs a medium.

Test 3: Direct Traffic Investigation (3 minutes)

If your direct traffic is suspiciously high:

  1. GA4 → Reports → Traffic Acquisition
  2. Click on "(direct) / (none)"
  3. Add secondary dimension: "Landing page"
  4. Look for landing pages that indicate traffic source

Red flags:

  • Landing pages: /email-exclusive-offer
  • Landing pages: /instagram-bio-link
  • Landing pages: /partner-promo

If these show as Direct, you have missing utm_medium on those campaigns.

Test 4: Realtime Check (30 seconds)

  1. Create test URL: yoursite.com?utm_source=test-source
  2. Open in incognito browser
  3. GA4 → Realtime report
  4. Check how traffic is classified

If it shows "(direct)" → Confirmed missing utm_medium issue.

The 90-Second Fix

Step 1: Identify Your Channel Type

Determine what type of traffic source you're tracking:

Traffic TypeUse this utm_medium
Email newslettersemail
Organic social postssocial
Paid social adspaid-social or cpc
Partner/blog linksreferral
Display advertisingdisplay
Affiliate linksaffiliate
Paid search adscpc or ppc
SMS messagessms

Step 2: Add utm_medium to Your URL

Before (broken):

Code
https://yoursite.com/page?utm_source=newsletter&utm_campaign=spring-sale

After (fixed):

Code
https://yoursite.com/page?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale

Step 3: Update Active Campaigns

For email platforms:

  1. Go to default UTM settings
  2. Add: utm_medium=email
  3. Apply to all email templates
  4. Re-send test email to verify

For social media schedulers:

  1. Update UTM templates
  2. Add: utm_medium=social (organic) or utm_medium=paid-social (ads)
  3. Test with next scheduled post

For partner links:

  1. Create standardized partner link template
  2. Include: utm_source={partner-name}&utm_medium=referral
  3. Send updated links to all partners

Step 4: Test Before Launch

Before sending any campaign:

  1. Copy final URL
  2. Open in incognito browser
  3. Wait 30 seconds
  4. Check GA4 → Realtime
  5. Verify traffic shows correct source/medium (NOT direct)

Common utm_medium Values (GA4 Standards)

Use these standard values for proper channel grouping:

Paid channels:

  • cpc - Cost-per-click (Google Ads, Bing Ads)
  • ppc - Pay-per-click (alternative to cpc)
  • paid-social - Paid social media ads
  • paidsocial - Alternative format
  • display - Display advertising
  • paid-search - Paid search marketing

Organic channels:

  • organic - Organic search traffic
  • social - Organic social media
  • email - Email marketing
  • referral - Partner/blog links
  • affiliate - Affiliate marketing

Other:

  • sms - SMS marketing
  • push - Push notifications
  • qr - QR code scans

Avoid ambiguous values:

  • campaign (too generic)
  • website (meaningless)
  • link (doesn't specify channel)
  • promo (doesn't indicate source type)

✅ 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

What About utm_campaign?

utm_campaign is optional for attribution but recommended for analysis.

GA4 can correctly attribute with just source + medium:

Code
?utm_source=newsletter&utm_medium=email

Traffic will show as: newsletter / email

However, you can't:

  • Separate different email sends
  • Track A/B test variants
  • Report per-campaign ROI
  • Analyze seasonal performance

Recommended: Always include campaign for better reporting:

Code
?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale-2024

FAQ

Why does GA4 require both parameters when Universal Analytics didn't?

Universal Analytics was more lenient and would use utm_source alone. GA4's channel grouping logic is stricter and requires both for accurate classification.

Can I use custom utm_medium values?

Yes, but traffic may not map to GA4's default channel groups. Custom values work for tracking but won't appear in standard "Organic Social" or "Paid Search" reports.

What if I use platform auto-tagging (gclid, fbclid)?

Auto-tagging takes priority over UTM parameters. You don't need utm_medium when gclid or fbclid is present. In fact, you shouldn't add manual UTMs with auto-tagging.

Will fixing this restore historical lost traffic?

No. Historical "(direct)" traffic stays as direct. The fix only works for new sessions going forward. Consider adding a GA4 annotation marking when you fixed the issue.

What if traffic still shows as direct after adding utm_medium?

Check for these issues:

  1. JavaScript redirect stripping parameters
  2. HTTPS→HTTP redirect losing parameters
  3. Parameter encoding issues (spaces, special characters)
  4. Fragment before query string (#section?utm_source=...)

Is there a tool to validate UTM parameters before launching?

Yes. Use a UTM builder with validation (like Campaign URL Builder with required fields) or test every URL in GA4 Realtime before launching campaigns.

Prevention Checklist

✅ Setup (one-time):

  • Document rule: "utm_source without utm_medium = broken tracking"
  • Update all UTM templates to require both parameters
  • Configure email platform defaults (utm_medium=email)
  • Configure social platform defaults (utm_medium=social or paid-social)
  • Train team on utm_source + utm_medium requirement

✅ Before Every Campaign:

  • Check URL has utm_source
  • Check URL has utm_medium
  • Values use standard GA4 channel grouping terms
  • Test URL in incognito browser
  • Verify in GA4 Realtime (shows correct source/medium)

✅ Weekly Monitoring:

  • GA4 → Traffic Acquisition report
  • Check for {"{"}{"{"}source{"}"}{"}"}} / (none) patterns
  • Investigate any new orphaned parameters
  • Fix URLs and re-send campaigns if needed

Conclusion

Campaign traffic showing as "(direct)"? You're missing utm_medium.

The fix:

  1. Add utm_medium to every URL with utm_source
  2. Use standard values: email, social, cpc, referral, display
  3. Test in GA4 Realtime before launching
  4. Update templates to require both parameters

utm_source alone is worthless in GA4. You must include utm_medium.

This 90-second fix makes your campaigns visible again and ensures accurate attribution.


Related: Understanding GA4 Attribution Hierarchy Documentation

UTM

Get Your Free Audit in 60 Seconds

Connect GA4, run the scan, and see exactly where tracking is leaking budget. No credit card required.

Trusted by growth teams and agencies to keep attribution clean.