Why your Meta, GA4 and Google Ads conversions don't match

If you compare data for the same campaign across Meta, GA4 and Google Ads, you’ll find that the conversion numbers rarely agree. You might see Meta report 77 purchases, Google Ads 85, GA4 61, while the real number in Shopify is 143. Four tools reporting four different totals.
So, which number belongs in your reports and should guide your strategic decisions? And why is every platform telling you something different about the same campaign?
Your Meta, GA4 and Google Ads conversion numbers will never match exactly, and they were not designed to do so. Each platform uses its own attribution rules and defines a conversion differently, so part of the gap is permanent and safe to ignore.
But not all of it is methodology. A meaningful share are real conversions that haven’t reached your platforms due to declined consent decisions, browser restrictions and ad blockers. And that part is something you can get back.
This post goes through both halves. First, how different attribution models and conversion definitions create a data gap that cannot be closed. Then, how consent choices, browser restrictions, ad blockers and broken deduplication create a gap that can be addressed, plus how to measure it and specific ways to fix it.
Four platforms, four numbers
The numbers above are not an unusual case. A similar pattern shows up across most ad accounts:
- Google Ads and Meta each report fewer conversions than your order data, because a share of real purchases never gets attributed to an ad interaction at all.
- GA4 typically shows the fewest conversions of the three, since it depends on cross-channel attribution and struggles with cookie limits and cross-device journeys. A growing share of what it cannot attribute gets labeled as "Unassigned."
- Your CRM or Shopify order data shows the highest number of all, because it has no attribution model and no browser dependency. It counts the actual number of orders.
None of these platforms are broken. Each one answers a different question, counts conversions its own way, and loses its own share of data along the way. Here is how that breaks down.
Which part of the data gap is normal and can’t be changed?
Part of the difference comes down to how each platform measures data. No tool or server-side setup will make these numbers line up, and they do not need to. The permanent gap has two primary causes: the platforms use different attribution rules, and they define a conversion differently.
Different attribution models and windows
Each platform decides which touchpoint gets credit and how long it will wait for a conversion after a user’s interaction with an ad. By design, these rules don’t align with each other.
Meta credits a conversion within roughly 7 days of a click. It also counts view-through conversions, meaning cases where someone saw your ad, did not click, and made a purchase anyway.
Google Ads focuses on interactions inside Google's own ecosystem. Since September 2023, Google has been using data-driven attribution by default, which spreads credit across the clicks and impressions in the Google journey rather than only the last click.
Google Analytics 4 (GA4) takes a broader cross-channel view and tries to distribute credit across every channel that was part of the journey, including Meta, email, organic and direct, rather than just the ad someone clicked.
Here is an example. A customer sees a Meta ad, later clicks a Google ad, and then buys. Meta and Google Ads each count that purchase as their own, while GA4 splits credit for it across both channels. One purchase now shows up three times across three tools, all because each of them is following its specific rules.
The reporting window makes this even more complicated. Google Ads counts a conversion on the date of the click, while GA4 counts it on the date of the conversion, so the same sale can land in different weeks. If you compare a Monday-to-Sunday period across two tools that use different date logic, part of the gap you see is pure timing.
Different definitions of a conversion
Another issue is that the platforms use different definitions of a conversion. Meta might count an "add payment info" event or a view-through as a conversion. Meanwhile, for Google Ads, it may be a phone call or a form fill. GA4 might be counting a key event you configured months ago and have since forgotten about. Your order data only reflects a paid, confirmed, non-refunded order.
Before you analyze your tracking, make sure that each tool is measuring the same events. Open the conversion action settings in Google Ads, the event list in Meta Events Manager, and the key event definitions in GA4, and check each one against what your order data is counting. If Google Ads includes phone calls or Meta includes view-throughs, that part of the gap has nothing to do with lost data.
Which part of the gap is recoverable data loss?
Beyond methodology, there is a second gap made up of conversions that really happened and should have counted under each platform's own rules, but never made it into the platforms. This is signal loss, and it is the part you can (and should) fix.
Most of it is driven by four key factors:
- Consent and Consent Mode V2. When a user declines cookies, client-side tags do not fire, so that conversion never reaches your platforms as a real, measured event. Google fills part of the gap with modelled data under Consent Mode, but modelling is an estimate built on an ever-decreasing base of real events. The more real signal you feed it, the less it has to guess.
- Safari's ITP and similar browser restrictions. Safari's Intelligent Tracking Prevention caps first-party cookies set via JavaScript at 7 days, and shorter still in some cross-site scenarios, while Firefox blocks many trackers by default. Every expired cookie is a returning customer that your tools can no longer connect to the campaign that brought them in, which is also why remarketing pools tend to shrink over time.
- Ad blockers. Ad blockers do not only remove display ads, they stop tracking scripts from firing at all. When one prevents your Google Tag Manager container from loading, none of your tags run, which means no GA4, no Meta pixel and no Google Ads conversion tag, and those users become invisible in your reports.
- iOS and App Tracking Transparency (ATT). Since ATT launched, users have to explicitly opt in before Meta's pixel can track them on iOS, and most do not. Meta fills that hole with modelled conversions based on aggregated signals, which is useful but is still a model rather than an accurate measurement.
When you add these up, you realize you’re working off incomplete reports and allocating the budget based on a heavily distorted picture. Campaigns that look like they underperform may simply serve an audience whose conversions survive the data loss worse than others.
Why deduplication and cross-device gaps make it worse
Two more effects sit between methodology and data loss, and they explain some of the strangest discrepancies you will see.
The first is deduplication. If you run both a browser pixel and a server-side event, which you should for Meta CAPI, the two need to share an identical event_id so Meta knows they describe the same purchase. Meta's matching is strict – the IDs must match exactly and the event names and timestamps need to align – so when a setup generates the ID separately on each side, Meta counts both events. Meta over-reports because you are double-counting rather than because Meta is inflating anything. What solves this is clean deduplication.
Learn how to increase your Meta Event Match Quality score.
The second is cross-device journeys. A user might initially discover you while browsing on their phone, then do more research on desktop, and buy on a tablet, which is one customer spread across three device footprints. Client-side cookies cannot reliably stitch those together, so you see three anonymous users where there is really one.
Meta and Google can partly bridge this for logged-in users, but GA4 only manages it when someone is signed into a Google account, which is one of the main reasons GA4 undercounts and drops sessions into "Unassigned."
Check these five settings before you blame your tracking
A lot of the time, mismatched numbers are not signal loss at all. They are configuration mistakes that split or shift your data between tools. These are quite straightforward to fix, so check them before you assume anything deeper is causing your data discrepancies:
- Time zone. Each platform can report in its own time zone, and they do not even agree on which day a conversion belongs to. Google Ads records it on the day of the click, while GA4 records it on the day the purchase happened. If those fall on different days, the same sale can land in a different week in each tool, so a comparison of "last week" is really a comparison of two slightly different weeks. Set every platform to the same time zone.
- Currency. If your GA4 property, your ad accounts and your order data report in different currencies, your revenue and ROAS will never line up even when the conversion counts do. The same is true if each tool converts to your reporting currency at its own exchange rate. Decide on one currency across all of them so you can accurately compare them.
- Attribution window. The attribution window is how long after an ad interaction a platform will still credit a conversion. Google Ads commonly uses a 30-day window, while Meta uses 7 days for clicks plus 1 day for views. Because the windows differ, each tool is counting a different set of conversions, which alone can explain a large gap. Where possible, set the same window everywhere; where the platforms don’t allow it, remember that some of the difference is built in.
- UTM consistency. GA4 reads Facebook, facebook and fb as three separate sources, so inconsistent tags scatter one channel across several lines and push traffic into "Unassigned." Pick one naming convention, for example utm_source=facebook with utm_medium=paid_social, and use it on every link. Then confirm your redirects, link shorteners and checkout steps are not dropping the parameters along the way.
- Referral exclusions and cross-domain setup. When a customer is sent to an external payment page and back, GA4 can treat the return as a brand-new visit and lose the original source of the sale. To prevent that, add your payment provider and your own subdomains to GA4's referral exclusion list, otherwise those conversions end up filed under "Direct" or "Unassigned".
If you clean these up and a large gap remains, then you are likely looking at methodology differences plus recoverable data loss, which is what the rest of this article is about.
Which conversion number should you trust?
You should not trust any single number in isolation, and stop trying to crown one dashboard as the true one. Instead, use each tool for the job it is actually good at.
- Google Ads and Meta Ads Manager are your decision tools for their own campaigns. They feed their own bidding algorithms, so the number that matters in each one is the number that algorithm is learning from. Optimize Meta inside Meta, and Google inside Google.
- GA4 is your cross-channel context tool. It is best for understanding how channels assist one another rather than for producing a precise purchase count.
- Your order data (Shopify, a CRM or Stripe) is your source of truth for how many orders actually happened and how much revenue came in, and it is the number that belongs in the board deck.
Don't try to force the numbers to match. Instead, get to know the normal gaps between your tools, keep an eye on them, and look into it when one of them changes.
Find out how to measure offline conversions more accurately.
What you can fix vs what is unchangeable
To sum up, data discrepancies that you cannot fix include:
- Different attribution models across platforms
- Different attribution windows and date logic
- Different definitions of what counts as a conversion
- View-through versus click-through counting
Parts you can fix concern:
- Conversions lost to consent gaps
- Conversions lost to ITP and cookie expiry
- Conversions lost to ad blockers
- Conversions lost to iOS and ATT restrictions
- Double-counting caused by broken deduplication
- Much of the cross-device stitching
Everything in the first group is a difference in rules, while the second group applies to data that went missing in the browser. The browser is the part of the chain you do not control, which is exactly why moving measurement off it recovers so much of the second group.
How to measure your own gap
The quickest route is to use a tool that will audit your site for you. The free TAGGRS Website Tracking Checker reviews your website across four areas that cause most of the gaps that we’ve discussed in this article:
- Which advertising pixels are implemented on your site and whether conversions actually arrive
- Whether you are sending data server-side, which platforms are covered and where you are still relying on the browser
- Every first-party and third-party cookie on your site and how long it survives
- Whether your consent banner is configured correctly
You enter a URL, and it returns a tracking score with a prioritized list of what to fix.
If you’d rather work through it yourself, the steps below take an afternoon. Start with the conversion number you trust most, comparing each platform against it as well as the previous period so you can see both the size of each gap and how stable it is.
Our guide How resilient is your tracking setup? is a useful companion if you want a more in-depth analysis of where your tracking breaks.
- Set your baseline. Pull total purchases and revenue from your order data (Shopify, WooCommerce, Stripe or your CRM) for a fixed, recent period. These are real, paid orders, so they are the closest thing you have to ground truth. Every other number gets compared back to this one.
- Compare GA4 to that baseline. For the same period and time zone, GA4 will almost always report fewer purchases, because it depends on cookies and consent that the browser can strip away. A small, steady data discrepancy is expected. A large or growing one can be considered analytics-layer signal loss, and it is worth confirming your Consent Mode setup and tag firing before looking anywhere else.
- Check your GA4 "Unassigned" channel share. Open the default channel group report and see how much traffic GA4 could not attribute to a source. When that share climbs, it usually traces back to inconsistent UTMs, missing referral exclusions, or consent gaps rather than anything harder to diagnose, and it directly erodes the attribution your reports depend on.
- Check Meta's deduplication. In Events Manager, open your Purchase event and look at how the pixel and the Conversions API are being deduplicated. If the deduplication rate is low, your browser and server events are not sharing a matching event_id, which means you are either double-counting purchases or dropping the server events meant to recover the ones the browser missed.
- Check your consent decline rate. Look at how many sessions decline tracking in your consent banner. Each decline is a conversion your client-side tags haven’t recorded, so a high decline rate tells you how much of your gap is consent-driven and how much modeling your platforms are doing to fill it in.
- Add it up. You now have a rough map of your data gap broken into methodology, analytics loss, deduplication problems and consent. That map is what tells you where Server-side Tracking can recover data and where you just need to fix a UTM or change a setting.
What a standard gap looks like
There are no universally correct numbers because the size of each gap depends on your audience, industry and how much of your traffic is privacy-restricted. What matters is the direction of each gap and whether it holds steady. The table below describes the shape to expect rather than a target to hit.
| Comparison | What is normal | What is worth investigating |
| GA4 purchases vs. order data | GA4 lower, by a small and stable margin | A large gap, or one that keeps growing |
| Google Ads vs. GA4 (same conversion) | Google Ads higher | A gap that swings week to week |
| Meta pixel and CAPI deduplication | Most purchases matched and merged | A falling match rate, or duplicates appearing |
| GA4 "Unassigned" channel share | A small, steady share | A share that climbs over time |
The most useful habit is knowing your own baselines and monitoring how they change. A stable gap is almost always a methodology difference you can leave alone. A gap that suddenly widens is usually a broken tag, a consent change, or a tracking regression, and it is best to prioritize fixing it to reduce your potential losses.
Learn how to fix your GA4 ROAS inaccuracies.
How Server-side Tracking closes the recoverable gap
Client-side tracking is prone to errors because it depends on an environment you do not own. The browser decides whether your script loads, whether the request goes out, and whether the cookie survives, and ad blockers, ITP and consent tools all get a say before your data ever leaves the page.
Server-side Tracking moves that collection point off the browser. Instead of the browser sending events straight to each ad platform, it sends them to a server you control on your own subdomain. That server then cleans and deduplicates the events and forwards them on to each platform through a direct server-to-server connection, rather than relying on the browser to deliver them.
Moving the collection point is what recovers the data. A request to your own subdomain is first-party, so ad blockers do not treat it as a tracker to strip out. A cookie set by your server is a first-party cookie, so browser restrictions like Safari's ITP do not cut its lifetime the way they do with cookies set in the browser. A server-to-server connection does not depend on a script surviving in the browser, so a blocked or broken tag cannot kill it. And because the server tags each purchase with one consistent identifier, the browser event and the server event for that purchase are recognized as the same conversion instead of being counted twice.
This does not make Meta, Google and GA4 agree, because nothing closes the methodology gap. What it does is recover the conversions that were falling out of the browser, which is the portion of the gap that costs you money and misleads your bidding.
Before you switch to Server-side Tracking, it is worth clarifying that it often reports fewer conversions in its first week or two, because it starts fresh without the history your old setup had built up. It also will not clean up a messy UTM scheme or a misconfigured consent banner on its own, so the housekeeping from earlier still matters. Think of it as the foundation for clean data rather than a one-click fix. Once it settles, the recovered signal flows back into the platforms' automated bidding. As a result, the algorithms are finally optimizing based on a large portion of real behavioral data instead of the fraction that survived the browser.
Learn how Server-side Tracking can improve your Google Ads performance.
The real question
Most teams already sense that something is off with their data, but knowing how large the recoverable gap is, where it comes from, and how to close is another story. Every conversion that never reaches your platforms is a sale your bidding cannot learn from and a budget decision made on partial data. This gap keeps costing you for as long as it stays open.
Luckily, this half of the gap is fixable. TAGGRS makes it straightforward to move your tracking server-side and recover the conversions your current setup is missing. Create a free account to get started, or book a demo to see how it fits your existing setup first.
FAQ
Will Meta, GA4 and Google Ads conversions ever match exactly?
No. Each platform uses a different attribution model and window, and a different definition of a conversion. Those methodology differences are permanent and cannot be removed by any tool. A consistent gap between platforms is normal, and it is a sudden change in that gap that signals a problem.
Why does Google Ads show more conversions than GA4 if both are Google products?
They answer different questions. Google Ads counts conversions it can attribute to a Google ad interaction and reports them on the click date, while GA4 uses cross-channel attribution and reports on the conversion date. Consent gaps and cross-device journeys reduce GA4's counts further, so Google Ads almost always shows the higher number.
Why does Meta report more conversions than my Shopify or CRM order data?
Meta counts view-through conversions and uses modeled data for opted-out iOS users, so it credits sales that your data attributes elsewhere or does not tie to a Meta ad. Broken deduplication between the Meta pixel and CAPI can also double-count the same purchase, which inflates Meta's total.
How much conversion data am I losing?
Across the setups we have worked on, the losses are consistently large, often a meaningful share of total conversions rather than a rounding error. It is driven by consent declines, Safari's ITP, ad blockers and iOS ATT restrictions, and the exact amount depends on your region, industry and audience.
Can Server-side Tracking make all my dashboards match?
No, and that is not its purpose. Server-side Tracking closes the recoverable data-loss gap, meaning conversions lost to blockers, ITP, consent and browser restrictions, but the methodology differences between platforms remain by design.
How big a gap between platforms is normal?
There is no single correct figure, because it depends on your audience and how much of your traffic gets blocked by browser or privacy-related restrictions. Focus on direction and stability instead. GA4 sitting somewhat below your order data is expected, and a gap that has held steady for months is almost always a harmless methodology difference. What should prompt a closer look is a gap that is unusually large for your setup or one that suddenly widens, since that points to a fixable problem such as consent loss, broken UTMs or a deduplication error.
Why is so much of my traffic showing as "Unassigned" in GA4?
"Unassigned" appears when GA4 cannot match a session to a channel. That usually comes down to inconsistent or missing UTM parameters, referrers stripped by redirects, cross-domain or referral-exclusion misconfiguration, or consent gaps. A small "Unassigned" share is normal, but when it grows it is almost always one of those fixable issues rather than a mystery. Cleaning up your UTMs and referral exclusions, then moving collection server-side, recovers most of it.

