All articles
ga42026-07-06

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

  1. Unpublished GTM container — Preview runs on the draft version, production sees the last published version
  2. Duplicate GA4 config tag — two Configuration tags with the same Measurement ID = duplicated events or a conflict
  3. Ad blockers / browsers with ITP — Safari and Firefox are increasingly aggressive about blocking trackers, expect real traffic to be undercounted
  4. 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 consultation

More articles about data analytics:

Back to blog