Why Your Lovable or Bolt App Shows Zero Traffic in Google Analytics

When an app built in Lovable, Bolt, or v0 shows zero traffic in Google Analytics, the cause is almost always one of five things: the Measurement ID is still a placeholder, the tag never shipped to production, GA4 hasn't finished its 24–48 hour processing window, ad blockers are stripping the request, or the app is a single-page app that fires one page_view and then goes silent on every in-app navigation. None of these mean nobody visited. They mean the signal never reached GA4 — or reached it and wasn't counted. Here is how to find which one is happening, in the order worth checking.

Is the Measurement ID real, and is the tag on the deployed site

The fastest win first. AI builders scaffold a Google Analytics snippet with a placeholder like G-XXXXXXXXXX, and it ships unchanged. Open your live site, view source, and search for your real ID (the G- followed by ten characters from GA4 Admin → Data Streams). If it's the placeholder, or the snippet only exists in a preview environment and not the deployed domain, GA4 is receiving nothing because nothing is being sent.

Also confirm the stream's domain matches where the app is actually served. A data stream pointed at myapp.com collects nothing from myapp.vercel.app.

Is the tag firing right now

Don't wait on reports to answer this. GA4's Realtime report and DebugView show events within seconds, so you can load your own site and watch the hit arrive. Open Admin → DebugView, then visit your site with the Google Analytics Debugger enabled (or append ?_dbg=1-style debug per Google's setup), and look for a page_view. If Realtime shows your visit, collection works and the problem is downstream (latency, filters). If it shows nothing, the tag isn't executing — usually a script-placement or build issue.

Does GA4 just need time

Standard GA4 reports are not instant. Data processing introduces latency — commonly up to 24–48 hours before standard reports fully populate — so a dashboard checked an hour after launch can legitimately read zero even while Realtime is live (Google Analytics Help — data freshness). If Realtime shows traffic but the standard reports are empty, this is very often the entire answer: wait a day and recheck before changing anything.

Is your app a single-page app that only fires one page_view

This is the cause that specifically bites vibe-coded sites. A React, Next.js, or Vite app navigates on the client without a full page reload, so the browser never re-runs the GA snippet. The default gtag config sends a single page_view when the page first loads, and every subsequent in-app route change goes uncounted — which can look like almost no traffic on a multi-screen app.

GA4's Enhanced Measurement has a "Page changes based on browser history events" option intended to catch these History API navigations (Google Analytics Help — Enhanced measurement). It helps, but it is not reliable for every router, and a hardcoded snippet often double-counts the first view or misses the rest. On Next.js the durable fix is to send page_view yourself on route change — the official @next/third-parties GoogleAnalytics component, or a small effect watching usePathname/useSearchParams, does exactly this (Next.js — Third-party libraries). The same SPA gap affects the TikTok Pixel and LinkedIn Insight Tag, covered in our Next.js tags guide.

Are ad blockers and consent banners eating the events

Even a correctly installed tag loses a slice of real traffic before it sends. Around 30% of internet users run an ad blocker at least some of the time (GWI data via Backlinko), and those tools disproportionately block Google's collection endpoints. A consent banner that defaults to "deny" will also suppress GA4 until a user opts in. So a quiet GA4 property can reflect real humans whose visits were simply never allowed to be measured — not an absence of humans.

The durable fix: own the events that matter

Chasing the GA4 snippet is worth doing, but it leaves you dependent on a client-side tag that browsers, blockers, and consent tooling are designed to limit. The resilient pattern is to record the handful of actions you actually care about — a signup, a purchase — as first-party owned events sent to your own endpoint and stored in your own database. Those fire server-side or first-party, survive ad blockers, and give you a baseline that doesn't read zero just because a tag was misconfigured. GA4 then becomes the cross-channel context layer on top, not your only source of truth (see owned events vs provider events).

VibesAnalytics is built around exactly this split: your AI agent wires owned events and connects GA4 in one step, so a placeholder ID or an SPA gap can't leave you blind. For the full GA4 wiring, see how to set up GA4 on Next.js. Work through the five checks above in order, and "zero traffic" almost always turns into "the tag was fine — I was reading the wrong report, a day too early."

FAQ

Frequently asked questions

Why does my Lovable or Bolt app show no data in Google Analytics?

Most often the scaffolded Measurement ID is still a placeholder, the tag only exists in a preview environment, or you're checking standard reports before GA4 has processed the data. Confirm in Realtime first: if your own visit appears there, collection works and the issue is latency or a filter, not a missing tag.

Why does GA4 only count one page view in my single-page app?

React, Next.js, and Vite apps navigate on the client without reloading the page, so the GA snippet runs once and never re-fires. The default gtag config sends a single page_view on load; you must send a page_view yourself on each route change, or enable Enhanced Measurement's page-changes-on-history-events option.

How do I know if my GA4 tag is firing at all?

Open GA4 Admin → DebugView (or the Realtime report) and load your live site. Events appear within seconds. If your visit shows up, the tag is firing and the problem is downstream; if nothing appears, the script isn't executing in production.

Can ad blockers cause GA4 to show zero traffic?

Yes. Ad blockers and tracking-prevention features disproportionately block Google's collection endpoints, and a consent banner that defaults to deny suppresses GA4 until a user opts in. Recording key actions as first-party owned events gives you a baseline that blockers can't strip.