Say your Tuesday looks like this: Facebook Ads Manager reports 212 purchases, GA4 reports 167, and your store's order list says 189. Three systems, one reality, three answers, and a meeting where somebody asks which one is "right."
The uncomfortable, liberating answer: probably all of them, by their own definitions. They are not measuring the same thing. Once you can say precisely how the definitions differ, the panic mostly evaporates, and what remains is a manageable engineering question.
Three systems, three definitions of "a purchase"
Facebook counts influence, generously. By default, Meta takes credit for a purchase if the buyer clicked an ad within the past 7 days or merely saw one within 1 day (check your account's window settings; these are configurable). It also models conversions it cannot directly observe, precisely because tracking losses exist. It is answering "how many purchases might our ads have contributed to," and it is answering it as the party that gets paid more when the number is bigger. That does not make the number fake. It makes it an advocate's number.
GA4 counts what it saw, then divides credit. GA4 only knows about purchases its tag observed: visitors who accepted consent, were not running blockers, and whose events actually fired. Among those, its attribution model splits credit across channels. It is answering "of the journeys I could see, which channels earned the conversion," with an unavoidable footnote: it did not see everyone.
Your store counts money. Orders in the database, minus test orders, refunds, and cancellations, depending on the report. It has no idea why anyone bought, but on how many, it is the only honest witness in the room.
Notice the shape of the illustration above: Facebook highest, store in the middle, GA4 lowest. That ordering shows up constantly, and now you know why: generous windows and modeling on one end, consent and blocker losses on the other, cash registers in between.
The six usual gaps
When you need to explain a specific discrepancy, it is nearly always one or more of these:
- Attribution windows. A purchase two days after an ad click: Facebook yes, a last-click view elsewhere maybe not. Different windows, different counts, forever.
- View-through conversions. Facebook's 1-day-view credit has no equivalent in GA4 at all. This alone builds a permanent gap.
- Consent and blockers. Every visitor who rejects your banner or blocks scripts is invisible to GA4 but still perfectly capable of buying. Your store sees them; analytics never will. (This is also why what your consent setup actually blocks is a data-quality question, not only a legal one.)
- Deduplication between pixel and server events. Teams sending both browser and server events to Meta without correct dedup keys double-count; with overly aggressive dedup they undercount. If you run server-side tracking, this seam is a top suspect.
- Timezones, currencies, refunds. Facebook's Tuesday, GA4's Tuesday, and your store's Tuesday can be three different 24-hour windows; refunds usually vanish only from the store's count.
- Modeled conversions. Where data is missing, Meta and Google estimate. Modeled numbers are not observations, and they will not match anyone's database, by construction.
So which number do you report?
One source of truth per question. Not one source of truth overall; that is the mistake that produced the argument.
- "How much did we sell?" The store. Always the store. Finance should never be reconciling toward an ad platform's opinion.
- "Which channels deserve budget?" Triangulate: platform numbers against GA4 against store revenue, read directionally, with the definitional gaps above in mind. Anyone offering you certainty here is selling something.
- "Is the campaign's optimization working?" The platform's own number is fine inside the platform: it is the data its bidding algorithm sees anyway. Just never present it to finance as sales.
And a practice worth stealing: stop staring at the gaps, start watching the ratios. If Facebook-to-store has hovered around some level for months and suddenly jumps, that is not philosophy anymore; something changed in measurement, consent, or deduplication, and it is worth an investigation that week.
When a mismatch means something is actually broken
The structural gaps are stable. Breakage moves. Get suspicious when a ratio shifts sharply without a change in spend or mix; when GA4 exceeds the store (analytics undercounts by nature, so overcounting means double-firing tags or test traffic); or when a platform's number changes drastically right after a tracking or consent change you made. Those are findable, fixable engineering problems, and finding them hands-on is exactly what a Clarity audit is for: three to five days, network-tab-level verification, and a written explanation your whole team can argue from instead of arguing about.
The dashboards will still disagree afterwards. But you will know why, by how much, and which one to trust for which decision, and that is what trustworthy analytics actually means: not one perfect number, but known numbers with known errors.