attribution-errorsUpdated 2025

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.

7 min readattribution-errors

Your campaign URL looks perfectly formatted:

Code
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.

🚨 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 exists
  • undefined = Variable not set
  • (not set) = Data not collected
  • none = Explicitly empty
  • na = 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)

  • null
  • undefined
  • nil
  • none
  • na
  • n/a

Tier 2: GA4 System Values (Never Use)

  • (not set)
  • (not provided)
  • (direct)
  • (none)
  • unassigned
  • unknown

Tier 3: Ambiguous Terms (Avoid)

  • test
  • testing
  • temp
  • default
  • example
  • placeholder

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:

Code
?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:

Code
?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:

Code
?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

Get Your Free Audit Report

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:

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

  1. CMO thought Direct traffic spiked 340%

    • "Our brand awareness is working!"
    • Proposed increasing brand budget by $50K
  2. Email marketing looked like it failed

    • "Email generated zero traffic this week"
    • Proposed cutting email budget by 40%
  3. 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)

  1. GA4 → Reports → Traffic Acquisition
  2. Add filter: "Session source"
  3. 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)

  1. GA4 → Reports → Traffic Acquisition
  2. Click "(direct) / (none)"
  3. Add secondary dimension: "Landing page"
  4. 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=null
  • utm_source=undefined
  • utm_source=(not set)
  • utm_source=none
  • utm_source=na
  • utm_source=test

Find any? Those campaigns have broken attribution.

Test 4: Realtime Test (30 seconds)

  1. Create test URL: yoursite.com?utm_source=null&utm_medium=email
  2. Open in incognito browser
  3. GA4 → Realtime report
  4. Check traffic source

If it shows "(direct)" → Confirmed reserved keyword breaks attribution.

The 2-Minute Fix

Fix 1: Replace Reserved Keywords

Before (broken):

Code
?utm_source=null&utm_medium=email&utm_campaign=launch

After (fixed):

Code
?utm_source=newsletter&utm_medium=email&utm_campaign=launch

Before (broken):

Code
?utm_source=none&utm_medium=social&utm_campaign=promotion

After (fixed):

Code
?utm_source=facebook&utm_medium=social&utm_campaign=promotion

Before (broken):

Code
?utm_source=test&utm_medium=referral&utm_campaign=partners

After (fixed):

Code
?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:

Code
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

Run Complete UTM Audit (Free Forever)

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:

Javascript
let utmSource = null; // placeholder, will be replaced
let utmMedium = undefined; // not yet set

If these placeholders make it into production URLs, attribution breaks.

Reason 3: Copy-Paste from Documentation

Some internal documentation shows examples:

Code
?utm_source=[source]&utm_medium=[medium]&utm_campaign=[campaign]

Marketers copy-paste but forget to replace [source] with actual value.

Or worse, documentation uses:

Code
?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:

Code
?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 (NAna), 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:

  1. Replace reserved keywords with descriptive source names
  2. Add validation to block forbidden values
  3. Test in GA4 Realtime before launch
  4. 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

UTM

Get Your Free Audit in 60 Seconds

Connect GA4, run the scan, and see exactly where tracking is leaking budget. No credit card required.

Trusted by growth teams and agencies to keep attribution clean.