
You launch a campaign, the ad platform reports 1,000 clicks, and Google Analytics shows 640 sessions. Nobody stole 360 visitors. In almost every case the two systems are counting different things, at different moments, with different filters. The gap only becomes a problem when you do not know which of those reasons applies to your campaign.
This guide explains where discrepancies come from, how big a gap is normal for different traffic types, and gives you a step-by-step checklist to reconcile your ad platform data with Google Analytics (GA4) or any other analytics tool.
Why the numbers never match exactly
An ad platform (a DSP or ad network) records events on its own servers: an impression is served, a click is registered when the user hits the click URL. Google Analytics records events in the visitor’s browser, only after your landing page loads and the GA tag runs. Everything that happens between those two points can make the counts drift apart.
1. A click is not a session
The ad platform counts a click the moment the request reaches its click server. GA counts a session only when the landing page loads and the tag fires. If a user clicks and closes the tab before the page loads, or hits the back button, you get a click with no session. Slow landing pages make this worse, especially on mobile connections. The reverse also happens: one user can click two ads within a few minutes and GA may merge that into a single session.
2. Bots and invalid traffic are filtered differently
Ad platforms run their own invalid traffic (IVT) filters and may discard suspicious clicks before they reach your report, or credit them back afterwards. GA has its own known-bot exclusion and cannot see the platform’s filtering logic. Simple bots that never execute JavaScript will appear as clicks in some systems and never appear in GA at all. So a large gap can point to low-quality placements, not a tracking bug.
3. Redirects, trackers and pre-landers
Many affiliate campaigns send traffic through a tracker redirect and then a pre-lander before the offer page. Each hop adds latency and a chance to lose the visitor. If GA is installed only on the final offer page, the pre-lander drop-off looks like a “discrepancy” when it is really funnel loss. Redirect chains can also strip query parameters, so UTM tags never reach the page where GA reads them.
4. Ad blockers, privacy tools and consent
Some browser extensions and privacy-focused browsers block the GA script. In regions where you show a cookie consent banner, GA may record nothing (or only modelled data, depending on your consent mode setup) until the visitor accepts. The ad platform’s server-side click count is not affected by either, so the gap grows in markets with strict consent rules.
5. Time zones and reporting dates
If your ad account reports in UTC and your GA property is set to New York time, “yesterday” covers different hours in each tool. Daily comparisons will look wrong even when weekly totals match. GA4 also needs time to finish processing recent data, so today’s numbers are not final.
6. Attribution windows and models
For conversions the differences multiply. The ad platform usually credits a conversion to its own click within a fixed window. GA4 uses its own attribution model across all channels, so the same sale may be credited to organic search or email instead. Neither number is “wrong”; they answer different questions.
7. The tag does not load or fires late
If the GA tag sits at the bottom of a heavy page, or is loaded through a tag manager that waits for other scripts, visitors who bounce quickly are never counted. JavaScript errors earlier on the page can stop the tag altogether. Single-page apps that change the URL without a full reload need extra configuration for page views.
8. Duplicate or missing tags
The opposite problem: GA installed twice (hard-coded plus tag manager) inflates page views and can break session counts. Conversion pixels fired on both the “thank you” page and a button click count every sale twice.
9. UTM and macro mistakes
If UTM parameters are missing, misspelled, or overwritten by a redirect, GA files the traffic under “direct” or “referral”, and your campaign looks like it delivered almost nothing. Macros in the click URL (placeholders the ad platform replaces with a source ID, campaign ID or click ID) must use the exact syntax the platform supports. An unsupported macro arrives as literal text, which breaks source-level reporting and postbacks.
How big a gap is normal?
There is no universal number, and you should be wary of anyone who quotes one without data from your own funnel. What you can do is set your own baseline: run a campaign with a clean setup for a few days, record the click-to-session ratio by traffic type and geo, then watch for changes. The table below shows which factors usually matter most per format.
| Traffic type | Main causes of gap | What to check first |
|---|---|---|
| Pop-under | Page opens behind the active window; users close it before load; bot traffic | Landing page load speed, source-level gap, IVT reports |
| Push notifications | Clicks on mobile with slow connections; accidental taps | Mobile page speed, device/OS breakdown |
| Native and display | Accidental clicks, redirect chains, consent banners | Placement report, UTM survival through redirects |
| Video | Clicks during playback that do not complete a page load | Click URL, landing page tag position |
| Any traffic via tracker + pre-lander | Funnel drop-off between hops | Tag installed on every page, parameter passing |
Step-by-step reconciliation checklist
Work through these in order. Most gaps are explained by step 4.
- Align time zones. Set the same time zone in your ad account, tracker and GA property, or compare only full weeks.
- Compare the same metric. Ad platform clicks against GA sessions (or users) from that campaign only, filtered by UTM source and campaign. Do not compare clicks to total site traffic.
- Click your own ad URL. Open the final click URL in a private window and watch the address bar. Confirm UTM parameters and any click ID arrive on the landing page intact after every redirect.
- Verify tags fire. Use GA4 DebugView or Tag Assistant to confirm one page_view per load, on every page in the funnel, including the pre-lander.
- Check for duplicates. Search the page source and tag manager for more than one GA measurement ID or conversion tag.
- Measure load speed. Test the landing page on a mobile connection. Move the GA tag high in the <head> so it loads before visitors can leave.
- Break the gap down. Compare click-to-session ratio by source/placement, geo, device and browser. A gap concentrated in a few sources usually means traffic quality; a gap spread evenly usually means a technical setup issue.
- Review consent settings. If you run a consent banner, check how GA behaves before consent and expect lower counts in those markets.
- Use server-side conversion tracking. Send conversions back to the ad platform with a postback (server-to-server) using the click ID, instead of relying only on browser pixels.
- Record a baseline. Once the setup is clean, note the normal ratio per format and alert yourself when it moves.
Common mistakes
- Treating GA as the “true” number. GA undercounts traffic it cannot see. Use it for on-site behaviour and the ad platform for delivery.
- Comparing different date ranges or time zones and then blaming the traffic.
- Installing GA only on the offer page while sending traffic through a pre-lander.
- Hand-typing macros instead of copying them from the platform’s documentation.
- Judging a source on one day of data. Small samples swing widely.
- Ignoring a sudden change in the gap. A stable gap is a baseline; a jump is a signal that something broke or a source changed.
Applying this on PPCmate
PPCmate offers pop-under, push, native, display and video ads with targeting by country, device, OS, browser and connection type, and states that it combines internal anti-fraud filters with third-party fraud detection tools (see the PPCmate homepage FAQ). When you compare its reports to GA, break the numbers down with the same dimensions you target on, so you can see whether a gap belongs to one placement or to your whole setup.
FAQ
Why does my ad platform show more clicks than GA shows sessions?
Because a click is counted on the platform’s server, while a session needs the landing page and GA tag to load in the browser. Early exits, slow pages, ad blockers, consent and bots all fall into that gap.
Can GA show more sessions than the ad platform shows clicks?
Yes. Users can bookmark or return to the landing page with the UTM parameters still in the URL, page refreshes can start new sessions, and duplicate tags inflate counts.
Which number should I use to pay or optimize?
Spend is billed on the ad platform’s numbers. For optimizing, use conversions measured by postback with a click ID, because they tie revenue back to the exact source.
How often should I reconcile?
At every new campaign launch, after any change to landing pages, trackers or tags, and as a weekly check against your baseline ratio.







