All articles
Analytics5 min read

Why your traffic looks lower than Google Analytics

Switching analytics tools always shows a drop. Here are the five real reasons the numbers disagree, and how to tell a genuine gap from a broken install.

Priya Natarajan

Founder at Beacon

Every team that changes analytics tools has the same first week: the new number is lower, someone asks whether the install is broken, and the migration gets paused while people investigate. Most of the time the install is fine and the two tools are simply counting different things.

One: blocked requests

A meaningful share of visitors runs an ad blocker, a privacy extension or a DNS filter. Those lists are maintained for well-known analytics domains, and they block the request before your script ever executes. A tool served from a widely blocked domain loses those visits silently; a first-party endpoint on your own domain loses far fewer.

The gap is not usually evenly distributed either. Technical audiences block more than average, which means the visitors you lose are often the ones you most wanted to count. Compare two tools on the same traffic and the one behind the blocked domain will look inflated against the other, not the reverse.

Two: sessions versus visits versus users

These words are not interchangeable, and each tool picks its own definition. If a session ends after thirty minutes of inactivity in one product and at midnight in another, a visitor who reads at 23:50 and again at 00:10 is one session in the first and two in the second. Cookieless tools also cannot recognise a returning visitor across days, so "users" is closer to "sessions" than to a true person count.

Three: bots and internal traffic

Large analytics products apply aggressive bot filtering and often exclude known internal IPs. Smaller tools may filter less, or filter differently. If your own team visits the site all day, or a monitoring service polls your homepage every minute, that shows up somewhere. Decide explicitly whether you want internal traffic in or out, and write it down.

Four: the snippet is not on every page

A tracker installed in a tag manager fires after a consent gate, or only on certain templates. Blog posts are the usual casualty: they live in a separate CMS or a static generator and never got the snippet. Compare the per-page numbers between the two tools; a page that is missing entirely is an install bug, not a counting difference.

Five: client-side navigation

Single-page apps change the URL without a page load. A tracker that only listens for a full load records the entry page and nothing after it, so the landing page looks healthy while every subsequent step is missing. Your install needs to hook the router, not just the document.

// SPA route change
router.afterEach((to) => {
  beacon.pageview(to.fullPath)
})

// or listen to history
window.addEventListener('popstate', () =>
  beacon.pageview(location.pathname + location.search),
)

What to do about it

Pick one tool as the source of truth and stop comparing absolute totals. Trends and ratios — conversion rate, leads per thousand visits, channel mix — survive most definitional differences, and they are what decisions are actually based on. If you must reconcile, do it once, document the expected gap, and move on.

See this working on your own site

One script tag, no cookies, no consent banner. Free up to 10,000 visits a month, and you can see which campaign produced each lead in the same dashboard.

Start free