Your Ads Manager reports 1,240 purchases, your GA4 report counts 870, and you are the one who has to explain the gap to the client (or the CFO) before the Q4 budget gets signed off. Welcome to the great Meta Ads vs GA4 misunderstanding, the one where both platforms measure the same funnel and never agree. Since Meta’s March 2026 attribution overhaul, the conversions discrepancy has narrowed, but it has not disappeared, and it never fully will. The good news: the gap is almost always explainable, line by line. Here is a 5-step reconciliation method, a cause-by-cause diagnostic grid, and a BigQuery query to measure the real discrepancy campaign by campaign.
What changed in March 2026 (and why the gap moved)
On March 3, 2026, Meta announced an attribution overhaul, rolled out campaign by campaign throughout late March (there was no single hard cutover date). Two things changed.
First, click-through now counts only genuine link clicks, the ones that send a user to your website or landing page. Before, a like, a save, or a reaction followed by a purchase could show up as a click-through conversion. Not anymore.
Second, all those non-link interactions (likes, reactions, shares, saves, comments, ad expansions, profile taps) along with video views moved into a new bucket, engage-through. Its window is fixed at 1 day. The video-view threshold dropped from 10 to 5 seconds (or 97% of the duration for videos shorter than 5 seconds). The new default setting is 7-day click, 1-day engage-through, 1-day view.
One point that matters for your budget calls: this is a reporting reclassification, not a billing change. Your costs and delivery do not move. What moves is the box Meta files each conversion into. The concrete result: your click-through numbers mechanically dropped in late March, which brings them closer to what GA4 sees (GA4 never attributed to a like in the first place). But “closer” does not mean “identical,” and that is where the real work starts.
Meta Ads vs GA4: what each one actually counts
Before reconciling anything, you have to accept something the reporting pressure makes everyone forget: these two tools do not measure the same thing, with the same rules, from the same point of view. Meta measures the effectiveness of its ads under its logic (user-based attribution, cross-device, engagement included). GA4 measures your site’s performance under its own logic (session and click-based attribution, data-driven by default). They cannot return the same number, and trying to make them match to the unit is a waste of time.
| Criterion | Meta Ads Manager | GA4 |
|---|---|---|
| Point of view | Meta’s ads | The website |
| Attribution basis | User, cross-device | Session / click, often single-device |
| Default model | 7d click + 1d engage + 1d view | Data-driven |
| Default window | 7-day click | Up to 90 days depending on the event |
| Views / engagement | Yes (engage-through, view) | No, never |
| Pixel + server dedup | Yes (via event_id) | Not applicable |
| Consent-dependent | Partially (Consent Mode, CAPI) | Heavily (refusal = no hit) |
Remember the row that does the most damage: Meta counts conversions GA4 will never see (engage-through and view), and Meta sees cross-device journeys that GA4, stuck in the browser, often misses. Conversely, GA4 sometimes credits a sale to another channel (SEO, direct, email) that Meta also claims. Both are “right” within their own frame of reference.
Why the numbers still differ: the 5 causes
Once the March change is factored in, the residual gap almost always comes from one of these five factors, often several at once.
The attribution window is cause number one. Meta attributes a purchase up to 7 days after the click; GA4 can reach much further back or apply a different model. Compare two different windows and you are comparing apples to oranges.
The attribution model comes next. GA4’s data-driven model spreads credit across several touchpoints, whereas Meta claims the full last paid click. A “Meta + SEO + email” purchase gives 1 full conversion on Meta and a fraction in GA4.
Consent and browser-tracking loss widens the gap in the other direction. Consent refusals (50 to 60% depending on the audience) and client-side tag blocking (over 40% of sessions in some markets) truncate GA4, while Meta partly compensates through CAPI and its user graph.
Cross-device works the same way: a click on mobile, a purchase on desktop, Meta stitches the two through user identity, GA4 does not (unless User-ID is properly implemented).
Finally, residual engage-through and view: even trimmed down, this bucket still exists on Meta’s side and has no equivalent in GA4.
The 5-step reconciliation method
1. Read the right fields in Ads Manager
90% of reconciliation “bugs” are really a misreading of the columns. First things first, go into column customization and display click conversions and engage-through conversions separately, rather than the aggregated total. Also check the attribution setting applied to the report (the window comparison tool, “Compare attribution settings,” lets you see the impact of one window versus another on the same campaigns). The exact interface labels change regularly, so verify the wording as you read: the logic itself stays stable.
The point of this step: never compare an “all-in” Meta total (click + engage + view) to a GA4 number that contains click only. That is the mistake that makes you see a huge gap where there is none.
2. Separate click-through from engage-through
This is the direct extension of the March change. Isolate pure click-through on Meta’s side: it is the only brick comparable to GA4, since GA4 only attributes to the click. Set engage-through and view aside in a separate column, labeled as such. You now have two Meta numbers: a “GA4-comparable” one (the click) and a “social contribution” one (engage + view) that you own as a signal specific to Meta, not as an error.
3. Align attribution windows and models
Now that you are comparing click to click, align the rest. Set the GA4 window as close as possible to Meta’s 7-day click, or at least document the window difference. To go further, GA4 lets you customize conversion windows; the details are in the guide on custom GA4 conversion windows. On the model side, remember that GA4’s data-driven model will never credit itself with 100% of a multi-touch sale: a 15 to 30% gap from this single factor is normal, not a bug. If your GA4 conversions also shifted in 2026, the rundown of GA4 attribution changes in 2026 sets the context.
4. Clean up UTMs and fbclid
A Meta click that lands in GA4 without a clean UTM or without fbclid ends up in “(direct)” or mis-filed under another channel: you lose the trail on GA4’s side and the gap inflates artificially. Make sure every destination carries consistent UTMs (source facebook / meta, medium paid_social or cpc, a readable campaign), that the fbclid parameter is not stripped by a redirector or a consent wall, and that your GA4 channel group correctly files these visits under Paid Social. An inconsistent utm_source across campaigns is enough to fragment your reports.
5. CAPI and deduplication
The last lever, and not the least: make the signal Meta receives reliable. The Conversions API in server-side GTM brings event loss down to around 5% versus browser-only, provided the event_id deduplication between Pixel and server is clean, otherwise you recreate a gap (double counting) instead of closing it. The precise dedup and Event Match Quality setup is covered in the Meta CAPI deduplication and EMQ guide. A clean CAPI will never make Meta and GA4 match to the unit, but it guarantees the Meta number rests on real events rather than estimates.
Grid: gap cause → check → fix
| Observed symptom | Likely cause | Check | Fix |
|---|---|---|---|
| Meta >> GA4 | Engage-through + view included | Break out the Meta columns | Compare click to click only |
| Meta > GA4 (click to click) | Window or model not aligned | Compare windows in Ads Manager | Align the GA4 window, document the model |
| GA4 files traffic under “(direct)“ | Missing UTMs or fbclid | Inspect destination URLs | Fix UTMs, preserve fbclid |
| GA4 << Meta | Consent refusals, blocked tags | Consent rate, Safari share | Consent Mode, server-side, CAPI |
| Meta claims a sale GA4 gives to SEO | Cross-device + Meta last click | Cross-check journeys in BigQuery | Accept the gap, decide on one source of truth |
| Duplicate Meta conversions | Broken event_id dedup | Events Manager: “1 event, 2 sources” | Fix Pixel + server deduplication |
This grid is not meant to erase the gap, but to make it explainable. A gap you can break down is a gap you control.
Measure the real discrepancy per campaign (BigQuery query)
Interface reports give a global view; to objectify the gap campaign by campaign, nothing beats the GA4 export to BigQuery. The query below counts, per Meta campaign (identified via source / medium), the GA4 purchase conversions over the last 7 days. You then line this result up against the click-through in your Ads Manager for each campaign: the row-by-row gap jumps out, and you finally see which campaigns actually drift, rather than a total that drowns everything.
-- GA4 purchase conversions per Meta campaign, last 7 days
-- Replace `your_project.analytics_XXXXXX` with your GA4 export dataset.
SELECT
traffic_source.name AS campaign,
traffic_source.source AS source,
traffic_source.medium AS medium,
COUNT(DISTINCT user_pseudo_id) AS buyers,
COUNTIF(event_name = 'purchase') AS ga4_conversions
FROM
`your_project.analytics_XXXXXX.events_*`
WHERE
_TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
AND LOWER(traffic_source.source) IN ('facebook', 'meta', 'fb', 'instagram', 'ig')
AND LOWER(traffic_source.medium) IN ('paid_social', 'cpc', 'paid', 'social')
GROUP BY
campaign, source, medium
ORDER BY
ga4_conversions DESC;
Adapt the source and medium lists to your actual UTM convention (that is the whole point of having cleaned your UTMs in step 4). To go further with the export, the collection of BigQuery queries for GA4 covers the most useful cases.
Which number should you decide on?
This is the real question, far more than “which one is right.” My practitioner’s recommendation: pick one source of truth per decision, and stick to it.
To optimize delivery and budget inside Meta (which campaign to scale, which to cut), trust Meta’s click-through, because it is the signal the algorithm optimizes on. To measure real business performance and arbitrate between channels (Meta vs Google vs email), go through GA4 or, better, your back office / CRM, because that is where real revenue lives. And if you want to settle incrementality (would these sales have happened without Meta?), neither Meta nor GA4 will answer: you need an incrementality test or an MMM, but that is another subject.
The mistake to stop making: presenting a single number as “the truth” without saying which frame it comes from. Good Meta vs GA4 reporting does not display a magic reconciled figure; it displays both, explains the gap in one sentence, and states which one serves which decision. It is less spectacular, but it is the only version you can defend in front of a CFO.
FAQ
Why does Meta always show more conversions than GA4?
Because Meta includes engage-through and views (which GA4 ignores), attributes cross-device, and claims the last paid click where GA4 spreads the credit. Even after the March 2026 change, Meta being higher than GA4 is the norm, not the anomaly.
Did the March 2026 attribution change remove the gap?
No, it narrowed it. By no longer counting likes and saves as clicks, Meta brought its click-through closer to what GA4 sees, but the differences in window, model, consent, and cross-device remain.
What Meta vs GA4 gap is “normal”?
There is no universal figure, but a 15 to 30% gap between Meta click-through and GA4 conversions, after aligning windows, is common and comes down to attribution models. Beyond that, look for a UTM, consent, or deduplication problem.
Should you “force” Meta and GA4 to report the same number?
No. The goal is not perfect equality, impossible by design, but an explainable gap that stays stable over time. A gap that swings suddenly is a warning sign; a stable, understood gap is healthy reporting.