Plus Sign UTM Inconsistency: Why + Shows as Space Sometimes

UTMGuard Team
6 min readtroubleshooting

Your campaign name is "google+ads" but GA4 sometimes shows "google ads" (with space), sometimes "google+ads" (with plus).

Plus signs in URLs behave unpredictably. Here's why and how to fix it.

🚨 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

The Problem

URL: ?utm_campaign=google+ads

GA4 shows inconsistently:
- Session 1: "google ads" (+ decoded as space)
- Session 2: "google+ads" (+ kept as +)
- Session 3: "google  ads" (double space)

One campaign, three different values

Plus signs have dual meaning in URLs, causing inconsistent decoding.

Why + Is Ambiguous

Historical Context

In URLs, + can mean two different things:

  1. In query strings: Space character (legacy encoding)

    ?search=hello+world → "hello world"
    
  2. As literal +: The actual plus symbol

    ?tech=C++ → "C++"
    

Problem: Browsers and analytics platforms decode + inconsistently.

Real Example

Company: Digital marketing agency Campaign: "Google+Bing Ads" Budget: $30,000 URL: ?utm_campaign=google+bing

GA4 Results:

Browser          | Campaign Value Shown
-----------------|---------------------
Chrome Desktop   | "google bing" (space)
Firefox          | "google bing" (space)
Safari iOS       | "google+bing" (kept +)
Android Chrome   | "google bing" (space)

Impact:

  • Same campaign appears as 2 different values in GA4
  • Data fragmented between "google bing" and "google+bing"
  • Could not get accurate performance totals
  • Reports showed two separate campaigns

$30,000 attribution split across inconsistent 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

Get Your Free Audit Report

When + Gets Decoded as Space

// Test browser behavior
const url = 'https://site.com?utm_campaign=google+bing';
const params = new URLSearchParams(url.split('?')[1]);
console.log(params.get('utm_campaign'));
// Most browsers output: "google bing" (space)
 
// + is decoded as space in query string context

When + Stays as +

Some contexts preserve +:
- URL displayed in address bar (before decoding)
- Some mobile browsers (platform-dependent)
- Certain email click tracking systems
- URL shorteners (depends on implementation)

Result: Inconsistent GA4 values

The Fix

❌ AMBIGUOUS:
utm_campaign=google+bing

✅ EXPLICIT:
utm_campaign=google%2Bbing

GA4 always shows: "google+bing"

Option 2: Use Different Separator

❌ AMBIGUOUS:
utm_campaign=google+bing

✅ CLEAR:
utm_campaign=google-bing
utm_campaign=google_bing
utm_campaign=googlebing

No encoding ambiguity

Option 3: Spell Out "plus"

❌ AMBIGUOUS:
utm_campaign=C++

✅ CLEAR:
utm_campaign=c-plus-plus
utm_campaign=cplusplus

Readable, no encoding issues

Encoding Script

function fixPlusSign(value) {
    // Check if value contains +
    if (value.includes('+')) {
        console.warn(`Value contains + which may decode inconsistently: "${"{"}{"{"}value{"}"}{"}"}}"`);
 
        // Option 1: Encode + as %2B
        const encoded = value.replace(/\+/g, '%2B');
        console.log(`Encoded version: "${"{"}{"{"}encoded{"}"}{"}"}}"`);
 
        // Option 2: Replace with hyphen
        const hyphenated = value.replace(/\+/g, '-');
        console.log(`Hyphenated version: "${"{"}{"{"}hyphenated{"}"}{"}"}}"`);
 
        return encoded; // Return encoded by default
    }
 
    return value;
}
 
// Usage
const campaign = 'google+bing';
const fixed = fixPlusSign(campaign);
console.log(fixed);
// google%2Bbing

Detection Script

