Reserved Keywords in utm_source Break GA4 Attribution (The Forbidden List)
Using 'null', 'undefined', or '(not set)' in utm_source makes your campaign data invisible in GA4. Here's the complete forbidden keyword list.
Your campaign URL looks perfectly formatted:
https://store.com/sale?utm_source=null&utm_medium=email&utm_campaign=spring-sale
You sent it to 20,000 subscribers.
GA4 shows zero sessions from the campaign.
The traffic shows as "(direct) / (none)" or "Unassigned."
Why? You used a reserved keyword: null
GA4 has a hidden list of forbidden UTM values. Use any of them, and your entire campaign becomes invisible.
Here's the complete forbidden list and how to avoid breaking your attribution.
Table of contents
- What Are Reserved Keywords?
- The Complete Forbidden Keywords List
- Why These Keywords Break Attribution
- Example 1: The "null" Problem
- Example 2: The "(not set)" Problem
- Example 3: The "none" Problem
- Real Example: $32,000 Campaign Named "null"
- How to Check If You Have This Problem
- Test 1: Search GA4 for Suspicious Sources (2 minutes)
- Test 2: Direct Traffic Spike Investigation (3 minutes)
- Test 3: Campaign URL Audit (5 minutes)
- Test 4: Realtime Test (30 seconds)
- The 2-Minute Fix
- Fix 1: Replace Reserved Keywords
- Fix 2: Update Campaign URL Templates
- Fix 3: Validate Before Launch
- Safe Alternative Source Names
- Why This Mistake Happens
- Reason 1: Database Default Values
- Reason 2: Developer Placeholders
- Reason 3: Copy-Paste from Documentation
- Reason 4: Testing That Goes Live
- FAQ
- Can I use "test" for actual test campaigns?
- What about "null" as utmcampaign name?
- Will GA4 show an error message?
- Can I use "NA" in uppercase?
- What if my campaign is literally called "None"?
- How do I fix historical data with reserved keywords?
- Prevention Checklist
- Conclusion
🚨 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
What Are Reserved Keywords?
Reserved keywords = Words that have special meaning in programming and databases
These words are used internally by GA4 to represent missing or undefined data:
null= No value existsundefined= Variable not set(not set)= Data not collectednone= Explicitly emptyna= Not applicable
When you use them as utm_source values, GA4 thinks you're saying "this traffic has no source" instead of "this traffic is from a campaign called 'null'."
The result: GA4 discards your UTM parameters and defaults to direct attribution.
The Complete Forbidden Keywords List
Tier 1: Programming Reserved Words (Never Use)
nullundefinednilnonenan/a
Tier 2: GA4 System Values (Never Use)
(not set)(not provided)(direct)(none)unassignedunknown
Tier 3: Ambiguous Terms (Avoid)
testtestingtempdefaultexampleplaceholder
Tier 4: Empty or Whitespace (Never Use)
- `` (empty string)
(single space)(multiple spaces)%20(URL-encoded space)
Rule of thumb: If the word represents "absence of data," don't use it as utm_source.
Why These Keywords Break Attribution
Example 1: The "null" Problem
Your URL:
?utm_source=null&utm_medium=email&utm_campaign=spring-sale
What you intended:
- Source: Campaign named "null"
- Medium: email
- Campaign: spring-sale
What GA4 interprets:
- Source: No value (utm_source is null/missing)
- Medium: email (orphaned without source)
- Campaign: spring-sale (ignored without source/medium)
Result in GA4:
- Source / Medium: "(direct) / (none)"
- Campaign: Not recorded
- Attribution: Broken
Example 2: The "(not set)" Problem
Your URL:
?utm_source=(not set)&utm_medium=social&utm_campaign=launch
What you intended:
- Source: Campaign identifier "(not set)"
- Medium: social
- Campaign: launch
What GA4 interprets:
- Source: This field is not set (missing data)
- Medium: social (orphaned)
- Campaign: launch (ignored)
Result in GA4:
- Source / Medium: "(not set) / (none)"
- But this looks identical to actual missing data
- Reports become unreadable mix of real missing data + your campaign
Example 3: The "none" Problem
Your URL:
?utm_source=none&utm_medium=referral&utm_campaign=partners
What GA4 interprets:
- Source: No source specified
- Result: Treated as direct traffic
😰 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
Real Example: $32,000 Campaign Named "null"
Client: SaaS company Campaign: Email announcement to 45,000 users Developer: Created campaign tracking system using placeholder values
Campaign database entry:
- Campaign ID: 12345
- Campaign name: "Product Launch"
- utm_source:
null(default value in database before being set) - utm_medium:
email - utm_campaign:
product-launch
What happened:
Developer forgot to update utm_source from placeholder "null" to actual value.
Email went out with:
https://product.com/launch?utm_source=null&utm_medium=email&utm_campaign=product-launch
Expected results:
- Sessions: ~4,500 (10% open rate, 50% click rate)
- Conversions: ~180 (4% conversion rate)
- Revenue: $32,400 (at $180 average)
Actual GA4 data:
- Source / Medium: "(direct) / (none)"
- Sessions attributed to email: 0
- All 4,517 sessions showed as Direct
- Revenue attributed to Direct: $32,400
The impact:
-
CMO thought Direct traffic spiked 340%
- "Our brand awareness is working!"
- Proposed increasing brand budget by $50K
-
Email marketing looked like it failed
- "Email generated zero traffic this week"
- Proposed cutting email budget by 40%
-
Attribution was backwards
- Best performing channel (email) appeared dead
- Non-existent brand campaign appeared incredibly successful
The fix:
Changed utm_source=null to utm_source=newsletter
Next campaign tracked correctly: 4,200 sessions, 165 conversions, $29,700 revenue—all properly attributed to email.
How to Check If You Have This Problem
Test 1: Search GA4 for Suspicious Sources (2 minutes)
- GA4 → Reports → Traffic Acquisition
- Add filter: "Session source"
- Look for these exact values:
- null
- undefined
- (not set)
- none
- na
- test
If you see any of these as source names, you have reserved keyword issues.
Exception: GA4's own "(not set)" for genuinely missing data is normal. But if you see high volumes or it appears with specific campaign names, you may have used it as a utm_source value.
Test 2: Direct Traffic Spike Investigation (3 minutes)
- GA4 → Reports → Traffic Acquisition
- Click "(direct) / (none)"
- Add secondary dimension: "Landing page"
- Look for campaign-specific landing pages
Red flags:
- Landing pages:
/launch(your product launch campaign) - Landing pages:
/email-exclusive - Landing pages:
/partner-offer
If campaign pages appear under Direct, check if campaign URLs used reserved keywords.
Test 3: Campaign URL Audit (5 minutes)
Pull your campaign tracking spreadsheet or URL list.
Search for these patterns:
utm_source=nullutm_source=undefinedutm_source=(not set)utm_source=noneutm_source=nautm_source=test
Find any? Those campaigns have broken attribution.
Test 4: Realtime Test (30 seconds)
- Create test URL:
yoursite.com?utm_source=null&utm_medium=email - Open in incognito browser
- GA4 → Realtime report
- Check traffic source
If it shows "(direct)" → Confirmed reserved keyword breaks attribution.
The 2-Minute Fix
Fix 1: Replace Reserved Keywords
Before (broken):
?utm_source=null&utm_medium=email&utm_campaign=launch
After (fixed):
?utm_source=newsletter&utm_medium=email&utm_campaign=launch
Before (broken):
?utm_source=none&utm_medium=social&utm_campaign=promotion
After (fixed):
?utm_source=facebook&utm_medium=social&utm_campaign=promotion
Before (broken):
?utm_source=test&utm_medium=referral&utm_campaign=partners
After (fixed):
?utm_source=partner-blog&utm_medium=referral&utm_campaign=partners
Fix 2: Update Campaign URL Templates
If your UTM builder or campaign system uses placeholders:
Replace these default/placeholder values:
- ❌ Default:
utm_source=null - ✅ Replace with:
utm_source=[SOURCE-NAME](human fills in)
Or use descriptive placeholders:
- ❌
utm_source=placeholder - ✅
utm_source=REPLACE-WITH-SOURCE(makes it obvious)
Fix 3: Validate Before Launch
Add validation to your UTM builder or campaign tool:
Forbidden values check:
If utm_source equals:
- null, undefined, nil, none, na, n/a
- (not set), (not provided), (direct), (none)
- test, testing, temp, default, example, placeholder
- empty string or only whitespace
Then:
- Show error: "Reserved keyword detected. Choose a different source name."
- Block URL generation
Safe Alternative Source Names
Instead of reserved keywords, use these descriptive alternatives:
Instead of "null":
- Use:
newsletter,email-campaign,mail
Instead of "none":
- Use:
organic-post,unpaid-social,blog-share
Instead of "test":
- Use:
qa-campaign,staging-test,dev-environment
Instead of "na":
- Use:
other,misc,general,multiple-sources
Instead of "unknown":
- Use:
to-be-determined,pending-assignment,untagged-legacy
General rule: Use actual descriptive names, not programming concepts.
✅ 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
Why This Mistake Happens
Reason 1: Database Default Values
Campaign management systems often set default values for empty fields:
- Default utm_source:
null - Default utm_medium:
null - Default utm_campaign:
null
If you forget to update these before generating links, you launch with "null" as your source.
Reason 2: Developer Placeholders
Developers creating UTM builder tools use programming conventions:
let utmSource = null; // placeholder, will be replaced
let utmMedium = undefined; // not yet setIf these placeholders make it into production URLs, attribution breaks.
Reason 3: Copy-Paste from Documentation
Some internal documentation shows examples:
?utm_source=[source]&utm_medium=[medium]&utm_campaign=[campaign]
Marketers copy-paste but forget to replace [source] with actual value.
Or worse, documentation uses:
?utm_source=null&utm_medium=null&utm_campaign=null
As a "template," and marketers use it literally.
Reason 4: Testing That Goes Live
QA creates test campaigns:
?utm_source=test&utm_medium=email&utm_campaign=test-campaign
Test campaign accidentally gets sent to real audience instead of test segment.
FAQ
Can I use "test" for actual test campaigns?
No. Use utm_source=qa-test or utm_source=internal-test instead. The word "test" alone is too ambiguous and often filtered in reporting.
What about "null" as utm_campaign name?
Also avoid it. While less critical than utm_source, using reserved keywords anywhere in UTM parameters creates confusion in reports.
Will GA4 show an error message?
No. GA4 silently treats reserved keywords as missing data. You won't see errors—just broken attribution.
Can I use "NA" in uppercase?
Avoid it. While GA4 is case-sensitive (NA ≠ na), using any variation of reserved keywords risks confusion and reporting errors.
What if my campaign is literally called "None"?
Use a variation: none-campaign, campaign-none, promo-none. Add context to avoid the reserved keyword.
How do I fix historical data with reserved keywords?
You can't change historical data. For future reporting, filter out sessions with reserved keyword sources to see true attribution trends.
Prevention Checklist
✅ Setup (one-time):
- Document forbidden keywords list (share with team)
- Add validation to UTM builder (block reserved keywords)
- Update campaign templates (remove placeholder "null" defaults)
- Change database defaults to empty strings (not "null")
✅ Before Every Campaign:
- Check utm_source value doesn't match forbidden list
- Verify utm_medium also avoids reserved keywords
- Test URL in GA4 Realtime before launch
- Confirm traffic shows with correct source (not "(direct)")
✅ Monthly Audit:
- GA4 → Search for "null", "undefined", "(not set)" as sources
- Investigate any matches
- Find campaigns using reserved keywords
- Update URLs and notify campaign owners
Conclusion
Campaign showing as "(direct)" even though you added UTM parameters?
Check if you used reserved keywords:
- null, undefined, nil, none, na, n/a
- (not set), (not provided), (direct), (none)
- test, testing, temp, default, example
The fix:
- Replace reserved keywords with descriptive source names
- Add validation to block forbidden values
- Test in GA4 Realtime before launch
- Use actual campaign identifiers, not programming placeholders
Never use programming concepts as UTM values. Use real, descriptive campaign names.
Related: Complete Forbidden UTM Values List