Data collection is about whether GA4 is actually seeing what happens on the site. Problems here are invisible in the reports — a page that doesn't fire the tag looks like a page that nobody visits, not like a broken page.
Image placeholder
Tag Assistant verification walkthrough
A screenshot-style image showing the Tag Assistant Chrome extension open on a product page with a GA4 hit highlighted, confirming the tag fires correctly and showing event parameters (event_name: page_view, measurement_id: G-XXXXXXX). The panel shows a clean single hit with no duplicate tags, to model what a passing result looks like for an analyst who has not used Tag Assistant before.
| Check | What to look for | How to verify | Fix if failing |
|---|---|---|---|
| Tag coverage | GA4 fires on every page type: home, product, blog, checkout, confirmation | Real-time report while browsing each page type, or Tag Assistant Chrome extension | Add missing GTM trigger or page-level tag inclusion |
| Single tag | Only one GA4 tag firing per page (duplicate tags double-count events) | Tag Assistant: check for multiple G-XXXXXXX hits on the same page | Remove duplicate tag from GTM or from hardcoded script |
| Enhanced measurement | Which auto-events are on: scroll, outbound clicks, site search, video, file downloads | Admin: Data Streams: Enhanced Measurement settings | Turn off any auto-events already captured by custom tags (prevents double-counting) |
| Dev/staging separation | Test and development environments are not sending data to the production property | Check hostname in the Pages report — staging URLs should not appear | Use a separate GA4 property for staging, or add a hostname filter to exclude non-production domains |
| dataLayer structure | If using GTM, the dataLayer pushes are formatted correctly and firing at the right point in the page lifecycle | Browser console: window.dataLayer after triggering an event |
Fix push timing (push before GTM fires, not after); fix key casing (snake_case throughout) |
Image placeholder
dataLayer push timing diagram
A diagram showing the page lifecycle timeline (DOMContentLoaded, GTM fires, dataLayer.push, GA4 hit sent) annotated to show the correct moment to push dataLayer values before GA4 reads them. A second timeline below shows the incorrect order (dataLayer.push fires after the GA4 hit, so values are missing from the event) to illustrate the bug this timing issue causes and how it would appear in DebugView.