GA4 Reporting is Case-Sensitive: How It Affects Your Data
"Why do I have three rows for Facebook?"
You're looking at GA4's Traffic Acquisition report:
- facebook: 12,400 sessions
- Facebook: 8,900 sessions
- FACEBOOK: 3,200 sessions
Same platform. Three rows. Because GA4 is case-sensitive.
This isn't a bug. It's how GA4 processes data—and understanding it is critical to maintaining clean analytics.
🚨 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
How GA4 Processes Case
GA4 stores UTM parameters exactly as received.
If your URL says utm_source=Facebook, GA4 stores "Facebook" (capital F).
If another URL says utm_source=facebook, GA4 stores "facebook" (lowercase f).
When reporting:
- "Facebook" and "facebook" are treated as two distinct values
- Each gets its own row
- Sessions are NOT automatically combined
Why? Database systems (like GA4's BigQuery backend) are case-sensitive by default for string comparisons.
Impact on Different Report Types
Traffic Acquisition Reports
Affected dimensions:
- Session source
- Session medium
- Session campaign
- First user source
- First user medium
Example fragmentation:
| Dimension | Value Variations | Rows Created |
|---|---|---|
| Session source | google, Google, GOOGLE | 3 rows |
| Session campaign | spring_sale, Spring_Sale, SPRING_SALE | 3 rows |
| Session medium | email, Email, EMAIL | 3 rows |
Total rows: 3 × 3 × 3 = 27 combinations for ONE campaign
Exploration Reports
Same issue in custom explorations:
- Free form reports
- Funnel analysis
- Path analysis
- Segment overlap
All treat case-sensitive values as distinct.
Conversion Reports
Attribution affected:
- First touch: May credit wrong case variation
- Last touch: May credit wrong case variation
- Data-driven: Model fragments across case variations
😰 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
utm_medium vs Other Parameters
Critical: utm_medium (affects channel grouping)
Impact: Uppercase breaks channel assignment
utm_medium=cpc → Paid Search ✅
utm_medium=CPC → Unassigned ❌
Result: Traffic invisible in channel reports
Annoying: utm_source, utm_campaign, etc.
Impact: Data fragmentation only
utm_source=google → Row 1 ✅
utm_source=Google → Row 2 (separate row)
Result: Traffic visible, but split across multiple rows
Priority:
- Fix utm_medium first (critical—breaks attribution)
- Fix utm_source/campaign next (important—fragments data)
- Fix utm_content/term last (nice to have—cleaner reporting)
Real Example: 47% Data Fragmentation
Company: SaaS with 50,000 monthly sessions
Export showed:
- 89 unique utm_source values
- 127 unique utm_campaign values
Investigation revealed:
- Actual sources: 23 platforms
- Actual campaigns: 31 campaigns
- Fragmentation: 47% of rows were duplicates due to case variations
Examples found:
| Parameter | Variations | Actual Count | Fragmented Count |
|---|---|---|---|
| utm_source | google, Google, GOOGLE, google_ads | 1 | 4 |
| utm_campaign | spring_sale, Spring_Sale, SPRING_SALE | 1 | 3 |
| utm_content | video, Video, VIDEO, video_ad, Video_Ad | 2 | 5 |
Impact:
- Leadership thought we ran 127 campaigns (actually 31)
- Couldn't quickly identify top sources
- Pivot tables unreadable (too many rows)
After lowercase standardization:
- 89 sources → 23 sources (74% reduction)
- 127 campaigns → 31 campaigns (76% reduction)
- Reports instantly usable
How to Work with Case-Sensitive Data
Short-term: Manual Consolidation
Google Sheets:
- Export GA4 data
- Add "Clean" column:
=LOWER(A2) - Pivot on clean column
- See consolidated totals
Medium-term: Looker Studio Calculated Fields
Create reusable fields:
Clean Source: LOWER(Session source)
Clean Campaign: LOWER(Session campaign)
Clean Medium: LOWER(Session medium)
Use in all charts/tables instead of raw dimensions.
Long-term: Fix at Source
Standardize all UTM parameters to lowercase:
- Update URL builders
- Fix campaign templates
- Enforce with validation
- Quarterly audits
Prevention Strategies
1. Enforce Lowercase in URL Builder
Google Sheets formula:
=LOWER(TRIM(A2)) // Lowercase + remove extra spaces
2. Pre-Launch Validation
Before campaign launch:
- All UTM parameters lowercase
- No spaces or special characters
- Test URL in GA4 Realtime
- Verify single row created (not duplicates)
3. Team Training
One-page guide:
GA4 IS CASE-SENSITIVE
✅ DO:
- Use lowercase for all UTM parameters
- utm_source=facebook (lowercase)
- utm_campaign=spring_sale (lowercase)
❌ DON'T:
- utm_source=Facebook (title case)
- utm_campaign=Spring_Sale (mixed case)
- utm_source=FACEBOOK (all caps)
Remember: "facebook" ≠ "Facebook" ≠ "FACEBOOK"
Each creates a separate row in GA4.
✅ 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
Can GA4 auto-consolidate case variations?
No. GA4 stores and reports data exactly as received. There's no built-in case normalization. You must consolidate manually in exports or use calculated fields in Looker Studio.
Why doesn't GA4 just ignore case?
Technical reasons:
- BigQuery (GA4's backend) is case-sensitive by default
- Changing would require processing overhead
- Could cause unintended side effects
Standardization reasons:
- Google wants consistent UTM practices across properties
- Forces marketers to follow conventions
- Documented standards (lowercase) have existed for years
Does this affect BigQuery exports?
Yes. If you export GA4 data to BigQuery, case sensitivity persists:
-- These return different results:
WHERE utm_source = 'google' -- Matches only lowercase
WHERE utm_source = 'Google' -- Matches only title case
WHERE LOWER(utm_source) = 'google' -- Matches all variationsAlways use LOWER() function for case-insensitive queries.
Can I create custom dimensions that auto-lowercase?
Not directly in GA4, but yes in Looker Studio:
- Create calculated field
- Formula:
LOWER(Session source) - Use this dimension in all reports
- Auto-consolidates regardless of source case
What about non-English characters (é, ñ, ü)?
GA4 supports UTF-8:
- Non-English characters work fine
- Still case-sensitive:
café≠Café - Best practice: Use English alphanumeric + underscores only
- Avoid accents/special characters for consistency
Will this ever change?
Unlikely. Case sensitivity is fundamental to how databases work. Google would need to:
- Rebuild GA4's data processing
- Risk breaking existing implementations
- Process billions of events differently
More likely: Google continues documenting lowercase standards and expects marketers to follow them.