troubleshootingUpdated 2025

Missing utm_campaign in GA4: How It Breaks Your Reports

Understanding how missing campaign parameters create (not set) entries in GA4 and fragment your attribution reporting. Complete troubleshooting guide.

8 min readtroubleshooting

You open your GA4 Traffic Acquisition report and see this:

Session campaignSessionsConversions
(not set)12,450234
summer-sale-20243,20087
email-newsletter1,89045

12,450 sessions with campaign = "(not set)". That's 68% of your traffic with no campaign attribution.

This isn't a GA4 bug. It's missing utm_campaign parameters on your traffic sources.

🚨 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 "(not set)" Campaign Means in GA4

"(not set)" appears when GA4 receives traffic without a campaign identifier.

This happens when:

  1. URL has utm_source and utm_medium but NO utm_campaign
  2. URL has no UTM parameters at all (organic, direct, referral)
  3. Auto-tagging disabled on paid platforms
  4. Campaign parameter value is blank/empty

Example URLs That Create "(not set)"

Code
❌ yoursite.com?utm_source=google&utm_medium=cpc
   (No utm_campaign parameter)

❌ yoursite.com?utm_source=facebook&utm_medium=social&utm_campaign=
   (Empty utm_campaign value)

❌ yoursite.com
   (No parameters at all - organic/direct traffic)

How This Breaks GA4 Reports

Problem 1: Cannot Differentiate Campaigns

You have 3 Facebook campaigns running:

  • Campaign A: Product Launch ($15K budget)
  • Campaign B: Retargeting ($10K budget)
  • Campaign C: Brand Awareness ($8K budget)

All use the same incomplete UTM structure:

Code
?utm_source=facebook&utm_medium=paid-social

GA4 shows:

SourceMediumCampaignSessionsRevenue
facebookpaid-social(not set)8,950$34,200

You know Facebook is working. But which campaign?

Can't tell. All three campaigns lumped together.

Result: You can't optimize. You can't scale winners. You can't kill losers.

Problem 2: Budget Allocation Paralysis

The question: "Should we increase Facebook budget?"

What you know:

  • Facebook drove 8,950 sessions
  • Generated $34,200 revenue
  • Spent $33,000 total

What you DON'T know:

  • Which campaign is profitable?
  • Which creative is working?
  • Which audience segment converts?

Decision: Can't confidently increase or decrease budget without campaign-level data.

Problem 3: False Performance Comparisons

GA4 report shows:

CampaignSessionsConversionsRevenue
(not set)12,450234$89,000
email-newsletter1,89045$18,000
summer-sale3,20087$34,000

The comparison looks like:

  • "(not set)" is your best performer
  • Email newsletter is underperforming
  • Summer sale is mediocre

Reality: "(not set)" is actually 8 different campaigns mixed together, 5 of which are unprofitable.

You're comparing apples to oranges.

😰 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

Problem 4: Broken Conversion Paths

GA4 → Advertising → Conversion paths

With proper campaign names:

Code
google/cpc/summer-sale → facebook/social/retarget → email/newsletter/weekly → Conversion

Without campaign names:

Code
google/cpc/(not set) → facebook/social/(not set) → email/(not set) → Conversion

You lose visibility into which campaign combinations drive conversions.

Problem 5: Attribution Model Failure

GA4 attribution models (Data-driven, Last click, etc.) require campaign-level data.

Without campaigns:

  • Attribution models can only credit source/medium
  • Can't see which specific campaigns assist conversions
  • Multi-touch attribution becomes single-touch
  • You lose 50-70% of attribution insight

How GA4 Handles Different Traffic Types

Google Ads with auto-tagging:

Code
URL: yoursite.com?gclid=ABC123
GA4: Campaign = "Summer Sale 2024" (from Google Ads)

Works correctly

Google Ads with manual UTMs (incomplete):

Code
URL: yoursite.com?utm_source=google&utm_medium=cpc
GA4: Campaign = (not set)

Broken tracking

Facebook Ads with UTMs:

Code
URL: yoursite.com?utm_source=facebook&utm_medium=paid-social&utm_campaign=product-launch
GA4: Campaign = "product-launch"

Works correctly

