Tags Fire in GTM But Nothing Reaches GA4? Fix Your Transmission Layer

Tags Fire in GTM But Nothing Reaches GA4? Fix Your Transmission Layer

📖 10 min read 2143 words

Your GTM tags fire perfectly in Preview Mode, but GA4 shows no data. This is Layer 3 (Transmission) failure—where data gets lost between your browser and Google's servers. Here's how to diagnose and fix it.

Quick Navigation

The “Everything Looks Fine” Problem That Cost $300K

An enterprise client called me in a panic. Their GTM setup was “perfect” according to their agency:

  • ✅ GTM container loading correctly
  • ✅ All tags firing in Preview Mode
  • ✅ Variables resolving expected values
  • ✅ No errors in the console

But their GA4 property was empty. Zero events. Zero users. Complete radio silence.

They’d spent three weeks troubleshooting Layers 1 and 2 (Infrastructure and Implementation). The agency rebuilt the entire GTM container from scratch. Nothing changed.

The problem wasn’t in GTM—it was in transmission.

The diagnostic took 90 seconds. The fix took 2 hours. The cost of three weeks without data: $300K in ad spend optimized to phantom metrics because their attribution model was running on stale data.

This is Layer 3 failure: the HTTP requests from your browser to Google’s collection servers are failing, blocked, or malformed.

What Layer 3 (Transmission) Actually Means

Layer 3 is the handoff zone between GTM and GA4. This is where GTM stops and Google Analytics begins.

The transmission path:

  1. Your GA4 tag fires in GTM (Layer 2 ✅)
  2. GTM calls the gtag.js library
  3. gtag.js constructs an HTTP request with your event data
  4. Browser sends request to https://www.google-analytics.com/g/collect
  5. Google’s collection server responds with 204 No Content

If this chain breaks anywhere, your data never reaches GA4.

Layer 3 covers:

  • gtag.js library loading and executing
  • HTTP requests being sent from the browser
  • Requests successfully reaching Google’s servers
  • Server-side GTM (sGTM) relay if configured
  • Ad blockers and privacy tools intercepting requests
  • Consent mode blocking transmission
  • Network infrastructure (firewalls, proxies) allowing requests

This is the most frustrating layer to debug because everything looks fine in GTM. Tags fire. Variables work. Preview Mode shows green checkmarks.

But no data reaches GA4.

The Transmission Diagnostic (90 Seconds to $300K Root Cause)

Step 1: Are Requests Being Sent?

Open Chrome DevTools → Network tab. Filter for “collect” or “analytics.”

Reload your page. Trigger a conversion event. Look for requests to:

  • https://www.google-analytics.com/g/collect
  • Or (if using sGTM): https://your-sgtm-domain.com/g/collect

What you should see:

Status What It Means
204 No Content ✅ Success - Google received your data
200 OK ✅ Success (alternative response)
0 (cancelled) ❌ Request blocked by ad blocker or CSP
403 Forbidden ❌ Request blocked by server policy
404 Not Found ❌ Wrong endpoint (sGTM misconfigured)
(failed) net::ERR_BLOCKED_BY_CLIENT ❌ Browser extension blocking
No requests at all gtag.js didn’t load or consent blocked

In that $300K case, the Network tab showed:

0 (cancelled) - net::ERR_BLOCKED_BY_CLIENT

Not a GTM problem. Not a tag configuration problem. The corporate firewall was blocking all requests to google-analytics.com.

Their IT department had implemented new security policies three weeks prior (exactly when tracking stopped). The agency never checked the Network tab—they assumed it was a GTM configuration issue.

Step 2: Monitor Requests in Real-Time

Paste this diagnostic snippet in your console:

(() => {
  const observer = new PerformanceObserver((list) => {
    list.getEntries().forEach((entry) => {
      if (entry.name.includes('/g/collect')) {
        console.log(`🌐 GA4 Request: ${entry.responseStatus || 'pending'} - ${entry.name.split('?')[0]}`);
      }
    });
  });
  observer.observe({entryTypes: ['resource']});
  return 'Monitoring GA4 requests - check console';
})();

Now interact with your site (click buttons, submit forms, trigger events). This snippet logs every GA4 request attempt in real-time.

What good looks like:

🌐 GA4 Request: 204 - https://www.google-analytics.com/g/collect
🌐 GA4 Request: 204 - https://www.google-analytics.com/g/collect

Red flags:

(No output at all) → No requests being sent
🌐 GA4 Request: 0 - https://www.google-analytics.com/g/collect → Blocked
🌐 GA4 Request: pending - https://your-sgtm.com/g/collect → sGTM timeout

Step 3: Parse the Last Request (Advanced)

If requests ARE being sent but data still doesn’t appear in GA4, check what’s in the request:

(() => {
  const entries = performance.getEntriesByType('resource');
  const ga4 = entries.filter(e => e.name.includes('/g/collect'));
  if (ga4.length === 0) return 'No GA4 requests found';
  const last = ga4[ga4.length - 1];
  const url = new URL(last.name);
  const params = Object.fromEntries(url.searchParams);
  return {
    event: params.en || params.t,
    measurement_id: params.tid,
    client_id: params.cid,
    session_id: params.sid,
    currency: params.cu,
    value: params.tr || params.ev
  };
})();

