troubleshootingUpdated 2025

Why utm_medium=CPC Breaks GA4 Channel Grouping (Case Matters!)

Using uppercase in utm_medium (CPC instead of cpc) causes all your paid traffic to show as Unassigned in GA4. Here's why case sensitivity matters and how to fix it.

6 min readtroubleshooting

You're running a $30,000/month Google Ads campaign. You check GA4 to see performance.

Your paid search traffic shows up as "Unassigned."

Not "Paid Search." Not even "Other." Just Unassigned. 87% of your Google Ads traffic$26,100 worthis invisible in your channel reports.

You check your tracking URLs. Everything looks perfect:

Code
utm_source=google&utm_medium=CPC&utm_campaign=spring_sale

Except... it's not perfect. That capital "CPC" instead of lowercase "cpc"? That's why your entire paid search campaign is invisible in GA4.

GA4's channel grouping is case-sensitive. And uppercase utm_medium values break everything.

🚨 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

Why Case Matters in utm_medium

GA4's Default Channel Grouping uses regex pattern matching to assign traffic to channels.

For "Paid Search" channel, GA4 looks for these exact patterns:

  • cpc (lowercase)
  • ppc (lowercase)
  • paidsearch (lowercase)

It does NOT match:

  • CPC (uppercase)
  • Cpc (title case)
  • PPC (uppercase)
  • PAIDSEARCH (all caps)