Organic Traffic (No Campaign Expected)

Organic search:

Code
URL: yoursite.com
Referrer: google.com
GA4: Source = google, Medium = organic, Campaign = (not set)

This is normal

Direct traffic:

Code
URL: yoursite.com (typed directly)
GA4: Source = (direct), Medium = (none), Campaign = (not set)

This is normal

Referral traffic:

Code
URL: yoursite.com
Referrer: partner-site.com
GA4: Source = partner-site.com, Medium = referral, Campaign = (not set)

Normal (unless you gave partners a tagged link)

Email/Social (Should Have Campaign Names)

Email campaign with UTMs:

Code
URL: yoursite.com?utm_source=mailchimp&utm_medium=email&utm_campaign=weekly-newsletter
GA4: Campaign = "weekly-newsletter"

Works correctly

Email campaign without utm_campaign:

Code
URL: yoursite.com?utm_source=mailchimp&utm_medium=email
GA4: Campaign = (not set)

Broken tracking

How to Fix "(not set)" Campaigns

Step 1: Identify Traffic Sources Missing Campaigns

Run this GA4 report:

  1. Reports → Acquisition → Traffic Acquisition
  2. Secondary dimension: Session campaign
  3. Filter: Session campaign = (not set)
  4. Sort by: Sessions (descending)

Look at Session source/medium for (not set) campaigns:

Source/MediumSessionsWhy (not set)?Fix
google/cpc4,500Manual UTMs without campaignAdd utm_campaign or use auto-tagging
facebook/paid-social3,200No campaign parameterAdd utm_campaign to ads
google/organic2,800Organic searchNormal - no action needed
(direct)/(none)1,950Direct trafficNormal - no action needed

Fix ONLY paid/campaign traffic. Organic/direct/referral showing "(not set)" is expected.

Step 2: Fix Paid Advertising Platforms

Google Ads:

Code
Option 1 (Recommended): Enable auto-tagging
Settings → Account settings → Auto-tagging: ON

Option 2: Add manual campaign parameter
Tracking template: `{"{"}{"{"}lpurl{"}"}{"}"}}`?utm_source=google&utm_medium=cpc&utm_campaign={{_campaign}}

Facebook/Instagram Ads:

Code
Ad level → Website URL:
Add utm_campaign={"{"}{"{"}campaign.name{"}"}{"}"}}

Example:
?utm_source=facebook&utm_medium=paid-social&utm_campaign={"{"}{"{"}campaign.name{"}"}{"}"}}

LinkedIn Ads:

Code
Campaign settings → Website URL:
Add utm_campaign={"{"}{"{"}campaign.name{"}"}{"}"}}

Microsoft Ads:

Code
Option 1: Enable auto-tagging (msclkid)
Option 2: Use {"{"}{"{"}CampaignName{"}"}{"}"}} ValueTrack parameter

Step 3: Fix Email Campaigns

Mailchimp:

Code
Campaign → Settings → Tracking
Enable: Google Analytics
Customize: utm_campaign=newsletter-{`{"{"}{"{"}month{"}"}{"}"}}`}-{`{"{"}{"{"}year{"}"}{"}"}}`}

HubSpot:

Code
Email editor → Settings → Tracking
Add: utm_campaign parameter
Value: email-campaign-name

All email platforms:

Manually add to all links:

Code
?utm_source=email-platform&utm_medium=email&utm_campaign=campaign-name

Step 4: Fix Social Media Posts

For every social post with a link, use:

Code
?utm_source=platform&utm_medium=organic-social&utm_campaign=post-topic

Examples:
?utm_source=linkedin&utm_medium=organic-social&utm_campaign=product-launch-announcement
?utm_source=twitter&utm_medium=organic-social&utm_campaign=blog-post-promotion
?utm_source=facebook&utm_medium=organic-social&utm_campaign=event-registration

Step 5: Verify in GA4

Test each traffic source:

  1. Click your ad/email/post
  2. Check URL has utm_campaign=something
  3. Wait 24 hours
  4. Check GA4 report
  5. Verify campaign name appears (not "(not set)")

✅ 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

Creating a Campaign Naming System

Campaign Name Components

Structure:

