← 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 to tell a normal one from a broken one.

LAST UPDATED AUG 20, 2026 · 10 MIN READ

It's Monday morning and you're building the report. Three tabs open. Say 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 which way does it push the numbers, 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 most people have never thought about them. 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.

Bots can inflate raw click counts by a lot, and email campaigns tend to get hit hardest 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. How many clicks evaporate this way depends on your page. It's worse on mobile, and 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 most popular blocklists, so for those visitors the page loads fine and the measurement simply never happens. How much of your traffic this touches depends on your audience, and technical readers such as developers tend to run blockers more often than most.

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, the effect can be large, 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. In a made-up case like ours, bots might add 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.

Finding your own biggest gap maker

You can narrow the suspects down with three cuts of data you already have. Split the gap by source first. If it's wide for email and narrow for a post on your own site, bots are the likely cause. Split by device next. If the gap is much wider on mobile, slow loading and abandoned taps are more likely. Split by country last. If one region stands out, look at its consent banner before anything else.

None of these cuts is proof, but each one points your afternoon at the right suspect instead of all five. Compare each source on the same ratio too, sessions divided by clicks, so a big channel doesn't hide a small one that's broken.

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. Say Google Analytics consistently reports about 640 sessions for every 1,000 clicks your links record. That ratio is telling you the same losses are happening in the same proportions, month after month. There's no universal "normal" ratio, because yours depends on your audience, your channels and your consent setup. 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. Say your gap has been sitting at 36% for six months, and this week it's 55%. 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 can be confirmed by checking one thing. 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. Account for bots before the numbers reach anyone, not after someone has already celebrated a fake spike. Acturity's bot traffic report shows how many of your clicks look like bots and why. Your headline counts still include them for now, and our bot clicks guide explains what is and is not excluded. 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 quick test that can save a quarter of confused attribution.

If you want to wire the pieces together, the post on connecting link data to GA4 and ad platforms covers the setup, including what to check when the numbers disagree.

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.