This shows you what data is actually being sent to Google.

What to verify:

  • measurement_id matches your GA4 property (G-XXXXXXXXXX)
  • client_id exists (GA4 needs this to identify users)
  • event name matches what you expect
  • Required parameters are present (e.g., value for purchase events)

If measurement_id is wrong or missing, your GA4 Configuration Tag in GTM is misconfigured. This is technically a Layer 2 issue, but it manifests as a transmission failure.

The EXIT POINT: Where GTM Hands Off to GA4

Understanding the exit point is critical for Layer 3 diagnostics.

Standard (Client-Side) Setup:

Browser → GTM → gtag.js → https://www.google-analytics.com/g/collect → Google's servers

Server-Side GTM (sGTM) Setup:

Browser → GTM → Your sGTM endpoint → Google's servers

The exit point is where you lose visibility into what’s happening.

In client-side setups:

  • You can see the request in the Network tab
  • You can see the response status (204 = success)
  • You can inspect the payload

In sGTM setups:

  • You see the request to YOUR domain
  • You DON’T see the relay from your server to Google
  • If your server’s relay is broken, browser diagnostics look fine

This is why sGTM troubleshooting requires server-side logging, not just browser DevTools.

The Three Most Common Transmission Failures

1. Ad Blockers and Privacy Extensions

Symptom: Requests to google-analytics.com show status 0 (cancelled) or net::ERR_BLOCKED_BY_CLIENT

What’s happening: Browser extensions (uBlock Origin, Privacy Badger, Brave Shields) are blocking GA4 requests.

The reality:

  • 30-40% of internet users run ad blockers
  • Brave browser blocks GA4 by default
  • Firefox Enhanced Tracking Protection blocks GA4
  • Safari ITP heavily restricts GA4 cookies

The diagnostic:

  1. Open your site in an incognito window with extensions disabled
  2. Check Network tab for collect requests
  3. If they work in incognito but not in normal browsing → ad blocker

The business reality: You can’t “fix” this. You can only measure it and account for it.

The mitigation: Server-side GTM (sGTM) bypasses most ad blockers because the request goes to YOUR domain, not Google’s. Ad blockers don’t know to block your-domain.com/g/collect.

Business impact: One e-commerce client assumed they had 10,000 visitors/day. After implementing sGTM, they discovered they actually had 15,000—40% were blocked by ad blockers previously.

Symptom: GTM loads, tags fire in Preview Mode, but no requests appear in Network tab.

What’s happening: Google Consent Mode v2 is blocking tag execution until consent is granted.

How Consent Mode works:

  • User lands on your site
  • Consent banner appears
  • Until user clicks “Accept,” GA4 tags are in “denied” state
  • GTM fires tags, but they send NO data (just “ping” events)
  • Only after consent do full events transmit

The diagnostic:

  1. Load your page
  2. Don’t click the consent banner
  3. Check Network tab for /g/collect requests
  4. You’ll see requests, but they’re minimal (no user data)

In GA4 DebugView:

  • Events appear as first_visit or session_start
  • But user properties and detailed parameters are missing
  • Events are marked as “consent denied”

The fix: This isn’t broken—it’s working as intended. But if your consent banner isn’t working correctly (users never grant consent), you’ll have no usable data.

Business impact: I’ve seen sites where 80% of users never interact with the consent banner (they just close it or ignore it). Those users never get tracked. The business thinks they have low traffic—actually, they have low consent rates.

3. Server-Side GTM (sGTM) Misconfiguration

Symptom: Browser shows successful request to your sGTM endpoint, but GA4 receives no data.

What’s happening: The browser → sGTM request succeeds, but the sGTM → Google relay fails.

Common sGTM failure modes:

Problem Symptom Fix
Measurement ID not mapped sGTM receives events but doesn’t know where to send them Configure GA4 client in sGTM with correct Measurement ID
Server timing out Browser request times out after 30 seconds Scale up sGTM server resources
Firewall blocking outbound sGTM can’t reach google-analytics.com Whitelist Google IPs in your server’s firewall
Missing event parameters sGTM strips parameters during transformation Review Tag templates in sGTM

The diagnostic (requires server access):

  1. SSH into your sGTM server
  2. Check server logs for outbound requests to google-analytics.com
  3. Look for 204 responses (success) or errors

If you don’t have server access, you can use GA4 DebugView as a proxy:

  1. Send a test event from your browser
  2. Wait 10 seconds
  3. Check DebugView for the event
  4. If it doesn’t appear, sGTM → Google relay is broken

Business impact: One client spent $15K setting up sGTM. Their agency configured the browser → sGTM connection perfectly but never tested the sGTM → Google relay. They had zero data for two months before realizing.

When Ad Blockers Are Your Biggest Problem