Code
`{"{"}{"{"}type{"}"}{"}"}}`_`{"{"}{"{"}initiative{"}"}{"}"}}`_`{"{"}{"{"}period{"}"}{"}"}}`

Examples:

Paid advertising:

  • ppc_product-launch_q4-2024
  • retarget_cart-abandoners_nov-2024
  • brand_awareness_2024-q4

Email campaigns:

  • email_weekly-newsletter_2024-w45
  • email_product-launch_nov-2024
  • email_abandoned-cart_automated

Social media:

  • social_blog-post_article-title
  • social_event-promo_webinar-nov-12
  • social_product-announcement_new-feature

Partnerships:

  • partner_companyname_q4-2024
  • affiliate_influencer-name_nov-2024

Campaign Name Rules

Do:

  • ✅ Use lowercase
  • ✅ Use hyphens for spaces
  • ✅ Include date/period
  • ✅ Be specific but concise
  • ✅ Use consistent structure

Don't:

  • ❌ Use spaces
  • ❌ Use special characters (!, @, #, etc.)
  • ❌ Use vague names ("campaign1", "test")
  • ❌ Reuse names for different campaigns
  • ❌ Use different structures across platforms

Prevention: Never Miss Campaigns Again

1. Mandatory UTM Builder

Create an internal tool that requires campaign names:

Javascript
function generateUTM() {
  const url = document.getElementById('url').value;
  const source = document.getElementById('source').value;
  const medium = document.getElementById('medium').value;
  const campaign = document.getElementById('campaign').value;
 
  // REQUIRE campaign for paid/email/social mediums
  const paidMediums = ['cpc', 'paid-social', 'email', 'paid', 'display'];
 
  if (paidMediums.includes(medium) && !campaign) {
    alert('Campaign name is REQUIRED for paid/email traffic!');
    return;
  }
 
  // Build URL
  const params = new URLSearchParams({
    utm_source: source,
    utm_medium: medium,
    utm_campaign: campaign
  });
 
  return `${"{"}{"{"}url{"}"}{"}"}}?${params.toString()}`;
}

2. Pre-Launch Checklist

Before launching ANY marketing campaign:

  • Campaign name defined?
  • utm_campaign parameter added to all links?
  • Test URL clicked and verified in browser?
  • GA4 real-time report checked?
  • Campaign name documented in tracking sheet?

3. Monthly GA4 Audit

Run this report monthly:

  1. Traffic Acquisition report
  2. Filter: Session medium contains "cpc" OR "paid" OR "email"
  3. Check: Session campaign = (not set)
  4. If any → Fix immediately

Set goal: 0% of paid/email traffic with (not set) campaign

FAQ

Why does organic search show "(not set)" for campaign?

This is normal. Organic search traffic doesn't come from campaigns, so "(not set)" is expected.

Only fix "(not set)" for:

  • Paid advertising (cpc, paid-social, display)
  • Email campaigns
  • Social media posts with links
  • Partner/affiliate traffic

Can I retroactively fix "(not set)" campaigns in GA4?

No. Historical data cannot be changed. You can only fix new traffic going forward.

Workaround: Use GA4 annotations to mark when you fixed tracking, then compare pre-fix vs post-fix periods separately.

Should I use the same campaign name across different platforms?

Yes, if it's the same campaign initiative.

Example: "product-launch-2024" used across:

  • Google Ads: utm_campaign=product-launch-2024
  • Facebook Ads: utm_campaign=product-launch-2024
  • Email: utm_campaign=product-launch-2024

Benefit: See total campaign performance across all channels.

What if my URL shortener strips utm_campaign?

Use a shortener that preserves query parameters:

  • Bitly (preserves all UTM parameters)
  • Rebrandly (preserves all parameters)
  • TinyURL (preserves parameters)

Or: Add UTMs to the SHORTENED URL instead of the destination URL.

How do I track A/B test variants within a campaign?

Use utm_content for variants:

Code
Campaign A, Variant 1:
?utm_campaign=product-launch&utm_content=variant-a

Campaign A, Variant 2:
?utm_campaign=product-launch&utm_content=variant-b

Both share the same campaign name, different content parameter.


Related: Missing Campaign (Paid Traffic) Rule 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.