Something in your GA4 data looks wrong.
Here's how to know for sure.
From an empty Realtime report to numbers that don't match Shopify — find the symptom you're seeing below, matched to the exact page that walks you through the fix. No guessing, no starting from a blank Google search.
Or skip the diagnosis and let your web analyst find the problem for you.
Nothing's showing up.
Empty reports can mean three different things: nothing ever fired, something fired and got filtered out, or something fired and GA4 is choosing not to show it to you yet.
Why is there no data at all — Realtime shows zero?
If Realtime shows zero active users on your own test visit, the tag usually isn't firing at all. Check for a missing or mistyped Measurement ID, a Consent Mode default that's blocking storage until the visitor consents, or a container that was configured in GTM but never actually published. Ad blockers and privacy extensions swallow the request the same way a broken tag would — rule those out on a clean browser profile before you assume your code is wrong.
Why are my conversions or key events missing?
Key events go missing for one of three reasons: the underlying event never fired, it fired but was never marked as a key event in Admin → Events, or it's using a name GA4 treats as reserved and silently alters. A purchase event missing a required parameter like transaction_id or value also registers as a normal event instead of a key event — which looks identical to 'not tracking' until you check its parameters directly.
Why are my audiences stuck at zero users?
A brand-new audience only counts users going forward — it doesn't backfill from historical data, so zero users for the first day or two is expected, not broken. Past that window, an empty audience is almost always a condition that never matches real traffic: a typo'd parameter value, an event that quietly stopped firing, or a membership duration set to zero days.
Why did my historical data disappear?
GA4's data retention default is 2 months for the event-level data used in free-form Explorations — anything older simply isn't queryable there, even though it still appears in the standard reports for up to 14 months. This is a setting, not a bug: Admin → Data Settings → Data Retention extends it to 14 months, but the extension only applies to data collected from that point forward, not retroactively.
Why won't GTM Preview mode connect?
Preview mode most often fails to connect because a browser extension is blocking Tag Assistant's connection request, a Content Security Policy is blocking the debug script, or you're previewing a workspace that was never actually published to the environment you're testing. On platforms like Shopify, a checkout or app-embedded page can also load a cached script from before your last container version.
The numbers are there, but wrong.
This is the expensive failure mode — dashboards look confident and populated while the attribution or counting logic underneath quietly misleads whoever's reading them.
Why does my traffic show as Direct or (unassigned)?
Direct means GA4 found no referrer and no campaign parameters at all — a stripped UTM, an app webview, or a bookmarked link are the usual causes. (unassigned) is different: the session had some data, just not enough to qualify for a defined channel, which commonly happens when a redirect chain — login walls, link shorteners, some consent banners — drops query parameters before your page tag ever sees them.
Why don't my GA4 numbers match Shopify or my ad platform?
Some gap is normal: Shopify, Meta, and Google Ads each use their own attribution window and model, and none of them match GA4's data-driven default, so channel credit was never going to line up exactly. A gap beyond roughly 10-15%, though, usually points to a tracking bug rather than a model difference — broken UTM parameters is the most common cause, closely followed by an attribution model nobody deliberately chose.
Why do my reports show (other), or totals that look too low?
(other) rows and suspiciously low totals are usually thresholding — GA4 withholds or aggregates rows once a dimension combination has too few users to report safely, and it applies before the report ever reaches you. It shows up most on granular, multi-dimension explorations and on lower-traffic properties; if you don't need cross-device reporting, disabling Google Signals removes the threshold entirely.
Why don't my bounce rate and engagement rate add up?
GA4 replaced bounce rate's old definition with engagement rate, and the two aren't simple opposites: a session counts as engaged if it lasts 10+ seconds, includes a key event, or has 2+ pageviews, so engagement rate and (1 minus bounce rate) can genuinely diverge. If you're comparing against Universal Analytics history, you're comparing two different definitions of a session — not the same metric that got worse.
The data is contaminated.
Inflated sessions, your own team's clicks, and personal data sitting in a report you didn't mean to collect — all technically working, all quietly wrong.
Why do my sessions look inflated, or split in two?
A session ends after 30 minutes of inactivity by default, at midnight, or when a new campaign source lands mid-visit — any of those can split one real visit into two counted sessions, inflating totals for content that keeps people around past the timeout. If you track users across multiple domains, an unconfigured cross-domain setup causes the same symptom for a different reason: GA4 treats the second domain as a brand-new session with a fresh referrer.
Why is my own team polluting the data?
Without an internal traffic filter, every visit from your office, your agency, and anyone testing the site counts as real user activity — inflating session counts and skewing conversion rates, especially on lower-traffic properties where a handful of QA sessions can move the needle. GA4 needs the internal IP range defined and the resulting filter set to Active, not Testing, before it actually excludes anything.
Am I leaking PII into GA4?
The most common leak isn't a form field — it's the URL itself. Query parameters like ?email= or ?phone= from password-reset links, magic-link logins, or a loosely built checkout get captured automatically as the page_location parameter, landing personal data in GA4 (and anywhere GA4 feeds, like Google Ads) without anyone writing a line of tracking code for it.
The numbers don't match another platform.
Every platform counts differently by design — Shopify counts money changing hands, Google Ads counts ad-click credit, GTM counts tags configured to fire. A gap is normal. The question is whether yours is the expected kind, or a bug hiding inside it.
Why doesn't my GA4 revenue match Shopify?
Ranked by how often each one actually explains a real mismatch: the GA4 tag not running on part of checkout, Consent Mode modeling away purchases from visitors who declined tracking, ad blockers silently dropping the purchase ping, and test orders or refunds moving Shopify's number after GA4 already recorded it. If GA4 shows more revenue than Shopify instead of less, that's a different problem — almost always a duplicate purchase tag.
Why is GA4 showing MORE revenue than Shopify — twice as much?
A near-exact 2:1 ratio between GA4 purchases and real Shopify orders is the signature of a duplicate — almost always Shopify's native Google & YouTube app running alongside a separately built GTM or gtag purchase tag. GA4's deduplication only catches two purchase events sharing the exact same transaction_id, and the two mechanisms usually generate different ones for the same order, so neither gets collapsed and both post.
Why don't my Google Ads and GA4 conversion counts match?
Some gap is structural, not a bug: Google Ads logs a conversion against the day of the ad click, GA4 logs it against the day it actually happened, and each platform computes attribution independently. A gap in the rough 10-30% range is unremarkable; a much bigger one, or one that flipped direction suddenly, is usually a native Ads tag and an imported GA4 key event both left set to Primary — double-counting every conversion.
Why do GA4 and GTM tell two different stories about the same traffic?
A GA4 audit only sees what arrived; a GTM audit only sees what's configured to fire — the most expensive bugs live in the gap between the two, invisible to either audit alone. The three recurring patterns: a measurement ID that drifted after a property migration (tags report 'fired successfully' into a property nobody's watching), a key event with no GTM tag actually wired to fire it, and two tags both firing on the same trigger, doubling revenue.
Explore More Free Tools
Troubleshooting Hub
Step-by-step fixes for common GA4 & GTM issues.
GA4 Glossary
Plain-English definitions for analytics jargon.
Regex Tester
Validate regular expressions for GA4 and GTM.
UTM Builder
Generate and validate GA4 campaign tracking links.
GA4 Audit Checklist
61 checks to validate your GA4 configuration.
Tracking Plan Generator
Paste a URL. Get a full GA4 tracking plan with code.
dataLayer Generator
GA4 ecommerce spec for Shopify, Woo, Next.js & more.
Consent Mode v2 Builder
GDPR + CCPA cookie banner scaffold in one click.
The audit finds all of this first.
Before you have to ask.
One scan checks all 16 of these symptoms — plus the checks Google never warns you about.