troubleshootingUpdated 2025

Missing Question Mark: Why Your UTMs Aren't Working

Forgot the ? before UTM parameters? GA4 sees them as part of the URL path, not tracking data. Here's the instant fix.

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

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

What GA4 Receives

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

Code
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

Code
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

Code
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

Code
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

Code
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

Javascript
// ❌ 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:

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

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

To this:

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

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

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

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

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

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

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

Variation 2: Space Instead of Question Mark

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

Variation 3: No Separator At All

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

Variation 4: Double Question Marks

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

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

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.