You pull up Google Ads. It says 40 conversions. You open GA4. It says 52. You check the backend, Shopify or WooCommerce, and that says 47. Three tools, three numbers, one set of sales. Something must be broken, right?
Usually, nothing is.
The numbers don’t match because they were never built to match. GA4 and Google Ads measure different things, on different clocks, through different pipes. Once you see how each one counts, the gaps stop looking like bugs and start looking like exactly what they are: the system working as designed.
They Count on Different Clocks

Google Ads attributes a conversion back to the moment of the ad click. Someone clicks your ad Monday, comes back and buys Thursday, and Google Ads files that conversion under Monday, the click date. GA4 does the opposite. It counts the conversion on the day it actually happened: Thursday.
So a single sale can land on two different dates depending on which tool you ask. Run a Monday-to-Wednesday report and Google Ads will show a conversion GA4 has not recorded yet, because to GA4 that sale lives in Thursday. Stretch the date range and the totals drift again.
If you are comparing two tools that file the same sale under two different dates, the columns will never tie out. That is not an error. It is two different definitions of when a conversion happened.
They Use Different Attribution Models
Even when the dates line up, the credit does not. GA4 and Google Ads each run their own attribution model, with their own lookback windows and their own rules for how much credit a touchpoint earns.
GA4 defaults to data-driven attribution inside its session framework. Google Ads applies its own model across its own conversion window. The two can look at the identical customer journey and split the credit differently, or draw the window boundary in a different place, so a conversion that counts in one tool sits just outside the line in the other.
Add in different deduplication logic and you get two honest tools producing two different totals from the same raw events.
There Are Two Separate Pipes Into Google Ads
Here is the part almost nobody accounts for, and it explains most of the confusion. A conversion can reach Google Ads through two completely separate pipes.
The first is the GA4 import. You link GA4 to Google Ads and import a GA4 key event, say a purchase, as a conversion action. Google Ads now treats that GA4 event as one of its conversions.
The second is the direct path: the Google Ads tag, Enhanced Conversions, or an offline conversion upload sending the sale straight to Google Ads without routing through GA4 at all.
These pipes are independent. A given sale might arrive through one, the other, or both. They carry different signals, count on different rules, and (this is the one that bites) they can fire for the same purchase at the same time.
Why Any of This Matters
If you do not know which pipe a number came from, you cannot reconcile it, and you definitely cannot trust the ROAS sitting on top of it.
Worse, if both pipes are live for the same sale, you are not just looking at a mismatch. You are double-counting, and that inflated number is quietly feeding Smart Bidding. We pull that thread apart in The Conversion Double-Count Hiding in Your Google Ads Account. And if you want the bigger picture on why platforms disagree by design, see Why Google and Meta Both Take Credit for the Same Sale.
What to Actually Do
Stop trying to force the numbers to match. They measure different things, so a perfect tie-out is the wrong goal.
Instead, assign a source of truth to each job. For revenue and order counts, trust your backend or CRM, the system that actually takes the money. For bidding, pick one clean conversion action and let Google Ads optimize on that, not on a pile of overlapping signals.
And know your pipes. Map exactly how conversions flow into Google Ads (GA4 import, direct tag, Enhanced Conversions, offline upload) and which conversion action is actually being counted. The day you can name the pipe behind every number is the day the dashboards stop lying to you.
The mismatch was never the problem. Not knowing why it exists is. Two clocks, two models, two pipes: once you can see them, the numbers finally make sense, even when they disagree.

