Ampersand Breaking UTM Tracking: Fix & Symbol in Parameter Values
Your campaign name is "save & win" but GA4 only shows "save". Everything after the & is missing.
Unencoded ampersands break parameter parsing. Here's the 60-second fix.
🚨 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
❌ BROKEN:
?utm_campaign=save&win
Browser parses as:
utm_campaign = "save"
win = "" (new parameter with no value)
GA4 receives: campaign = "save"
Missing: "& win"
The & symbol is a reserved URL character. It separates parameters.
When you use & in a parameter value without encoding, the browser thinks you're starting a new parameter.
Why It Happens
Ampersand (&) is the parameter separator in URLs:
✅ CORRECT USAGE (separating parameters):
?utm_source=facebook&utm_medium=cpc&utm_campaign=spring
↑ ↑
Parameter separators
But when & appears INSIDE a value:
❌ WRONG (& in value, not encoded):
?utm_campaign=save&win&utm_medium=cpc
↑ ↑
Intended as part of campaign name
Parsed as parameter separator
Result:
- utm_campaign = "save"
- win = ""
- utm_medium = "cpc"
Real Example
Company: E-commerce retailer
Campaign: "Buy 1 & Get 1 Free" promotion
Budget: $25,000 Facebook ads
URL: ?utm_campaign=buy1&get1free
Result in GA4:
- Campaign name: "buy1"
- Everything after & lost
Impact:
- Could not identify "Buy 1 & Get 1" campaign in reports
- Data split: some sessions showed "buy1", some showed nothing
- $25,000 spend with truncated attribution
- Could not measure actual promo performance
Encoding the & would have preserved full tracking.
😰 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
The Fix
Option 1: Encode as %26
❌ BEFORE:
?utm_campaign=save&win
✅ AFTER:
?utm_campaign=save%26win
GA4 shows: "save&win" (decoded automatically)
Option 2: Replace with "and"
❌ BEFORE:
?utm_campaign=save&win
✅ AFTER:
?utm_campaign=save-and-win
GA4 shows: "save-and-win"
Option 3: Remove Ampersand
❌ BEFORE:
?utm_campaign=buy1&get1
✅ AFTER:
?utm_campaign=buy1get1
GA4 shows: "buy1get1"
Quick Encoding Script
function encodeUtmValue(value) {
// Encode all special characters including &
return encodeURIComponent(value);
}
// Usage
const campaign = "save & win";
const encoded = encodeUtmValue(campaign);
console.log(encoded);
// Output: save%20%26%20win
// ↑ ↑
// space ampersand
// Build full URL
const url = `https://site.com?utm_campaign=${"{"}{"{"}encoded{"}"}{"}"}}`;
console.log(url);
// https://site.com?utm_campaign=save%20%26%20win
// GA4 receives: "save & win" (automatically decoded)How Browsers Parse Ampersands
Example URL:
https://site.com?utm_campaign=save&win&utm_medium=cpc
Browser interpretation:
Parameter 1: utm_campaign = "save"
Parameter 2: win = "" (no value provided)
Parameter 3: utm_medium = "cpc"
URLSearchParams output:
utm_campaign: "save"
win: ""
utm_medium: "cpc"
GA4 receives:
Campaign: "save"
Medium: "cpc"
(Everything between & symbols is lost or misinterpreted)
Detection Script
function detectUnencodedAmpersand(url) {
const params = new URL(url).searchParams;
const issues = [];
params.forEach((value, key) => {
// Check if value contains unencoded &
// (encoded & appears as %26 in raw query string)
const rawQuery = url.split('?')[1] || '';
const paramPattern = new RegExp(`${"{"}{"{"}key{"}"}{"}"}}=([^&]*)`);
const match = rawQuery.match(paramPattern);
if (match) {
const rawValue = match[1];
// If raw value contains & but not %26, it's unencoded
if (rawValue.includes('&') && !rawValue.includes('%26')) {
issues.push({
parameter: key,
value: value,
problem: 'Contains unencoded ampersand',
fix: `Encode as ${encodeURIComponent(value)}`
});
}
}
});
return issues;
}
// Usage
const url = 'site.com?utm_campaign=save&win';
console.log(detectUnencodedAmpersand(url));
// [{ parameter: 'utm_campaign', value: 'save', problem: 'Contains unencoded ampersand', ... }]Testing After Fix
Step 1: Check URL Structure
✅ CORRECT:
https://site.com?utm_campaign=save%26win&utm_medium=cpc
↑ ↑
Encoded &
Each %26 in URL = one & in the final value
Step 2: Test in Browser
1. Visit URL: https://site.com?utm_campaign=save%26win
2. Open browser console
3. Run: new URL(location.href).searchParams.get('utm_campaign')
4. Should output: "save&win" (decoded)
Step 3: Verify in GA4
1. Visit corrected URL
2. Open GA4 → Realtime
3. Check "Traffic acquisition"
4. Campaign should show complete value: "save&win"
Common Ampersand Scenarios
Scenario 1: Company Name with &
❌ WRONG:
utm_source=johnson&johnson
✅ RIGHT:
utm_source=johnson%26johnson
GA4 shows: "johnson&johnson"
Scenario 2: Product Names
❌ WRONG:
utm_content=shoes&boots
✅ RIGHT:
utm_content=shoes%26boots
GA4 shows: "shoes&boots"
Scenario 3: Promotional Copy
❌ WRONG:
utm_campaign=save-big&act-fast
✅ RIGHT:
utm_campaign=save-big%26act-fast
GA4 shows: "save-big&act-fast"
Platform-Specific Handling
Google Ads
Value Tracking Template:
`{"{"}{"{"}lpurl{"}"}{"}"}}`?utm_campaign=buy1%26get1free&gclid=`{"{"}{"{"}gclid{"}"}{"}"}}`
↑
Pre-encoded & in campaign name
Facebook Ads
URL Parameters field:
utm_source=facebook&utm_campaign=spring%26summer
↑
Encoded &
Email Platforms
<!-- Pre-encode in template -->
<a href="https://site.com?utm_campaign=save%26win&utm_source=email">
Click Here
</a>
<!-- Platform's click tracking preserves %26 -->Prevention Checklist
Before launching campaigns:
✅ Scan all UTM values for & symbols
✅ Replace with:
- %26 (encoded, preserves &)
- "and" (readable alternative)
- Remove (if not needed)
✅ Use encodeURIComponent() for automation
✅ Test URL in browser console
✅ Verify in GA4 Real-Time
✅ 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
Why does & break URLs?
& is reserved as the parameter separator. Using it in values without encoding confuses URL parsers.
Should I always encode & to %26?
Yes, if you want the & to appear in GA4. Alternative: replace with "and" or remove.
What if my platform auto-encodes?
Test it. Some platforms encode, some don't. Always verify the final URL received by users.
Can I use & in the base URL?
Yes. & is only problematic when used INSIDE parameter values. Between parameters, & is correct.
✅ CORRECT:
?param1=value1¶m2=value2
↑
& separating parameters (correct)
❌ WRONG:
?param1=value&value
↑
& inside value (must encode as %26)
Conclusion
Unencoded & in UTM values breaks parameter parsing. Fix: Encode as %26.
❌ utm_campaign=save&win
✅ utm_campaign=save%26win
✅ utm_campaign=save-and-win
Use encodeURIComponent() to automatically encode all special characters including &.
Technical Reference: Ampersand Not Encoded Validation Rule