Let’s address the elephant in the room: 30-40% of your traffic is probably blocking GA4 right now.

This isn’t a bug. This isn’t something you can “fix” in GTM. It’s a fundamental limitation of client-side analytics.

Standard GTM vs Server-Side GTM: Ad Blocker Interception Standard client-side setup: Ad blockers intercept requests to google-analytics.com. Server-side GTM: Requests go to your domain, bypassing most ad blockers.

Your options:

Option 1: Accept the loss

  • Simplest approach
  • Assume your GA4 data represents 60-70% of actual traffic
  • Use directional metrics, not absolute counts
  • Risk: If ad blocker adoption grows, your blind spot grows

Option 2: Implement server-side GTM (sGTM)

  • Bypasses most ad blockers (requests go to your domain)
  • Requires server infrastructure ($50-200/month)
  • Requires technical setup (4-8 hours for first implementation)
  • Benefit: Captures 90-95% of traffic instead of 60-70%

Option 3: Use server-side analytics entirely

  • Skip browser-based tracking
  • Log events on your backend
  • Send to GA4 via Measurement Protocol
  • Benefit: 100% coverage, no ad blockers
  • Tradeoff: Requires significant development work

Business reality check: If you’re spending $50K+/month on ads, losing 40% of attribution data costs more than implementing sGTM.

If you’re a small business spending $2K/month, accepting the loss is often the pragmatic choice.

The Network Tab Workflow (The Right Way)

Most people open the Network tab, see hundreds of requests, and panic. Here’s the systematic approach:

Step 1: Filter for Analytics Requests Only

In the Network tab filter box, type: collect

This narrows down to GA4 requests only. Ignore everything else.

Step 2: Clear and Reload

Click the 🚫 icon to clear the Network tab. Reload the page. Now you’re seeing ONLY post-load requests.

Step 3: Trigger Your Critical Events

Don’t just load the page. Actually interact:

  • Click your main CTA button
  • Submit a form
  • Complete a purchase
  • Watch for corresponding collect requests

Step 4: For Each Request, Check Three Things

  1. Status: 204 or 200 = good. Anything else = problem.
  2. Type: Should be ping or fetch
  3. Timing: Should complete in <500ms

Step 5: Inspect the Request Payload

Click on a collect request → “Payload” tab → “Query String Parameters”

Verify:

  • tid = your GA4 Measurement ID
  • en = the event name you expect
  • cid = client ID exists
  • Event-specific parameters (e.g., tr for transaction value)

If any of these are missing or wrong, you have a Layer 2 (Implementation) problem, not Layer 3.

The Transmission Checklist

Before escalating to GA4 support or blaming your tracking setup:

Run this checklist:

  1. ✅ Open Network tab → Filter for “collect” → Do requests appear?
  2. ✅ Check request status → 204 or 200?
  3. ✅ Test in incognito (no extensions) → Does behavior change?
  4. ✅ Check consent banner → Did you grant consent?
  5. ✅ Verify Measurement ID in request payload → Matches your GA4 property?
  6. ✅ If using sGTM → Check server logs for relay to Google

If all six pass but data still doesn’t appear in GA4, move to Layer 4 (Processing) diagnostics.

If any fail, you’ve found your transmission failure.

What This Means for Your Business

Transmission failures are unique because they create a specific type of blindness: GTM looks healthy, but GA4 is empty.

This leads to diagnostic dead ends:

  • Your team rebuilds GTM repeatedly (doesn’t help)
  • You blame GA4 (not the problem)
  • You assume low traffic (actually blocked traffic)

Real business consequences:

Case 1: The $300K Attribution Gap

  • Client spent $300K on ads over 3 weeks
  • Corporate firewall blocked GA4 transmission
  • Google Ads optimized to incomplete data
  • Wasted 40% of spend on channels that weren’t converting
  • All because requests never left the building

Case 2: The 40% Invisible Traffic

  • E-commerce site saw 10K visitors/day in GA4
  • Actually had 16K (40% blocked by ad blockers)
  • Marketing team under-budgeted for server capacity
  • Site crashed during Black Friday
  • Lost $500K in sales because they planned for reported traffic, not actual traffic

Case 3: The sGTM Money Pit

  • Agency charged $15K to implement sGTM
  • Configured browser → sGTM perfectly
  • Never tested sGTM → Google relay
  • Client paid for infrastructure that sent zero data
  • Took 2 months to discover nothing was working

Layer 3 problems don’t just affect your analytics—they affect every business decision based on that analytics.

You can’t optimize what you can’t measure. And if transmission is broken, you’re optimizing against phantom data.


Dealing with persistent transmission issues? Our diagnostic service inspects the complete data flow from browser to GA4, identifies where requests are failing, and provides a fix or detailed remediation plan. Learn more about our GTM Transmission Diagnostic.

GTM

GTM Setup Services

Emergency GTM recovery and tracking experts. 247+ successful recoveries completed.

Having GTM Tracking Issues?

Get your tracking fixed by the experts. Emergency recovery in 2-4 hours.

Get Emergency GTM Fix - $397