Plus Sign UTM Inconsistency: Why + Shows as Space Sometimes
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:
-
In query strings: Space character (legacy encoding)
?search=hello+world → "hello world" -
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
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 contextWhen + 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
Option 1: Encode + as %2B (Recommended)
❌ 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%2BbingDetection 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 inconsistencyPlatform Behavior
| Platform | Treats + as Space? | Recommendation |
|---|---|---|
| GA4 | Yes (usually) | Encode as %2B |
| Google Ads | Yes | Encode as %2B |
| Yes | Encode as %2B | |
| Email clients | Varies | Encode as %2B |
| URL shorteners | Varies | Encode 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
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:
- Encode: + → %2B (reliable across all platforms)
- Replace: + → - or _ (simpler, no encoding)
- 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