What we check
The check reads the delivered HTML for window.dataLayer being created and at least one push() following it. Both spellings count: the explicit window.dataLayer = window.dataLayer || [] and the w[l]=w[l]||[] from the official GTM snippet. A push without a visible initialisation counts as populated, because without initialisation the browser would throw.
What the scan cannot see: pushes from lazy-loaded JavaScript bundles, events that only exist after clicks, and whether the parameters follow GA4 notation. That needs a browser. The deep scan brings one for view_item on shops; everything else is audit work.
Why it matters
The dataLayer is the contract between website and tag manager. Without it, triggers hang on CSS classes and DOM paths, which works exactly until the next redesign, then conversion measurement breaks and nobody notices, because GA4 simply counts less. With a dataLayer the events stay stable no matter what the frontend looks like. Redesign, new theme, new shop: same events. Structure and naming conventions are covered in the guide What is a dataLayer?
Common causes
- GTM was installed without a dataLayer concept, all triggers hang on click selectors instead of events.
- The theme initialises the dataLayer after the GTM snippet and overwrites the events already collected.
- A shop system ships its own dataLayer under a different name, GTM listens to the standard one.
- Events are only pushed on some templates, checkout or forms stay silent.