Loading tutorials…
Loading tutorials…
GA4 Realtime is supposed to show traffic within 60 seconds. When it shows zero — and your site is clearly getting visits — the cause is one of about six things. This is the diagnostic order.
Who this is forOwners who installed GA4 (or thought they did) and now can't get Realtime to show their own traffic, let alone real users. This is one of the most common GA4 issues and the fix is usually 30-60 minutes once you know where to look.
What you'll need
Step 1
Realtime shows the last 30 minutes. If your site has zero traffic in 30 minutes, Realtime will be empty — and that's correct.
Open your site in a separate, clean browser tab (no ad blockers). Refresh or browse a few pages.
In GA4 → Reports → Realtime, wait 60 seconds. Look at "Users in last 30 minutes."
If it goes from 0 to 1 within 60 seconds, Realtime is working — you just had no traffic before. Done.
If it stays at 0 after 5 minutes despite you actively browsing, Realtime isn't capturing your session. Continue to the next step.
Edge case: GA4 internal-traffic filters might be excluding your IP. Check Admin → Data Filters → Internal Traffic. Temporarily set the filter state to Testing to see if your traffic appears.
Step 2
Open browser DevTools → Console. Type "gtag" and press enter. If gtag is a function, the tag is loaded. If undefined, the tag never loaded.
In a clean browser tab, visit your site. Open DevTools (F12 or right-click → Inspect).
Go to the Console tab.
Type: typeof gtag and press Enter. Response should be "function" — that confirms the gtag.js library loaded.
If response is "undefined", the tag never loaded on this page. Causes: (a) tag installed on only specific pages; (b) tag installed in <body> but blocked by some script error before it; (c) GTM container failed to load.
Also type: dataLayer and press Enter. Response should be an array with events. If empty or undefined, the dataLayer isn't initialized — common when only the noscript snippet was installed.
Then in Console, type: dataLayer.push({event: 'realtime_test'}) and press Enter. Within 60 seconds, this should appear in DebugView (and Realtime if you marked it as a key event).
Step 3
Verify the G-XXXXXXXXXX in your install code exactly matches the one in your GA4 property's data stream.
In GA4 → Admin → Data Streams → click your Web stream. Copy the Measurement ID at the top (G-XXXXXXXXXX).
In your site code or GTM container, find where the Measurement ID is set: direct gtag.js → it's in the gtag('config', 'G-XXXXXXXXXX') line. GTM → it's in the Google Tag's configuration panel.
Compare character by character. Common errors: extra space, wrong character (0 vs O), copy-paste from the wrong property.
If they don't match, fix the install. Wait 24 hours and retry Realtime.
Another check: in DevTools Network tab, filter for "collect" — you should see requests to https://www.google-analytics.com/g/collect or https://*.analytics.google.com/g/collect when you navigate pages. The query parameter tid= contains the Measurement ID actually being sent. If tid= doesn't match your property's Measurement ID, you've confirmed the mismatch.
Step 4
DebugView is more reliable than Realtime for debugging. Install the GA Debugger extension, visit your site, watch DebugView.
Install the Google Analytics Debugger Chrome extension (free, official). Enable it on the toolbar.
In GA4 → Admin → DebugView (in the property column).
In a separate tab with the debugger extension enabled, visit your site. DebugView should show your session within 30 seconds.
DebugView shows EVERY event firing in real time with all parameters. If page_view appears here but not in Realtime, the events are flowing — Realtime just has a longer cache time (60 seconds vs 5 seconds).
If DebugView is also empty, the install isn't working at all — go back to step 2.
Bonus: leave the GA Debugger extension on while developing. It logs every event to the browser console with full parameters — invaluable for diagnosing event configuration issues.
Step 5
uBlock Origin, AdGuard, Brave, Firefox tracking protection, and Safari ITP all block GA4 by default. Your own browser might be hiding your own traffic.
Disable all browser extensions, especially: uBlock Origin, AdGuard, Privacy Badger, Ghostery, DuckDuckGo Privacy Essentials.
Open an Incognito/Private window — these typically disable extensions by default, but verify in the extension settings.
Disable any built-in tracker blocking: Firefox → Settings → Privacy & Security → Custom → uncheck Tracking content. Brave → Brave Shields → Off for your site. Safari → Preferences → Privacy → uncheck Prevent cross-site tracking.
Test on a different device: your phone with mobile data (not your home network with PiHole/router-level blockers), or a coworker's machine.
If GA4 starts showing data when blockers are off, your install is fine — you were just hiding your own traffic. Most ecommerce/SaaS users don't use ad blockers, so production data will be intact.
Step 6
Two GA4 tags firing on the same page can cause events to be deduplicated or dropped. Check for direct gtag.js AND a GTM-managed tag both installed.
In DevTools Network tab, filter for 'collect'. Browse a few pages. Count the requests to /g/collect.
Each page should fire exactly ONE page_view collect request. If you see 2 per page, you have a double-install.
Common double-install patterns: (1) GTM container fires GA4 + direct gtag.js snippet still in theme.liquid; (2) Site Kit plugin in WordPress + manual gtag.js in functions.php; (3) Shopify's Google channel + leftover liquid snippet from an old setup.
Find the duplicate. Remove the older/redundant one. Re-test Realtime.
In GTM, also check the Variables tab. If you have multiple Google Tag tags in the same container all firing on All Pages, they're double-installing. Consolidate to one.
Step 7
GTM Preview mode works locally but doesn't fire tags in production. Publishing the container is required.
In GTM, look at the top bar. You'll see a Workspace Changes counter (e.g., "3 workspace changes").
Click Submit (top right). On the next screen, click Publish.
Add a Version Name and Description if you want (good practice). Click Publish.
Verify in GTM → Admin → Container → Container Settings. The published version number should match what you just submitted.
Now visit your site in a clean browser. Open DevTools → Console and type gtag — it should be a function. Realtime should show your session within 60 seconds.
If Realtime still shows nothing after publishing, the GTM container itself isn't loading on your site. Check that the GTM snippet (GTM-XXXXXX) is in the <head> on every page.
Common mistakes
Testing with your own ad-blocked browser
What goes wrong: You spend 4 hours debugging an install that's actually fine — you just have uBlock Origin enabled. Production data is intact; you're fixing a problem that doesn't exist.
How to avoid: Always test in a clean incognito window with all extensions disabled, OR use a separate device (phone on mobile data). Verify production data with DebugView, not your own browser.
Measurement ID typo
What goes wrong: Data is being sent to a non-existent property. GA4 silently drops it. Your property shows zero traffic forever.
How to avoid: Copy the Measurement ID directly from Admin → Data Streams (not retyped). Compare to the value in your install code character by character. Verify via Network tab tid= parameter.
Tag installed on only the homepage
What goes wrong: Realtime shows your homepage visit and you call it done. But product pages, checkout, and conversion pages have no tracking. 80% of your funnel data is missing and you don't notice for weeks.
How to avoid: Install the tag site-wide via a master template, GTM container in the global head, or a platform integration that handles all pages. Verify on at least 3 page templates (home, product, checkout) using DebugView.
GTM container loaded but not published
What goes wrong: You spend an hour configuring tags in GTM, test in Preview mode, everything works. Then production stays empty for days because you never clicked Publish. Realtime is empty for real users.
How to avoid: Always click Submit → Publish after testing. Verify the published version number increased. Test in a clean browser that GTM is loading and firing.
Internal-traffic filter excluding your IP
What goes wrong: You set up an internal-traffic filter, then can't figure out why your own browsing isn't showing in Realtime. Filter is doing exactly what you configured.
How to avoid: For diagnosis, set the filter state to Testing in Admin → Data Filters. Test from your office IP. Once verified, set back to Active. Or test from a different network (mobile data).
Multiple GA4 tags firing on the same page
What goes wrong: Tags installed both via GTM and a leftover direct gtag.js snippet. Every page fires 2 page_views. Realtime shows correct numbers (it deduplicates), but Reports show 2x reality.
How to avoid: Check the Network tab for duplicate /g/collect requests per page. Remove the duplicate install. Most often: comment out the legacy gtag.js snippet in theme files once GTM is verified working.
Recap
Done — what's next
How to set up Google Analytics 4 from scratch
Read the next tutorial
Hand it off
Diagnosing this once might take you 2 hours. Preventing it from happening again (and again) is a different job. A vetted GA4 specialist can audit your install, fix the underlying issue, and set up alerts for tracking degradation — typically $80-200 for the audit + fix at $14-16/hr.
See specialist rates
Page views and events appear in Realtime within 60 seconds of firing. If you wait 5 minutes and still see nothing, the install is broken — Realtime isn't delayed beyond a minute or two.
Realtime requires the standard collect endpoint to receive data, while DebugView accepts data flagged with debug_mode=1 (which the GA Debugger extension sets). If DebugView works but Realtime doesn't, your debug-flagged sessions are reaching GA4 but production traffic isn't — usually because production users have the install missing on some pages.
No. Realtime works from the first event fired. Standard reports (not Realtime) take 24-48 hours to populate, but Realtime is, well, real-time. If Realtime is empty 5 minutes after a confirmed event, the install is broken.
Cloudflare's basic plan doesn't block GA4. But Cloudflare's Bot Fight Mode, Super Bot Fight Mode, or Page Rules with aggressive caching can interfere. If you have GA4 events firing intermittently, check Cloudflare's Security → Events log for blocked requests.
Generally no. Some corporate/enterprise networks block analytics.google.com via DNS — if you suspect this, test from mobile data. But residential ISPs and consumer VPNs (NordVPN, ExpressVPN) don't block GA4 traffic.
Three usual causes: (1) the events were fired in debug mode only and didn't reach standard collection — unlikely if real users are also firing them; (2) data threshold reporting is hiding low-volume data — check Reports → User Settings → Off for data-thresholding; (3) you're viewing the wrong property in the GA4 navigation top bar. Switch properties and recheck.
Google Analytics 4
GA4 isn't hard to install — it's hard to install *correctly* so the data is actually usable six months from now. This is the walkthrough that prevents the rebuild most owners do at month four.
Google Analytics 4
GTM is the right install path for any site that runs more than one tracking pixel. It's also where most DIY installs go sideways — wrong trigger, wrong variable, wrong fire order. Here's the path that actually works.
Google Analytics 4
If your funnel crosses domains — marketing site to app, storefront to external checkout, landing page to booking platform — every cross-domain hop loses attribution unless you configure this. Most sites haven't.
Google Analytics 4
DIY GA4 is a great idea — until it isn't. This is the honest framework: when the cost of unreliable data exceeds the cost of hiring help, and how to tell which side you're on.