What This Rule Detects
GA4 is case-sensitive for utm_source and utm_campaign values. When these parameters use inconsistent capitalization (Google vs google, Facebook vs facebook vs FACEBOOK), GA4 treats each variation as a completely different source or campaign. This fragments your data across multiple rows in reports instead of consolidating into one unified view.
🔍 Want to scan for this issue automatically?
UTMGuard checks for this and 39 other validation rules in 60 seconds.
Try Free AuditWhy It Matters
Business Impact:
- Data fragmentation - 1000 sessions from "Facebook" + 500 from "facebook" = 2 separate rows (should be 1)
- Performance analysis broken - Cannot see total campaign performance when split across variants
- ROI calculation impossible - Campaign spend comparison fails with fragmented data
- Report clutter - Dozens of duplicate entries for same source/campaign
Technical Impact:
- GA4 stores "Google", "google", and "GOOGLE" as three different sources
- Same campaign appears multiple times with different capitalization
- Filters require complex regex patterns to match all case variants
- Cannot aggregate data without custom grouping or post-processing
Real Example:
- Facebook campaign tracked with inconsistent casing:
- "Facebook" (from desktop ads): 5,000 sessions
- "facebook" (from mobile ads): 3,000 sessions
- "FACEBOOK" (from legacy campaign): 2,000 sessions
- Problem: GA4 shows 3 separate sources with 10,000 total sessions
- Should be: 1 source "facebook" with 10,000 sessions
- Impact: Cannot answer "How does Facebook perform overall?" without manual calculation
Common Scenarios
Scenario 1: Mixed Case in utm_source
Team members using different capitalization conventions:
Scenario 2: Title Case in utm_campaign
Marketing campaigns using title case formatting:
Scenario 3: Platform Auto-Capitalization
Ad platforms auto-capitalizing parameter values:
😰 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 Fix
Step 1: Establish Lowercase Naming Convention
Best Practice: Always Use Lowercase
utm_source examples:
❌ WRONG: Google, Facebook, Newsletter, LinkedIn, Twitter
✅ CORRECT: google, facebook, newsletter, linkedin, twitter
utm_campaign examples:
❌ WRONG: Spring_Sale, Summer_Promo, Black_Friday, Product_Launch
✅ CORRECT: spring_sale, summer_promo, black_friday, product_launch
utm_content examples:
❌ WRONG: Blue_Banner, Hero_Image, Sidebar_CTA
✅ CORRECT: blue_banner, hero_image, sidebar_cta
Why lowercase:
- Eliminates case-sensitivity issues entirely
- Easier to type and remember
- Industry standard convention
- Google Campaign URL Builder defaults to lowercase
- Reduces human error
Step 2: Audit Current Campaign URLs
Find all case variants:
-
GA4 Reports:
- Go to Reports → Acquisition → Traffic acquisition
- Look at "Session source/medium" dimension
- Identify duplicate entries: Facebook vs facebook, Google vs google
-
Common case variants to check:
Source variants: - Facebook, facebook, FACEBOOK - Google, google, GOOGLE - Newsletter, newsletter, NEWSLETTER - LinkedIn, linkedin, LINKEDIN, Linkedin Campaign variants: - Spring_Sale, spring_sale, SPRING_SALE - Summer-Promo, summer-promo, SUMMER-PROMO -
Document all variants found - Create list of sources/campaigns with case issues
Step 3: Update Active Campaigns
Google Ads:
- Campaigns → Settings → Tracking template
- Change:
utm_source=Google&utm_campaign=Spring_Sale - To:
utm_source=google&utm_campaign=spring_sale - Apply to all ad groups and campaigns
Facebook Ads:
- Ads Manager → Ad Set → URL Parameters
- Change:
utm_source=Facebook&utm_campaign=Product_Launch - To:
utm_source=facebook&utm_campaign=product_launch - Update all ad sets
Email Marketing:
- Platform settings → URL builder / Link tracking
- Change:
utm_source=Newsletter&utm_campaign=Weekly_Update - To:
utm_source=newsletter&utm_campaign=weekly_update - Update templates for future campaigns
Social Media Scheduling Tools:
- Access UTM template settings
- Change:
utm_source=Twitter&utm_campaign=Engagement - To:
utm_source=twitter&utm_campaign=engagement - Save as default
Step 4: Implement Validation in URL Generation
JavaScript URL Builder:
function buildCampaignUrl(params) {
// Force all UTM parameters to lowercase
const cleanParams = {
utm_source: params.utm_source?.toLowerCase(),
utm_medium: params.utm_medium?.toLowerCase(),
utm_campaign: params.utm_campaign?.toLowerCase(),
utm_content: params.utm_content?.toLowerCase(),
utm_term: params.utm_term?.toLowerCase()
};
return constructUrl(cleanParams);
}Spreadsheet Formula:
=LOWER(A2) // Where A2 contains UTM value
Team Process:
- Document requirement: All UTM parameters must be lowercase
- Add validation to URL generation scripts/tools
- Use Google Campaign URL Builder (auto-lowercases)
- QA checklist: Verify lowercase before campaign launch
Step 5: Create Team Style Guide
UTM Naming Convention Document:
# UTM Parameter Style Guide
## Case Sensitivity Rule
ALL UTM parameters MUST use lowercase letters only.
## Format Rules
- Use lowercase letters: a-z
- Use hyphens for word separation: spring-sale (not Spring_Sale)
- Use underscores only if platform requires: spring_sale
- Never use spaces (use hyphens or underscores)
- No special characters except - and _
## Examples
✅ CORRECT:
utm_source=facebook
utm_campaign=spring-sale-2024
utm_content=hero-banner
❌ WRONG:
utm_source=Facebook (title case)
utm_campaign=Spring-Sale-2024 (title case)
utm_content=Hero_Banner (title case)
## Platform-Specific Sources
- Google: utm_source=google (never Google, GOOGLE)
- Facebook: utm_source=facebook (never Facebook, FACEBOOK)
- Email: utm_source=newsletter or utm_source=mailchimp
- LinkedIn: utm_source=linkedin (never LinkedIn, LINKEDIN)
- Twitter: utm_source=twitter (never Twitter, TWITTER)Step 6: Monitor and Enforce Consistency
Weekly Checks:
- GA4 → Traffic acquisition report
- Look for new case variants appearing
- Identify team member/campaign creating variants
- Provide feedback and retraining
Automated Alerts:
- Set up GA4 Custom Alert for new source/medium combinations
- Review weekly to catch case variants early
- Fix immediately before data fragments further
Examples
❌ Incorrect Examples
Campaign 1: ?utm_source=Facebook&utm_campaign=Spring_Sale
Campaign 2: ?utm_source=facebook&utm_campaign=spring_sale
Campaign 3: ?utm_source=FACEBOOK&utm_campaign=SPRING_SALE
Result in GA4:
- Source "Facebook": 2,000 sessions
- Source "facebook": 3,500 sessions
- Source "FACEBOOK": 1,500 sessions
Total: 7,000 sessions fragmented across 3 rows
Impact:
- Cannot quickly see total Facebook performance (need to manually add)
- Top sources report cluttered with variants
- Filtering requires regex: (Facebook|facebook|FACEBOOK)
✅ Correct Examples
All campaigns: ?utm_source=facebook&utm_campaign=spring_sale
Result in GA4:
- Source "facebook": 7,000 sessions (consolidated)
Total: 7,000 sessions in one row
Benefits:
- Immediate visibility of total Facebook performance
- Clean reports with no duplicate entries
- Simple filtering: utm_source = "facebook"
- Accurate trend analysis over time
Real-World Consolidation Example
Before (case variants):
Newsletter Campaign Data (Fragmented):
GA4 Source Report:
Row 1: Newsletter | 1,200 sessions | $4,500 revenue
Row 2: newsletter | 2,800 sessions | $10,200 revenue
Row 3: NEWSLETTER | 900 sessions | $3,100 revenue
Row 4: NewsLetter | 450 sessions | $1,800 revenue
Problem: Which is the "real" Newsletter performance?
Answer: Need calculator to add 1,200 + 2,800 + 900 + 450 = 5,350 sessions
After (consistent lowercase):
Newsletter Campaign Data (Consolidated):
GA4 Source Report:
Row 1: newsletter | 5,350 sessions | $19,600 revenue
Benefit: Immediate visibility of newsletter performance
GA4 Impact Analysis
Source/Medium Reports:
- Duplicate source entries for same platform (Facebook, facebook, FACEBOOK)
- Top sources report cluttered with case variants
- Source comparison requires manual aggregation
- Historical data shows multiple entries for same logical source
Campaign Reports:
- Same campaign appears multiple times with different casing
- Campaign performance analysis requires grouping variants
- Cannot quickly identify best/worst performing campaigns
- A/B test results fragmented if case inconsistent
Filtering & Segmentation:
- Simple filters fail: "utm_source equals facebook" misses "Facebook" entries
- Requires regex patterns: "utm_source matches regex (?i)facebook" (case-insensitive)
- Saved reports break when new case variants appear
- Segments need updating as new variants introduced
Attribution:
- Customer journey may show "Facebook → facebook" as two touchpoints (same source!)
- Multi-touch attribution counts case variants as different channels
- Path analysis shows artificial source switching
Data Export:
- CSV exports contain duplicate rows for same logical source/campaign
- External BI tools require case normalization before analysis
- API queries return fragmented data requiring post-processing
Detection in UTMGuard
UTMGuard automatically detects case inconsistency by:
- Case Variant Detection - Identifies sources/campaigns with same letters but different casing
- Similarity Grouping - Groups "Facebook", "facebook", "FACEBOOK" as related variants
- Session Aggregation - Calculates total sessions across all case variants
- Fragmentation Score - Measures how many rows could be consolidated
- Impact Analysis - Reports sessions and revenue affected by fragmentation
Audit Report Shows:
Issue: Uppercase Characters in utm_source/utm_campaign
Severity: WARNING - Data fragmentation
Case Variants Detected:
utm_source=facebook variants:
- Facebook: 2,000 sessions, $8,500 revenue
- facebook: 3,500 sessions, $14,200 revenue
- FACEBOOK: 1,500 sessions, $6,100 revenue
Total: 7,000 sessions, $28,800 revenue (should be 1 row)
utm_campaign=spring_sale variants:
- Spring_Sale: 1,200 sessions
- spring_sale: 2,800 sessions
- SPRING_SALE: 900 sessions
Total: 4,900 sessions (should be 1 row)
Consolidation Opportunity:
Current: 6 separate report rows
Should be: 2 consolidated rows (1 source + 1 campaign)
Recommended Fix:
Standardize all values to lowercase:
- utm_source=facebook (not Facebook, FACEBOOK)
- utm_campaign=spring_sale (not Spring_Sale, SPRING_SALE)
Related Validation Rules
Related Validation Rules
utm_medium Must Be Lowercase
Uppercase utm_medium breaks GA4 channel grouping
Campaign Details in utm_source Parameter
Source contains campaign-specific details causing fragmentation
Generic Campaign Names
Campaign names lack descriptive value
UTM Values Exceed 100 Characters
Excessively long parameter values get truncated
Frequently Asked Questions
Q: Does utm_medium also need to be lowercase?
A: YES, and it's even MORE critical. Uppercase utm_medium breaks GA4 channel grouping completely (all traffic becomes Unassigned). Uppercase utm_source/campaign only causes fragmentation but doesn't break channel classification.
Q: What if my brand name is capitalized (e.g., Facebook, Twitter)?
A: Still use lowercase in UTM parameters. GA4 is for data analysis, not branding. Use "facebook" in UTMs even though the brand is "Facebook". Reports work better with consistent lowercase.
Q: Can I use Title Case for better readability?
A: No. While "Spring_Sale" looks nicer than "spring_sale", case sensitivity causes data fragmentation. Always use lowercase for data integrity. Format for readability in dashboards/reports, not in raw UTM data.
Q: What about acronyms like USA, UK, NYC?
A: Still lowercase: usa, uk, nyc. Even though acronyms are typically uppercase, use lowercase in UTM parameters to avoid fragmentation. Example: utm_campaign=usa-launch-2024 (not USA-Launch-2024).
Q: How do I consolidate historical data with case variants?
A: You cannot change historical data in GA4. Use calculated fields in Looker Studio or custom dimensions to normalize casing in reports. Future data should use consistent lowercase to prevent further fragmentation.
Q: Will Google Campaign URL Builder prevent this?
A: Yes, Google's official URL Builder (ga-dev-tools.google/campaign-url-builder) automatically lowercases all UTM parameters. Using this tool prevents case-sensitivity issues.
Q: Can I create a segment to combine case variants?
A: Yes, use regex in segment conditions: "utm_source matches regex (?i)facebook" (case-insensitive). But it's complex and error-prone. Better to fix at source with lowercase naming.
Q: My ad platform auto-capitalizes parameters. What do I do?
A: Override platform defaults by manually entering lowercase values in tracking templates. If platform forces capitalization, contact support or use a different parameter field that you can control.
✅ 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
External Resources
- UTM Parameter Best Practices
- Campaign URL Builder (Google)
- GA4 Source/Medium Reports
- Case Sensitivity in Web Analytics
uppercase_other_params