GA4 Live Debugger Documentation
Everything you need to inspect GA4 hits, monitor your DataLayer, and catch tracking issues before they reach production. This guide covers setup, feature configuration, and common troubleshooting scenarios.
New to the extension? Start with the product overview to see what it does at a glance.
Hit Inspection & Routing
The feed captures every GA4 network request in real time. Hits automatically group by page navigation so you can trace exactly what fired and when.
Transport Badges
Each hit shows a badge indicating where the request is being sent. This tells you at a glance whether data is going client-side, through a proxy, or to a server-side GTM container.
| Badge | What It Means |
|---|---|
| Client-Side | Sent directly to Google-owned endpoints (default behavior) |
| Gateway | Proxied through Google Tag Gateway |
| sGTM 1P | Routed to a first-party server-side GTM environment |
| sGTM Provider | Sent to a known third-party sGTM hosting provider (e.g., Stape) |
| sGTM Self | Sent to a self-hosted server-side endpoint |
Batch Unpacking
GA4 often batches multiple events into a single network request. The debugger unpacks these automatically. Each event displays as its own card with a numeric indicator showing its position in the original batch. No manual payload inspection needed.
DataLayer Monitoring & Correlation
The DataLayer tab captures every dataLayer.push() in real time. You can toggle between a formatted table view and raw JSON for each push.
Historical Pushes
Events that fired before the extension initialized are tagged with a Historical badge. The extension reads these retroactively from the array so you don't miss anything, even if you open the panel late.
E-commerce Validation
E-commerce events are automatically checked against GA4's expected schema. You'll see inline error badges for:
- Missing
transaction_idon purchase events - Malformed or missing
itemsarrays - Required item-level fields that are absent
Event Correlation
The debugger links each DataLayer push to its resulting GA4 network hit. Matched pairs show a link badge. Click it to jump directly to the corresponding card.
When correlation breaks, you'll see one of two states:
- Orphaned DataLayer Push: A push fired but no GA4 hit followed. Likely causes: tag trigger not configured, consent denied, or the event name doesn't match any tag.
- Orphaned GA4 Hit: A network request fired without a preceding push. This typically means a hardcoded
gtag('event', ...)call that bypasses GTM entirely.
Diagnostics & Warnings
The Diagnostics panel runs automated checks against your tracking implementation and surfaces issues you'd otherwise have to hunt for manually.
Consent Mode
The extension decodes consent parameters from each network request and reports the active state for ad_storage and analytics_storage. It also surfaces default consent values set via the DataLayer, so you can confirm your CMP is firing correctly before any user interaction.
Payload & Event Warnings
| Warning | Why It Matters |
|---|---|
| Oversized Payload | Batch exceeds 130KB. Google silently drops requests over this limit. |
| Duplicate Pageviews | Multiple page_view events for the same Measurement ID on one URL. Inflates your session and pageview counts. |
| Legacy UA Hits | Universal Analytics requests still firing. These endpoints are deprecated and the data goes nowhere useful. |
Implementation Audits
| Audit | What It Checks |
|---|---|
| Mixed Implementation | Both GTM and hardcoded gtag.js are firing on the same page. Pick one to avoid duplicate events. |
| Ghost DataLayer | DataLayer pushes exist but GTM never loaded. Usually caused by ad blockers or privacy extensions blocking the GTM script. |
| GTM Placement | Synchronous scripts load before GTM in the <head>, or the noscript iframe is misplaced. Both can delay or break tag execution. |
| Non-Production Container | A staging or preview GTM environment is deployed on what appears to be a production page. |
Control Modes
Two toggle switches in the toolbar control how the extension interacts with outgoing requests.
Debug Mode
Appends the debug_mode=1 parameter to all outgoing GA4 requests. These hits appear in your GA4 property's DebugView in real time.
Block Mode
Intercepts GA4 requests at the network level and prevents them from leaving the browser. Hits still appear in the debugger feed so you can inspect every parameter, but nothing reaches Google's servers.
When to use it:
- QA testing on production without inflating real metrics
- Validating event parameters before going live
- Debugging consent implementations without sending denied-consent pings
Data Dictionary & Team Sync
The Data Dictionary brings your tracking plan into the debugger. Hover over any event name or parameter in the feed to see its definition in a tooltip. No more switching between spreadsheets and the browser.
Adding Definitions
Open the extension settings to manage your dictionary. You have two options:
- Manual entry: Add individual event or parameter definitions one at a time.
- CSV import: Bulk import from a file. Useful for migrating from an existing tracking spec.
Definitions can be scoped to Global, Account, Property, or Measurement ID level. Narrower scopes override broader ones.
Team Sync via Google Sheets
Keep your entire team working from the same definitions without manual exports:
- Create a Google Sheet with your tracking plan definitions.
- Publish the sheet to the web as CSV (File → Share → Publish to web → CSV).
- Paste the published URL into the Team Sync field in extension settings.
The extension syncs in the background. Imported definitions show as read-only in the UI to prevent local drift from the source of truth.
Export & Console Logging
Two ways to get data out of the debugger and into your workflow.
Exporting Data
Click the Export button in the overflow menu (⋮). Available formats:
- CSV: Opens directly in Excel or Sheets
- TSV: Tab-separated, useful for pasting into documents
- JSON: Full structured data, ideal for scripts or automated checks
You can scope exports to visible hits only, all captured hits, or a specific combination of GA4 requests and DataLayer pushes.
Console Logging
Mirrors every captured event directly to Chrome DevTools console as structured, formatted objects. This is useful when you need hit inspection available without the side panel open, for example while you're actively working in the Elements or Network panels.
Troubleshooting
Check your filters. If you've filtered to specific event types, other hits won't show. Reset filters to confirm hits are actually missing.
Check for ad blockers. Extensions like uBlock Origin can intercept GA4 requests before this extension reads them. Try disabling other extensions temporarily.
Verify the page has GA4. Open DevTools Network tab and filter for collect. If nothing appears there either, the page isn't sending GA4 hits at all.
Confirm DataLayer monitoring is on. Toggle it via the DataLayer switch in the panel toolbar.
Check your array name. If the site uses a custom DataLayer name (anything other than window.dataLayer), update the Custom DataLayer Name field in extension settings.
Timing issue. If the DataLayer was populated before you opened the panel, historical pushes should still appear with the Historical badge. If they don't, try a full page reload with the panel already open.
Verify the sheet is published. Open the URL you pasted in a private/incognito window. If you see CSV data, it's working. If you get a login prompt, the sheet isn't publicly published.
Check the format. Make sure you published as CSV, not HTML or TSV. The URL should end in /pub?output=csv.
Force refresh. Click Force Sync Now in settings to trigger an immediate pull instead of waiting for the background interval.
Check for sGTM routing. If your site sends hits to a first-party server-side endpoint, Block Mode may not recognize the custom domain. Verify the routing badge on the hits that are getting through.
Reload after toggling. Some hits may have already been queued before Block Mode activated. A page reload ensures all new requests go through the blocking rules.
Orphaned GA4 Hits (no DataLayer push): These are typically hardcoded gtag() calls that fire directly without going through the DataLayer. They're expected if you use gtag.js alongside GTM, or if Google auto-collects events like scroll or click.
Orphaned DataLayer Pushes (no hit): Check if consent is blocking the tag from firing. Also verify the event name matches a trigger condition in GTM. A push that doesn't match any trigger will never produce a hit.
Ready to debug your GA4 implementation?
Free, no account required. Everything runs locally in your browser.
Add GA4 Live Debugger to Chrome