Missing Question Mark: Why Your UTMs Aren't Working

UTMGuard Team
6 min readtroubleshooting

You copy your UTM parameters from a spreadsheet. You paste them into your Facebook ad. You launch the campaign.

Two days later: zero campaign data in GA4.

You check the URL. Everything looks right... except for one tiny detail.

There's no question mark before your UTM parameters.

🚨 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: GA4 Doesn't See Your UTMs

What You Built

https://shop.com/products&utm_source=facebook&utm_medium=cpc&utm_campaign=spring2024
                        ↑
                   Missing ?

What GA4 Receives

Path: /products&utm_source=facebook&utm_medium=cpc&utm_campaign=spring2024
Query string: (empty)
UTM parameters: None detected

GA4 sees your UTM parameters as part of the URL path, not as query parameters.

Result: All traffic shows as "Direct" with no campaign attribution.

Why This Happens: URL Structure Rules

URLs have a specific structure defined in RFC 3986:

https://domain.com/path?query#fragment
                      ↑
             Question mark starts query string

The question mark is mandatory. It tells browsers: "Everything after this is a query string, not part of the path."

Without the Question Mark

https://shop.com/products&utm_source=facebook

Browser interprets as:
Path: /products&utm_source=facebook
Query string: None

The & ampersand becomes part of the path, not a parameter separator.

With the Question Mark

https://shop.com/products?utm_source=facebook

Browser interprets as:
Path: /products
Query string: utm_source=facebook

Now GA4 can extract the UTM parameters correctly.

😰 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

How This Mistake Happens

Scenario 1: Copy-Paste from Spreadsheet

Spreadsheet cell contains:
utm_source=facebook&utm_medium=cpc&utm_campaign=spring

You paste after domain:
shop.com/products utm_source=facebook&utm_medium=cpc&utm_campaign=spring

Missing: The ? separator

Scenario 2: URL Builder Confusion

URL builder outputs:
utm_source=facebook&utm_medium=cpc

You manually add:
shop.com/products + utm_source=facebook&utm_medium=cpc

Forgot: The ? before UTM parameters

Scenario 3: Automation Script Error

// ❌ WRONG - Missing ? separator
const url = `${"{"}{"{"}baseUrl{"}"}{"}"}}&${"{"}{"{"}utmParams{"}"}{"}"}}`;
 
// ✅ CORRECT
const url = `${"{"}{"{"}baseUrl{"}"}{"}"}}?${"{"}{"{"}utmParams{"}"}{"}"}}`;

Scenario 4: Email Marketing Tool

Some email tools expect you to add the ? manually:

Template: {"{"}{"{"}website_url{"}"}{"}"}}{"{"}{"{"}utm_parameters{"}"}{"}"}}

You set:
website_url = https://shop.com/products
utm_parameters = utm_source=email&utm_campaign=weekly

Result: https://shop.com/products utm_source=email&utm_campaign=weekly
         Missing ?

The Instant Fix

Step 1: Add the Question Mark (10 seconds)

Change this:

https://shop.com/products&utm_source=facebook&utm_campaign=spring

To this:

https://shop.com/products?utm_source=facebook&utm_campaign=spring
                         ↑
                    Added ?

Step 2: Update Active Campaigns (2 minutes)

Replace broken URLs in:

  • Social media posts
  • Email campaigns
  • Paid ads
  • Anywhere you shared the link

Step 3: Verify (30 seconds)

  1. Visit corrected URL in incognito browser
  2. Open GA4 → Real-Time reports
  3. Check campaign appears with correct attribution

Done? Tracking restored.

Real Example: $8,000 Facebook Campaign Lost

Company: E-commerce supplement brand Campaign: Facebook carousel ads Budget: $8,000 over 2 weeks

URL used:

https://supplements.com/products&utm_source=facebook&utm_medium=cpc&utm_campaign=immune-boost

What happened:

  • 15,000 clicks from Facebook
  • GA4 showed 15,000 "Direct" sessions
  • Zero attribution to Facebook
  • Team thought Facebook wasn't working
  • Almost killed the campaign

Investigation revealed:

  • URL missing ? before UTM parameters
  • GA4 treating UTMs as part of path
  • Server returned 404 errors (path doesn't exist)
  • Users landing on custom 404 page

Fixed URL:

https://supplements.com/products?utm_source=facebook&utm_medium=cpc&utm_campaign=immune-boost
                                ↑
                            Added ?

Results:

  • Tracking restored immediately
  • Remaining 10 days tracked correctly
  • Campaign actually had 4.2x ROAS
  • Increased budget based on real data

Cost of mistake: 4 days of lost attribution + nearly killing a profitable campaign.

How to Detect This Error

Visual Inspection

Look at your campaign URL. Does it have a ? before the first UTM parameter?

✅ CORRECT:
shop.com/page?utm_source=x

❌ WRONG:
shop.com/page&utm_source=x
shop.com/page utm_source=x
shop.com/pageutm_source=x

Browser Test

Visit your URL and check the browser address bar:

If browser shows:
shop.com/products&utm_source=facebook

The server might interpret this as a folder path, not query parameters.

GA4 Real-Time Test

  1. Visit your campaign URL
  2. Open GA4 → Real-Time
  3. Check if your session appears with campaign attribution

If it shows as "Direct" → you have a problem.

Server Log Check

Check your server logs:

✅ CORRECT (200 OK):
GET /products?utm_source=facebook HTTP/1.1 200

❌ WRONG (404 or weird path):
GET /products&utm_source=facebook HTTP/1.1 404

Common Variations of This Error

Variation 1: Ampersand Instead of Question Mark

❌ shop.com/page&utm_source=x
✅ shop.com/page?utm_source=x

Variation 2: Space Instead of Question Mark

❌ shop.com/page utm_source=x
✅ shop.com/page?utm_source=x

Variation 3: No Separator At All

❌ shop.com/pageutm_source=x
✅ shop.com/page?utm_source=x

Variation 4: Double Question Marks

❌ shop.com/page??utm_source=x
✅ shop.com/page?utm_source=x

✅ 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

What if my URL already has query parameters?

Use & to add additional parameters:

✅ shop.com/page?existing=value&utm_source=facebook

Can I use & without a ??

No. The first parameter MUST start with ?. Additional parameters use &.

Do all browsers require the question mark?

Yes. The ? is defined in RFC 3986 and all browsers follow this standard.

What if my CMS or URL builder adds the ? automatically?

Test it! Paste the final URL in incognito mode and check if GA4 receives the UTM parameters.

Will fixing this affect historical data?

No. Historical data remains unattributed. The fix only applies to future traffic.

How do I prevent this mistake?

Use automated URL builders with validation, or create templates that include the ? by default.

Conclusion

Missing question mark before UTM parameters? GA4 treats them as part of the URL path, not query parameters.

The fix:

  1. Add ? before the first UTM parameter
  2. Use & to separate subsequent parameters
  3. Structure: domain.com/path?utm_source=x&utm_medium=y
  4. Test in GA4 Real-Time

This single character makes the difference between perfect attribution and zero tracking.


Technical Reference: Missing Query Separator Validation Rule