UTM Medium Case Sensitivity: Why cpc ≠ CPC in GA4
GA4 treats cpc and CPC as completely different values. Learn why case sensitivity matters for utm_medium and how it affects channel grouping.
cpc is not the same as CPC.
In GA4, they're two completely different values. One gets assigned to "Paid Search." The other becomes "Unassigned."
This isn't a bug. It's how GA4's channel grouping regex works—and understanding it is critical to avoiding broken attribution.
Table of contents
- Why GA4 is Case-Sensitive
- Real-World Impact
- Case Sensitivity Across All Mediums
- Social
- Display
- Why This Matters More Than Source/Campaign
- How to Check for Case Issues
- GA4 Method
- RegEx Test
- Prevention Strategies
- 1. Force Lowercase in URL Builder
- 2. Dropdown Validation
- 3. JavaScript Validation
- 4. Pre-Launch Checklist
- FAQ
- Why doesn't GA4 just ignore case?
- Do other analytics tools have the same issue?
- What about utmsource and utmcampaign—are they case-sensitive?
- Can I fix this with a custom channel group?
- Does this apply to utmcontent and utmterm?
- How do I train my team on case sensitivity?
🚨 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 GA4 is Case-Sensitive
GA4 uses regex (regular expressions) to match utm_medium values to channels.
The regex pattern for Paid Search is:
^(cpc|ppc|paidsearch).*$Translation: Must start with exactly "cpc" OR "ppc" OR "paidsearch" (all lowercase).
Matches:
cpc→ Paid Search ✅cpcgoogle→ Paid Search ✅ (starts with cpc)ppc→ Paid Search ✅
Does NOT match:
CPC→ Unassigned ❌ (uppercase C, P, C)Cpc→ Unassigned ❌ (uppercase C)cPc→ Unassigned ❌ (uppercase P)
Why? Regex is case-sensitive by default. cpc ≠ CPC ≠ Cpc.
Real-World Impact
Campaign: Google Ads with $15,000/month budget
URLs used:
Ads set 1: ?utm_medium=cpc (lowercase)
Ads set 2: ?utm_medium=CPC (uppercase)
GA4 shows:
- Paid Search: 4,200 sessions (ads set 1 only)
- Unassigned: 8,900 sessions (ads set 2)
Analysis problem:
- Can't see total Google Ads performance (split across two "channels")
- ROI calculation impossible (half the data invisible)
- Budget decisions based on incomplete data
Solution: Change all to lowercase cpc.
Result: All 13,100 sessions correctly assigned to Paid Search.
Case Sensitivity Across All Mediums
Pattern: ^(email|e-mail|e_mail|e mail)$
Matches:
email✅e-mail✅
Does NOT match:
EMAIL❌Email❌E-Mail❌
Social
Pattern: Contains social|social-network|social-media|sm
Matches:
social✅paidsocial✅social-network✅
Does NOT match:
SOCIAL❌Social❌PaidSocial❌
Display
Pattern: ^(display|cpm|banner).*$
Matches:
display✅cpm✅banner✅
Does NOT match:
DISPLAY❌Display❌CPM❌
Why This Matters More Than Source/Campaign
utm_medium affects channel grouping.
If medium is wrong:
- Traffic goes to "Unassigned" (invisible in standard reports)
- Channel-level analysis broken
- ROI calculations impossible
- Budget allocation decisions based on bad data
utm_source and utm_campaign don't affect channel grouping.
If source/campaign have case issues:
- Data fragmented (google vs Google appear as 2 rows)
- Annoying, but traffic still assigned to correct channel
- Can filter/aggregate in reports
Priority for case sensitivity:
- utm_medium (critical—affects channel assignment)
- utm_source (important—affects data consolidation)
- utm_campaign (good practice—avoids fragmentation)
😰 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
How to Check for Case Issues
GA4 Method
Explore → Free Form:
- Dimension: Session medium
- Dimension: Session default channel group
- Filter: Channel = "Unassigned"
Look for uppercase or mixed-case values:
- CPC, Cpc
- EMAIL, Email
- SOCIAL, Social
- DISPLAY, Display
RegEx Test
Test your utm_medium value:
const medium = "CPC"; // Your utm_medium value
const pattern = /^(cpc|ppc|paidsearch).*$/;
if (pattern.test(medium)) {
console.log("✅ Matches Paid Search");
} else {
console.log("❌ Will be Unassigned");
}Result for "CPC": ❌ Will be Unassigned Result for "cpc": ✅ Matches Paid Search
Prevention Strategies
1. Force Lowercase in URL Builder
Google Sheets:
=LOWER(B2) // Converts any input to lowercase
2. Dropdown Validation
Only allow lowercase options:
cpc
email
social
display
affiliate
referral
3. JavaScript Validation
function validateMedium(medium) {
if (medium !== medium.toLowerCase()) {
alert("utm_medium must be lowercase");
return false;
}
return true;
}4. Pre-Launch Checklist
- utm_medium is all lowercase
- Tested in GA4 Realtime
- Traffic assigned to correct channel
✅ 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
FAQ
Why doesn't GA4 just ignore case?
GA4 could use case-insensitive regex, but doesn't for consistency and standardization across properties. Google expects marketers to follow documented conventions.
Do other analytics tools have the same issue?
Most analytics platforms are case-sensitive for UTM parameters. Adobe Analytics, Matomo, and others typically treat "cpc" and "CPC" as different values.
What about utm_source and utm_campaign—are they case-sensitive?
Yes, but impact is different:
- utm_medium: Case affects channel grouping (critical)
- utm_source/campaign: Case creates duplicate rows (annoying but not critical)
Best practice: Lowercase everything.
Can I fix this with a custom channel group?
Yes, you can create a custom channel group with case-insensitive patterns like [Cc][Pp][Cc] to match both cpc and CPC. But it's simpler to just use lowercase.
Does this apply to utm_content and utm_term?
No. utm_content and utm_term don't affect channel grouping, so case doesn't break attribution. However, inconsistent case still creates data fragmentation.
How do I train my team on case sensitivity?
Create a one-page UTM guide showing:
- ✅ Correct: cpc, email, social (lowercase)
- ❌ Wrong: CPC, Email, Social (uppercase)
- Share with everyone who creates campaign links