← ALL GUIDES

Why Your Click Counts Don't Match Google Analytics

Link clicks, Google Analytics sessions, and ad platform clicks will never agree — here is what causes each gap and how much each cause typically accounts for.

LAST UPDATED AUG 20, 2026 · 10 MIN READ

It's Monday morning and you're building the report. Three tabs open. Your link tool says the campaign got 1,000 clicks. Google Analytics says 640 sessions. The ad platform, which is about to bill you, says 810 clicks. You check the date ranges. Same. You check the campaign filter. Same. You refresh everything, because refreshing is what we do, and the numbers stay exactly where they were, sitting there like three witnesses who all saw the same accident and can't agree on the color of the car.

So which one is lying?

None of them, which is the annoying part. Each tool is counting honestly. They're just counting different things, at different moments, under different rules about what deserves to be counted at all. A bot that hammers your redirect never loads the analytics script. A person who taps your link and closes the tab before the page finishes loading is a click to one tool and invisible to the other. An ad platform has its own definition of a click, written by its own lawyers, and it doesn't ask anyone else's opinion.

If you've read our complete guide to link tracking, you already know the journey from tap to conversion has a lot of stops, and every stop is somewhere a number can fork. This page walks that journey with the discrepancy in mind. What does each tool actually measure, what causes each gap and roughly how big does it run, and how do you tell a normal, boring gap from the kind that means something just broke? The goal isn't to make the numbers match. They won't. The goal is to know why, so the report stops being a mystery and starts being a decision.

Three tools measuring three different things

Picture the moment someone taps your link. Between that tap and the person actually reading your landing page there's a whole little journey. The tap fires, a redirect resolves, the destination page starts loading, scripts wake up, and eventually a human is looking at your content. It takes maybe a second. And your three tools are each standing at a different point along that second, counting whoever walks past their particular spot.

Your link tool stands at the very beginning. The instant a request hits the short link, before the redirect even fires, that's a click. It doesn't know or care whether the page behind it ever loaded, whether the visitor stuck around, or whether the "visitor" was a person at all. If you want the mechanics of what happens in that instant, the anatomy of the redirect hop itself is its own story, but the short version is that the count happens early, at the door, before anything can go wrong downstream.

Google Analytics stands at the very end. It counts nothing until the destination page has loaded far enough to run a piece of JavaScript, and that script has successfully phoned home. Everything has to go right first. The page loads, the script isn't blocked, the visitor hasn't bounced in the first half-second, and consent has been granted where it's required. A session in GA4 is proof that a fairly long chain of events completed. A click at the redirect is proof that the chain started.

And the ad platform stands somewhere in the middle, at its own door, counting an interaction with the ad. Not your link, not your page. Its number answers the question it bills you for, which is "how many times did someone engage with the thing we showed them," and that question overlaps with yours without being yours.

So you have three counters at three checkpoints, each with its own definition of what deserves to be counted and its own rules about who gets filtered out. People drop off between checkpoints. Bots get past one guard and stopped by the next. Given all that, the odd thing isn't that 1,000 becomes 640. The odd thing would be the numbers agreeing, because that would mean every single journey that started also finished, got measured identically at every stop, and involved zero robots. Nobody's traffic looks like that.

The gap isn't an error to be fixed. It's the shape of the journey showing up in your spreadsheet.

The gap makers, one by one

Start with the robots, because they're the biggest single culprit. When you paste a link into Slack, Slack fetches it to build a preview card. So does WhatsApp, so does your email provider's security scanner, so do a few dozen crawlers you've never heard of. Every one of those fetches hits your redirect and counts as a click. None of them loads a page, runs JavaScript, or shows up in Google Analytics.

Depending on your channels, bots can inflate raw click counts by 10–40%, and email campaigns sit at the ugly end of that range because scanners open every link before a human ever sees the message. It's a deep enough topic that we wrote a separate guide on where bot clicks come from, but for this section the direction is what matters. Bots push link-tool numbers up while leaving Google Analytics untouched.

Then there are the humans who clicked and left. The redirect fires the instant someone taps the link, but the Google Analytics script fires seconds later, after the page has loaded enough to run it. On a slow mobile connection that window is long, and people close tabs. Someone taps your ad, waits three seconds, gives up. That's a real click, a real billed click even, and zero sessions. Figure 5–10% of clicks evaporate this way, worse on mobile, worse still if your landing page is heavy.

