What dataLayer traffic looks like
The GTM data layer never touches the network: its "traffic" is JavaScript push calls on a page-level array.
- Data layer object
window.dataLayer.push({ event: 'add_to_cart', ecommerce: {...} }). Theeventkey is what GTM triggers match against; the rest becomes data layer variables- Transport
- None: page-level JavaScript only. Event Watcher detects pushes by intercepting the push calls themselves, not by URL patterns
- Built-in events
- GTM lifecycle (
gtm.js,gtm.dom,gtm.load) and interaction events (gtm.click,gtm.linkClick,gtm.scrollDepth), plusgtm.uniqueEventIdstamps on processed pushes - Consent signals
- Google Consent Mode rides this channel:
gtag('consent', ...)calls land as arguments-style entries in the same array
A typical push, as Event Watcher captures it:
{
"event": "add_to_cart",
"ecommerce": {
"currency": "DKK",
"value": 499,
"items": [{ "item_id": "SKU-123", "item_name": "Trail Runner", "quantity": 1 }]
}
}
Debugging dataLayer with Event Watcher
- Every push appears in the live stream as its own event, with source attribution: a stack-trace classification of website code, tag manager, or third-party script.
- Pushes that fired before DevTools was opened are captured too and flagged as historical, so the pre-load burst is not lost.
- The Grouped view's Datalayer pivot collects pushes separately from the network noise.
- Any push can be copied out as JSON for a ticket or a spec comparison.
dataLayer and consent
Consent-exempt infrastructureThe data layer is consent infrastructure, not a consent-gated tracker, so it carries no consent category. It is the channel consent state travels through: CMPs push decisions into it, and Consent Mode defaults and updates flow to GTM.
Event Watcher's CMP detection reads exactly this surface, and the ordering of those pushes relative to tag firing is where most consent bugs live. See GA4 fires before consent for the canonical case.
Common debugging scenarios
- "Who pushed this event?" The push's source attribution answers it (website code, tag manager, or third-party script) before you blame the frontend team. See the guide.
- A push seems to vanish. It probably fired before you opened DevTools. The stream keeps it among the historical pushes, no re-triggering needed.
- Ecommerce data bleeding between events. GTM's data layer merges state, so a stale
ecommerceobject persists unless cleared withecommerce: null. Comparing consecutive push payloads in the stream shows it. - Trigger never fires. The stream shows the exact
eventstring pushed. Diff it against the trigger's expected name; case and underscores matter. - SPA route changes. The stream shows whether a virtual pageview push actually fires on navigation, and in the right order relative to dependent tags.