GA4 Reporting is Case-Sensitive: How It Affects Your Data

UTMGuard Team
6 min readtechnical-guides

"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:

DimensionValue VariationsRows Created
Session sourcegoogle, Google, GOOGLE3 rows
Session campaignspring_sale, Spring_Sale, SPRING_SALE3 rows
Session mediumemail, Email, EMAIL3 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

Get Your Free Audit Report

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:

  1. Fix utm_medium first (critical—breaks attribution)
  2. Fix utm_source/campaign next (important—fragments data)
  3. 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:

ParameterVariationsActual CountFragmented Count
utm_sourcegoogle, Google, GOOGLE, google_ads14
utm_campaignspring_sale, Spring_Sale, SPRING_SALE13
utm_contentvideo, Video, VIDEO, video_ad, Video_Ad25

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:

  1. Export GA4 data
  2. Add "Clean" column: =LOWER(A2)
  3. Pivot on clean column
  4. 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

Run Complete UTM Audit (Free Forever)

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 variations

Always use LOWER() function for case-insensitive queries.

Can I create custom dimensions that auto-lowercase?

Not directly in GA4, but yes in Looker Studio:

  1. Create calculated field
  2. Formula: LOWER(Session source)
  3. Use this dimension in all reports
  4. 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.