Home / Guides

Debugging GA4 when DebugView shows nothing

Why the debug stream stays empty, what a /g/collect request actually contains, and how to check GA4 on production without switching debug mode on.

DebugView is the tool Google gives you for this, and when it works it is the right answer: it shows what GA4 received, after processing, in the property you are looking at. The trouble is how many ways it can show nothing at all while the site is sending events perfectly well.

What DebugView can and cannot show

DebugView is a view of one debug-enabled device, on one property, after Google has accepted the data. That framing explains both its value and its limits.

Why the stream stays empty

Roughly in order of how often it turns out to be the cause:

  1. Debug mode is not actually on. GTM Preview sets it, the GA Debugger extension sets it, and a debug_mode parameter on the config sets it. Nothing else does, and a Preview session expiring in another tab turns it back off without saying so.
  2. You are looking at the wrong property. The page sends to one measurement ID and DebugView is open on another. Common wherever a staging and a production property both exist.
  3. Consent Mode is denying storage. Hits still leave as cookieless pings, but the device identification DebugView relies on is weaker and the device can fail to appear in the picker at all.
  4. Something stopped the request. A content blocker, a corporate proxy, or a Content Security Policy that does not allow www.google-analytics.com. The tag ran; nothing left.
  5. A server container in the middle. On server-side GTM with a misconfigured client, hits reach your own endpoint and stop there, which looks exactly like the tag never firing.

The first three you can rule out from Google's own interfaces. The last two you cannot — they happen before GA4 ever sees anything, which is precisely where a request-level view is the only witness.

Reading a /g/collect request

Every GA4 event is a request to /g/collect, and the whole event is in the query string. Once you can read it, you no longer need debug mode to know what was sent:

Why the order looks wrong

GA4 does not send one request per event. Events fired close together are batched, and a batch goes out as a POST with one event per line in the body instead of a GET. On page unload the transport switches to sendBeacon. So the request timeline and the event timeline are not the same thing: a purchase can appear in the network log after a page view that happened later.

This is why matching events to their cause by arrival time gives the wrong answer, and why it has to be done by event name and payload instead.

The Tag Master panel showing a decoded GA4 purchase hit: measurement ID, event name, consent state, the full /g/collect URL and the item table read out of the pr1 parameter.
One purchase hit, decoded. The query string is on top and the items read out of it below, so a three-item cart that shipped one item is visible without opening DebugView.

Tag Master decodes /g/collect — including batched POST bodies — into readable events, and links each one back to the dataLayer push that produced it. No debug mode, no account, and it works on a site you did not build.

The failure DebugView cannot show you

The most expensive GA4 bugs are not missing events. They are events that arrive looking healthy and carry the wrong payload. The dataLayer pushed three items and 1648.25 TRY; the tag sent one item and no currency. DebugView shows you the one item and it looks fine, because DebugView has no idea what the page intended.

Finding that class of bug needs both halves side by side: what the site pushed, and what actually left the browser. That comparison is the reason this extension exists.

A routine that works on production

  1. Open the panel and reload. Every GA4 hit appears whether or not debug mode is on.
  2. Check tid on the first hit. The wrong property is the cheapest bug to find and the easiest to overlook.
  3. Walk the funnel. Watch _s increment without gaps and cid stay constant.
  4. On the conversion, compare the push against the hit: item count, value, currency, transaction ID.
  5. If a hit is missing, establish whether the tag fired at all. A tag that never ran and a request that was blocked look identical in a report and completely different here.

When DebugView is still the right tool

Use it when the question is whether Google accepted the data. If hits leave the browser correctly and the reports still disagree, the problem is on Google's side of the line — an internal traffic filter, a data stream misconfiguration, a reporting identity setting — and no browser tool can see any of that. The two views answer different questions, and a stubborn problem usually needs both.

Related guides

Try it on your own site

Tag Master is free, needs no account, and collects no data.

Add to Chrome — Free