function detectPlusSignIssues(url) {
    const params = new URL(url).searchParams;
    const issues = [];
 
    ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'].forEach(key => {
        const value = params.get(key);
        const rawQuery = url.split('?')[1] || '';
        const paramPattern = new RegExp(`${"{"}{"{"}key{"}"}{"}"}}=([^&]*)`);
        const match = rawQuery.match(paramPattern);
 
        if (match && match[1].includes('+') && !match[1].includes('%2B')) {
            issues.push({
                parameter: key,
                rawValue: match[1],
                decodedValue: value,
                warning: '+ may decode inconsistently across browsers',
                fix: match[1].replace(/\+/g, '%2B')
            });
        }
    });
 
    return {
        hasIssues: issues.length > 0,
        issues
    };
}
 
// Usage
const url = 'site.com?utm_campaign=google+bing';
const result = detectPlusSignIssues(url);
 
if (result.hasIssues) {
    console.log('⚠️  Plus sign issues detected:');
    result.issues.forEach(issue => {
        console.log(`  ${issue.parameter}: "${issue.rawValue}" → fix: "${issue.fix}"`);
    });
}

Testing Across Browsers

// Test script to run in different browsers
function testPlusDecoding() {
    const testUrl = 'https://test.com?param=a+b';
    const url = new URL(testUrl);
    const value = url.searchParams.get('param');
 
    console.log('Browser:', navigator.userAgent);
    console.log('URL:', testUrl);
    console.log('Decoded value:', value);
    console.log('Is space?', value === 'a b');
    console.log('Is plus?', value === 'a+b');
}
 
// Run in:
// - Chrome Desktop
// - Firefox
// - Safari Desktop
// - Safari iOS
// - Chrome Android
 
// Compare results to see inconsistency

Platform Behavior

PlatformTreats + as Space?Recommendation
GA4Yes (usually)Encode as %2B
Google AdsYesEncode as %2B
FacebookYesEncode as %2B
Email clientsVariesEncode as %2B
URL shortenersVariesEncode as %2B

Universal fix: Encode + as %2B when you mean literal plus sign.

Common Scenarios

Scenario 1: Product Names

Product: C++ Programming

❌ INCONSISTENT:
utm_content=C++

✅ CONSISTENT:
utm_content=C%2B%2B
utm_content=Cplusplus
utm_content=cpp

Scenario 2: Brand Names

Brand: Google+

❌ INCONSISTENT:
utm_source=google+

✅ CONSISTENT:
utm_source=google%2B
utm_source=googleplus

Scenario 3: Mathematical Expressions

Offer: 1+1=2

❌ INCONSISTENT:
utm_campaign=1+1=2

✅ CONSISTENT:
utm_campaign=1%2B1%3D2
utm_campaign=one-plus-one
utm_campaign=2for1

Prevention Checklist

Before launching campaigns with + in values:

✅ Identify all + symbols in parameter values
✅ Decide: Encode (%2B) or replace (-, _, remove)?
✅ Test URL in multiple browsers
✅ Check GA4 Real-Time after clicking
✅ Verify consistent decoding
✅ Document decision for team

✅ 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

Is + ever safe to use in UTM parameters?

Not reliably. Encode as %2B if you need literal +, or use alternative separator.

Why does + sometimes work?

Some platforms preserve + in certain contexts, but behavior is inconsistent. Don't rely on it.

Should I use + or %20 for spaces?

Use %20 or underscores. + for spaces is legacy and can be ambiguous.

What if my campaign already launched with +?

Fix immediately. Update all placements. Use %2B or alternative separator going forward.

Conclusion

Plus signs in UTM parameters decode inconsistently: sometimes as space, sometimes as +.

Fixes:

  1. Encode: + → %2B (reliable across all platforms)
  2. Replace: + → - or _ (simpler, no encoding)
  3. Remove: google+bing → googlebing

Never use unencoded + in UTM values. Always encode as %2B or use alternatives.

❌ utm_campaign=google+bing
✅ utm_campaign=google%2Bbing
✅ utm_campaign=google-bing

Technical Reference: Plus Sign in Value Validation Rule