Why Google Ads, GA4, and Your Backend Never Show the Same Number
If you have ever pulled up Google Ads, GA4, and your order system side by side for the same week, you already know the numbers do not match. Google Ads might say 196 purchases. GA4 says 870. Your backend, the actual source of truth, might say something different again. None of these tools are lying to you. They are measuring different things, in different ways, on different timelines, and the gap between them is the single most common reason ad performance looks worse (or better) than it actually is.
Illustration of VEOtool's AI avatar comparing three different conversion numbers from Google Ads, GA4, and a backend system
Which Marketing Number Can You Actually Trust?
None of them, by default, and all of them, with context. Google Ads tells you what it could measure inside its own attribution window. GA4 tells you what its tracking script could observe in the browser or app. Your backend tells you what actually got paid for. The right way to use these three numbers is not to pick a favorite. It is to treat your backend as the reference point, and treat the gap between it and the other two as information: it tells you exactly how much of your real business Google's bidding algorithm can actually see.
That gap has a name. Marketers call it reconciliation: lining up the same event, over the same period, across every source that reports on it, so the size and shape of the disagreement becomes visible instead of assumed.
Are My Conversions Even Being Tracked Correctly?
Usually yes, partially. Full tracking failure is rare and obvious, you would notice zero conversions immediately. Partial tracking failure is common and invisible, because the account still shows conversions coming in, just fewer than it should.
The usual suspects are boring and specific: a conversion action that got duplicated and is now double counting or under counting, a tag that stopped firing on one page template after a site update, a consent banner blocking tracking for a meaningful share of EU traffic, or a conversion window set to 7 days when your actual purchase cycle is closer to 20. Each of these looks fine from inside Google Ads. None of them show up as an error. They just quietly shrink the number of real purchases the platform gets credit for, which is a very different problem from "tracking is broken."
Why Does GA4 Show Fewer Purchases Than My Backend?
Because GA4 can only count a purchase if the browser or app successfully sends the event before the user closes the tab, and if nothing (an ad blocker, a cookie rejection, a flaky connection) interrupts that request. Your backend counts a purchase the moment payment clears, with no dependency on the customer's device cooperating.
That structural difference means GA4 will almost always undercount relative to backend truth, and the size of the undercount is a rough proxy for how much client-side tracking loss you are dealing with. A small, stable gap (single digits, percentage-wise) is normal. A gap that is large or growing usually points to something specific: a tracking script that broke on a recent deploy, a spike in ad-blocker usage in a particular market, or a checkout flow change that altered when the purchase event fires.
Why Do Google Ads and GA4 Report Different Sales Numbers for the Same Period?
Because they attribute differently, not because one of them is wrong. GA4 typically credits the last meaningful touchpoint before a conversion. Google Ads credits itself based on its own click and view windows, and only for the conversion actions you have told it to count as primary. Two platforms, two rule sets, applied to the same underlying behavior, will produce two different numbers almost every time.
The comparison that actually matters is not "which platform is right." It is: for the same event, same date range, same definition of a conversion, how far apart are they, and is that gap stable or moving. A stable 15 percent gap is a baseline you can plan around. A gap that jumps from 15 percent to 45 percent in a month is telling you something changed, in tracking, in the account, or in the business, and that is worth investigating before you touch a single bid.
Diagram showing Google Ads, GA4, and backend order data reconciling into one trusted number
Why Does AppsFlyer Say Organic When Google Ads Actually Drove the User?
This one is an attribution race, and Google Ads usually loses it by default. If a user sees or clicks a Google ad, then opens the app later through a bookmark, a push notification, or by searching your brand name directly, AppsFlyer's attribution logic can credit that later, more direct touchpoint instead of the original ad. The install or purchase gets logged as "Organic" even though a paid click started the journey.
This is not unique to AppsFlyer. It is how most mobile measurement partners are built to handle competing signals, and it gets worse the longer the gap is between the ad click and the actual conversion. The fix is not a tracking bug fix, because nothing is technically broken. It is making sure your attribution windows and click-through priority settings in AppsFlyer are configured to match how your users actually behave, instead of the platform's defaults.
Why Are Google Ads Conversions Dropping While Sales Aren't?
This is the pattern that causes the most unnecessary panic, and the most unnecessary budget cuts. When reported conversions fall but real revenue holds steady or grows, the honest explanation is almost never "the ads stopped working." It is that something changed in what Google Ads can see, not in what it caused.
Common triggers: a conversion action got paused or replaced without anyone updating the primary conversion list, a website change altered the confirmation page URL that tracking depended on, a tag manager update shipped with a broken trigger, or a growing share of traffic is coming from a device or region where consent settings block tracking. In every one of these cases, the campaigns are still working. The measurement layer just stopped reporting on them accurately, and Smart Bidding, which only knows what it is told, starts making worse decisions because its signal quietly got smaller.
How to Actually Close the Gap
None of this means the numbers are useless. It means they need to be compared on purpose, on the same event and the same period, instead of glanced at separately and trusted by default. That comparison is exactly what reconciliation is for: putting Google Ads, GA4, and your backend side by side, quantifying the gap, and ranking the most likely cause so you know what to fix first instead of guessing.
This is the exact problem VEOtool's Reconciliation view is built to solve. It pulls the same conversion event from every connected source, for the same period, and shows you the gap, the confidence level, and the most probable cause, ranked, instead of leaving you to notice the mismatch on your own and work backward from a dashboard that was never designed to explain it.
Before changing a bid, a budget, or a campaign structure, it is worth answering a simpler question first: for the number you are about to act on, do you actually know how much of reality it represents?
