Debugging GA4 — How to Check if Tracking Actually Works
Contents
You see strange numbers in GA4 — an event isn't showing up, a value is zero, or a report shows something you didn't expect? Before you start suspecting the code, go through a systematic debugging process. Here's the order I check things in.
Step 1: DebugView — the First Line of Defense
GA4 Admin → DebugView shows events in real time from your device. To make it work, you need to enable debug mode:
- Chrome extension — install Google Analytics Debugger, events from that browser flow into DebugView
- GTM Preview mode — if your tags live in GTM, Preview automatically enables debug mode
- URL parameter — add
?_dbg=1(for gtag.js) to the page address
What to look for: does the event show up at all (can be delayed up to 30 seconds), does it have the expected parameters, are user_properties set correctly.
Step 2: Network Tab — Did the Request Even Fire
DebugView only shows what GA4 managed to process. Sometimes the event never arrives at all — check DevTools → Network, filter by collect? (domain google-analytics.com/g/collect or a regional variant).
If there's no request at all:
- Check whether gtag.js/GTM loaded at all (ad blocker? CSP blocking the domain?)
- Check whether the event fires before the dataLayer has the data it needs (a classic mistake with
purchase)
If the request exists but has a status other than 200 — check the payload, the problem is often a malformed parameter.
Step 3: GTM Preview — Did the Tag Even Fire
In GTM Preview you can see exactly which tags fired for a given event, and why others didn't. The most common reasons a tag "didn't fire":
- Trigger condition not met — e.g. the trigger waits for
dataLayer.event === 'purchase', but the code sends'Purchase'(case sensitivity matters) - Tag sequencing — the GA4 Config tag must fire before the event tag, otherwise the event goes out unconfigured
- Consent mode — if the user hasn't granted consent and the tag has a consent check, it won't fire at all
Step 4: Realtime Report — Verification on Live Traffic
DebugView only shows your own device. To confirm an event actually works in production for other users — GA4 → Reports → Realtime. Filter by event name, wait a few minutes.
If you see the event in DebugView but not in Realtime — the tag is likely only deployed in the GTM preview/staging version, not in the published container.
Most Common Causes of a "Missing" Event
- Unpublished GTM container — Preview runs on the draft version, production sees the last published version
- Duplicate GA4 config tag — two Configuration tags with the same Measurement ID = duplicated events or a conflict
- Ad blockers / browsers with ITP — Safari and Firefox are increasingly aggressive about blocking trackers, expect real traffic to be undercounted
- Misconfigured cross-domain tracking — the session breaks between subdomains, the event fires but without session continuity
TL;DR
- Debugging order: DebugView → Network tab → GTM Preview → Realtime Report
- DebugView only shows your own device — use Realtime to verify on production
- GTM triggers are case-sensitive and strict about the exact event name in the dataLayer
- The GTM container must be published — Preview is not the same as production
- Ad blockers and Safari/Firefox ITP are a normal cause of undercounted traffic, not a code bug
Seeing the same issue in your GA4?
I'll review your setup as part of a GA4 audit. The first call is free.
Book a consultationMore articles about data analytics:
Back to blog