A page looks fine, the tag "should" be firing, and GA4 still shows nothing. Here's the order we actually check things in, based on auditing a lot of landing pages that had this exact problem.
The single most common cause: someone made changes in Google Tag Manager, tested them in Preview mode, and never clicked Submit to publish. Preview mode can make a broken setup look like it's working, right up until a real visitor loads the page and gets nothing.
Check GTM's version history — if the live version doesn't match what you expect, that's your answer.
A GA4 Configuration tag firing with the wrong Measurement ID will "work" from the page's point of view — no errors, no console warnings — while sending data to a property nobody's looking at, or a property that no longer exists. Compare the ID in the tag against Admin → Data Streams in the actual GA4 property you're checking.
If the site uses a cookie consent banner, GA4 may be correctly waiting for consent before it sends anything — which is expected, compliant behaviour, not a bug. The test: does data start flowing after you accept the banner yourself? If yes, tracking is working correctly and this was never actually broken.
A single unrelated JS error elsewhere on the page can stop every script that loads after it — including GTM — from ever running. Open the browser console on the actual page and look for red errors that fire before GTM's own scripts.
The GA4 Configuration tag existing isn't the same as it being set to fire. A trigger scoped too narrowly (e.g. a specific URL match that no longer matches after a redesign) will leave a perfectly valid tag permanently dormant.
Want this checked automatically, along with everything else that affects PPC and SEO on the page?
Run a free check on your own site →