Problems here are invisible in reports: a page that doesn't fire the tag looks like a page nobody visits, not a broken page.
Image placeholder
Tag Assistant verification walkthrough
Screenshot of Tag Assistant open on a product page with a GA4 hit highlighted and its event parameters (event_name: page_view, measurement_id: G-XXXXXXX). A clean single hit with no duplicate tags models a passing result.
| Check | What to look for | How to verify | Fix if failing |
|---|---|---|---|
| Tag coverage | Fires on every page type: home, product, blog, checkout, confirmation | Real-time report on each page type, or Tag Assistant | Add the missing GTM trigger or page-level tag |
| Single tag | One GA4 tag per page (duplicates double-count events) | Tag Assistant: multiple G-XXXXXXX hits on one page | Remove the duplicate from GTM or the hardcoded script |
| Enhanced measurement | Which auto-events are on: scroll, outbound clicks, site search, video, downloads | Admin: Data Streams: Enhanced Measurement settings | Turn off auto-events your custom tags already capture |
| Dev/staging separation | Test and dev environments don't send to the production property | Hostname in the Pages report: no staging URLs | Use a separate staging property, or filter out non-production hostnames |
| dataLayer structure | GTM dataLayer pushes are formatted correctly and fire at the right point in the page lifecycle | Browser console: window.dataLayer after triggering an event |
Push before GTM fires, not after; use snake_case keys throughout |
Image placeholder
dataLayer push timing diagram
Page lifecycle timeline (DOMContentLoaded, GTM fires, dataLayer.push, GA4 hit sent) marking the correct moment to push values before GA4 reads them. A second timeline shows the wrong order (push after the GA4 hit, so values are missing) and how the bug appears in DebugView.