Why? Regex patterns in GA4 are case-sensitive by default. cpc CPC`.

Real Example: $142k Budget Misallocated

Company: B2B SaaS, $600k annual marketing budget

Problem discovered:

GA4 Traffic Acquisition report showed:

  • Paid Search: 1,240 sessions (2.3% of traffic)
  • Unassigned: 28,900 sessions (54% of traffic)

Leadership's interpretation: "Paid search is failing. Let's cut the budget by 70% and reallocate to content marketing."

Investigation revealed:

All paid campaigns used uppercase CPC:

Code
Google Ads: utm_medium=CPC
Microsoft Ads: utm_medium=PPC
LinkedIn Ads: utm_medium=CPC

None matched GA4's case-sensitive regex patterns.

After fixing to lowercase:

ChannelSessions (Before)Sessions (After)Budget Impact
Paid Search1,24029,800$142k/year
Unassigned28,900340-

Reality: Paid search was actually the #1 traffic driver at 55% of all sessions, with a 3.4% conversion ratebetter than any other channel.

Decision change: Instead of cutting paid search budget by 70% ($100k reduction), they increased it by 40% ($57k increase).

12-month result: Additional $340k in revenue from paid search optimization.

If they'd made the original decision: Would have killed their best-performing channel based on broken data.

😰 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

How Uppercase Breaks Each Channel

Broken:

Code
utm_medium=CPC  � Unassigned
utm_medium=PPC  � Unassigned
utm_medium=Cpc  � Unassigned
utm_medium=PAIDSEARCH � Unassigned

Fixed:

Code
utm_medium=cpc  � Paid Search 
utm_medium=ppc  � Paid Search 
utm_medium=paidsearch � Paid Search 

Email: EMAIL vs email

Broken:

Code
utm_medium=EMAIL  � Unassigned
utm_medium=Email  � Unassigned
utm_medium=E-MAIL � Unassigned

Fixed:

Code
utm_medium=email  � Email 
utm_medium=e-mail � Email 

Social: SOCIAL vs social

Broken:

Code
utm_medium=SOCIAL  � Unassigned
utm_medium=Social  � Unassigned

Fixed:

Code
utm_medium=social  � Organic Social 
utm_medium=paidsocial � Paid Social 

Display: DISPLAY vs display

Broken:

Code
utm_medium=DISPLAY  � Unassigned
utm_medium=Display  � Unassigned
utm_medium=BANNER   � Unassigned

Fixed:

Code
utm_medium=display  � Display 
utm_medium=banner   � Display 
utm_medium=cpm      � Display 

Common Sources of Uppercase UTM Parameters

1. Manual URL Building

How it happens:

  • Marketer types: ?utm_source=Google&utm_medium=CPC
  • Looks professional with capitals
  • Doesn't realize GA4 is case-sensitive

Prevention:

  • Document: "ALWAYS lowercase for utm_medium"
  • Use URL builder with lowercase enforcement
  • Add validation before campaign launch

2. Email Platform Auto-Capitalization

How it happens:

  • Some email platforms (Mailchimp, HubSpot) auto-capitalize first letter
  • Default template: utm_medium=Email
  • Every email campaign launches with title case

Prevention:

  • Override platform defaults
  • Set custom UTM template with lowercase values
  • Test before sending to full list

3. CRM/Marketing Automation Presets

How it happens:

  • Salesforce template: utm_medium=CPC
  • Marketo preset: utm_medium=Email
  • Someone created template months/years ago, everyone uses it

Prevention:

  • Audit all CRM/automation templates
  • Update to lowercase
  • Lock templates to prevent editing

4. Google Sheets Formulas

How it happens:

Code
=UPPER(B2)  // Converts "cpc" to "CPC"
  • Formula applied to utm_medium column
  • Uppercase values copied into campaigns

Prevention:

Code
=LOWER(B2)  // Ensures lowercase

5. Developer Hard-Coded Values

How it happens:

Javascript
// Developer hard-codes in all caps
const utmMedium = "CPC";

Prevention:

Javascript
const utmMedium = "cpc"; // Always lowercase
// Or force lowercase:
const utmMedium = "CPC".toLowerCase();

The 2-Minute Fix

Step 1: Find All Uppercase utm_medium Values (1 min)

GA4 � Explore � Free Form

  • Dimension: Session medium
  • Metrics: Sessions
  • Filter: Session default channel group = "Unassigned"

Look for uppercase values:

  • CPC, PPC, EMAIL, SOCIAL, DISPLAY, REFERRAL

Step 2: Update Active Campaigns (30 seconds per platform)

Google Ads:

  1. Campaigns � Settings � Campaign URL options
  2. Update: utm_medium=CPCutm_medium=cpc
  3. Save (ads may require re-approval)

Facebook Ads:

  1. Ad Manager � URL Parameters
  2. Change template to lowercase
  3. Apply to all active campaigns

Email Platform:

  1. Templates � Edit master template
  2. Find: utm_medium=Email
  3. Replace: utm_medium=email

Step 3: Fix URL Builder Templates (30 seconds)

Update your team's UTM builder to auto-lowercase:

Google Sheets formula:

Code
=LOWER(B2)  // Apply to utm_medium column

Or use dropdown with lowercase options only:

  • cpc
  • email
  • social
  • display
  • affiliate
  • referral

Prevention: Never Uppercase Again

Rule 1: Always Lowercase for utm_medium

Correct:

Code
utm_medium=cpc
utm_medium=email
utm_medium=social
utm_medium=display

Wrong:

Code
utm_medium=CPC
utm_medium=Email
utm_medium=SOCIAL

Rule 2: Use Validation Before Launch

Pre-launch checklist:

Javascript
// Validate utm_medium is lowercase
function validateUTM(url) {
  const medium = new URLSearchParams(url).get('utm_medium');
  if (medium && medium !== medium.toLowerCase()) {
    alert('Error: utm_medium must be lowercase');
    return false;
  }
  return true;
}

Rule 3: Lock URL Builder to Lowercase

Google Sheets data validation:

  1. Select utm_medium column
  2. Data � Data validation
  3. List of items: cpc,email,social,display,affiliate,referral
  4. Reject input if not in list

Rule 4: Quarterly Case Audit

Every 3 months:

  1. Export GA4 session medium values
  2. Check for uppercase/mixed case
  3. Fix active campaigns
  4. Update team docs

✅ 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

FAQ

Does case matter for utm_source and utm_campaign too?

Technically, yesbut with different impact:

  • utm_medium: Case breaks channel grouping (critical problem)
  • utm_source: Case creates duplicate rows (google vs Google appear as 2 separate sources)
  • utm_campaign: Case creates duplicate rows (spring_sale vs Spring_Sale appear as 2 campaigns)

Best practice: Lowercase ALL UTM parameters for consistency.

Will fixing case affect historical data?

No. Historical data remains labeled "Unassigned." The fix only applies to new traffic. This is why catching case issues early is critical.

Can I create custom channel groups to fix this?

Yes, but it's a workaround, not a solution:

  1. GA4 � Admin � Data display � Channel groups
  2. Create custom group that matches uppercase patterns
  3. BUT: Only applies to your view, doesn't help team members, and doesn't sync across properties

Better: Just use lowercase from the start.

What if my ad platform automatically capitalizes?

Override platform defaults:

  • Google Ads: Use tracking template with lowercase values
  • Facebook: Edit URL parameters template
  • LinkedIn: Manual URL with lowercase

Most platforms respect whatever you inputdouble-check campaign settings.

Does this apply to utm_term and utm_content?

No. utm_term and utm_content don't affect channel grouping, so case doesn't break attribution.

However: Inconsistent case creates data fragmentation (Spring vs spring appear as different values).

Best practice: Still use lowercase for clean reporting.

How do I bulk-fix existing campaigns?

Platform-specific:

Google Ads:

  1. Google Ads Editor � Download campaigns
  2. Find/Replace: utm_medium=CPCutm_medium=cpc
  3. Upload changes

Facebook Ads:

  1. Ads Manager � Bulk edit
  2. Select all active campaigns
  3. Edit URL parameters
  4. Save

Email Platform:

  1. Update master templates
  2. Clone existing campaigns with new templates
  3. Deprecate old campaigns

Warning: Pause/edit active campaigns carefullymay affect ad approval/delivery.

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.