Ad blockers work the same direction for a different reason. A redirect is just a web request, nothing to block. The Google Analytics script, though, is on every blocklist in existence, so for those visitors the page loads fine and the measurement simply never happens. Depending on your audience this is 5–15% of traffic, and if you're marketing to developers, take the high end and add some.

Consent banners are the polite version of the same problem. A visitor in Europe who ignores the cookie banner, or clicks reject, generates a click and no trackable session. If a meaningful slice of your traffic is European, this alone can be 10–30% of that slice, and it moves every time legal tweaks the banner.

The last gap maker is sneakier because the sessions don't disappear, they get filed wrong. UTM parameters ride along on the destination URL, and plenty of things strip them in transit. A redirect drops the query string, an app's in-app browser mangles the URL, or someone copies the clean link and shares it onward. Google Analytics still records the session, it just lands in "direct" instead of your campaign. Your totals look fine while your campaign report quietly starves. The mechanics of keeping those parameters alive are covered in our complete UTM parameters guide; the short version is that this doesn't widen the overall gap so much as scramble the attribution inside it, which is arguably worse.

Stack these up and a 1,000-click, 640-session spreadsheet stops looking like a bug. Bots added a couple hundred clicks nobody could ever measure downstream, abandonment and ad blockers each shaved off a chunk of real visitors, consent took its cut, and some of the sessions that did arrive are hiding under the wrong label. Every gap has a mundane cause pulling in a predictable direction.

Reading the gap instead of fighting it

Say you've done the audit. You've traced the bots, accepted the ad blockers, made peace with consent banners. Your link tool still says 1,000 and Google Analytics still says 640, and some part of you still wants to reconcile them, to find the missing 360 and file them somewhere. You won't. Nobody does. The teams that handle this well stop trying to close the gap and start watching it instead.

Because a stable gap is actually good news. If Google Analytics consistently reports 65–80% of the clicks your links record, that ratio is telling you the same losses are happening in the same proportions, month after month. Roughly 20–30% is what a normal, honest setup looks like once bots, abandonment, blockers, and consent take their usual cuts. It's not an error rate. It's the exchange rate between two currencies, and as long as the rate holds, you can convert between them in your head and get on with your day.

The number worth alarming on is a change in that rate. Your gap has been sitting at 28% for six months, and this week it's 45%. Something specific just happened, and the shortlist is mercifully short. Either a new bot or scraper is hammering your links and inflating the click side, or someone broke or removed the analytics tag on a landing page and deflated the session side, or a consent banner got redesigned and fewer people are opting in. Each of those is findable in an afternoon. A gap that snaps shut is just as suspicious, by the way. If clicks and sessions suddenly agree, the usual explanation is that your click counting broke, not that measurement was solved.

So track the ratio, not the raw difference. A 360-click difference means nothing on its own; it could be a great week or a broken tag depending on the denominator. Sessions divided by clicks, per source, per week, is one column in a spreadsheet. When that column moves more than a few points, dig. When it doesn't, the gap is fine. Leave it alone.

Making the numbers trustworthy enough to act on

Somebody in your Monday meeting is going to ask which number is real. And the honest answer, the one that ends the argument instead of restarting it, is that each number is real for a different question. So assign them. Traffic questions, meaning how many people did we actually send somewhere, belong to your link tool, because it sits closest to the click and misses the least. Behavior questions, meaning what did people do once they landed, belong to Google Analytics, because that's the only tool watching the page. Spend questions belong to the ad platform, because that's the number you're billed on whether you like it or not. Write those three assignments down once, and the "which dashboard is right" conversation stops happening.

Then clean up what you can control. Filter bots before the numbers reach anyone, not after someone has already celebrated a fake spike. A real-time analytics view that separates bot traffic from human traffic means the count you report is the count you'd defend. And check your redirects, because a link that strips UTM parameters on the way through sends Google Analytics filing those sessions under direct traffic, and your best campaign quietly gets credit for nothing. Parameters surviving the redirect is a five-minute test that saves a quarter of confused attribution.

The deepest fix is to stop asking session counts to prove revenue at all. Sessions are stitched together from cookies and heuristics, and every gap maker in this guide chews on them. A click ID doesn't have that problem. It's a first-party identifier attached at the moment of the click, carried through to the sale, and matched back server-side, which is why conversion tracking without cookies holds up where pixel-based attribution keeps springing leaks. Acturity's conversion tracking is built on that model, where the click and the sale share an ID, so the connection is a lookup, not a guess.

The numbers will still disagree. They always will. But once each one has a job, bots are out, parameters survive, and sales trace back to clicks, disagreement stops being a problem and starts being three angles on the same campaign.