How Meta, Google, and Enalitica Count Conversions
Meta, Google, and Enalitica count conversions differently. Same orders, three ROAS numbers. Here is why and which to trust for spend decisions.
Tilen Ledic
Written by
You spent €4,800 on Meta last week. Meta Ads Manager says it returned €38,400 in revenue. ROAS 8.0. Same week, you spent €3,000 on Google Ads. Google says it returned €11,200. ROAS 3.7. Your WooCommerce dashboard, the actual cash register, shows €31,500 in total sales for the entire store.
Meta alone claims more revenue than the whole store made.
This is not a bug, and Meta is not lying. Meta and Google count conversions in fundamentally different ways, and Meta's default settings are the most generous in the entire ad stack. If you make budget decisions by comparing the two dashboards directly, you are comparing apples to a fruit basket that also includes apples someone else already paid for.
This post breaks down exactly how Meta, Google, and Enalitica each count conversions, why the numbers never match, and which one to trust when deciding where to put the next €1,000. If you want the one number that sidesteps this whole mess by dividing real revenue by real spend, read our guide to blended ROAS and MER.
The Short Version
- Meta counts a conversion if the user saw an ad in the last 1 day or clicked an ad in the last 7 days. View-throughs are mixed into the same number as clicks. Meta has no idea what Google did, so the same order can be claimed by both.
- Google Ads counts a conversion when the user actually clicked (
gclid,gbraid, orwbraid) and converted within the attribution window. View-through conversions exist but live in a separate column. Data-Driven Attribution splits credit across touchpoints instead of giving 100% to the last ad. - Enalitica counts conversions only on real WooCommerce or Shopify orders, using first-party click IDs and reconstructed session journeys. There is no view-through. One order has one revenue figure, distributed across the channels that actually appeared in the customer's path.
The rest of this post is the detail behind those three sentences.
How Meta Counts Conversions
The default attribution window
Meta's default conversion attribution is "7-day click or 1-day view". Unless someone in your account has explicitly turned the view-through window off, this is what every Meta dashboard, ROAS column, and CAPI report you read is showing you.
- 7-day click: if the user clicked any of your ads in the last 7 days and converts now, Meta claims credit.
- 1-day view: if the user just saw (was served, scroll-passed, briefly viewed) any of your ads in the last 1 day and converts now, Meta also claims credit, even if they never clicked.
Until 2021, Meta's default was even more generous: 28-day click + 1-day view. Apple's App Tracking Transparency framework forced Meta to shorten the click window to 7 days, but the view-through part stayed on by default. You can verify this yourself in Meta's official attribution settings documentation.
In our experience auditing client accounts, the typical Meta-reported ROAS comes out 2 to 5 times higher than the store's actual click-attributed ROAS purely because of this default. Most accounts we see have not changed this setting. The good news is you can switch your reporting view to click-only without changing how Meta optimizes your campaigns.
How to switch your Meta reporting to click-only
There are two places "attribution" lives in Meta Ads Manager. Only one is the right thing to change.
| ✓ Right move | ✗ Wrong move | |
|---|---|---|
| What you change | Reporting comparison column | Per-ad-set attribution setting |
| Where it lives | Ads Manager → Columns → Compare Attribution Settings | Ad set edit → Conversion → Attribution setting |
| Effect on bidding | None, algorithm still gets the full signal | Degrades optimization, especially retargeting |
| Effect on dashboard | ROAS narrows toward reality | ROAS narrows but campaigns may underperform |
| Recommended | Always | Only if your media buyer asks for it |
The right move, step by step:
- Open any campaign, ad set, or ad view in Ads Manager.
- In the toolbar above the data table, click Columns → Compare Attribution Settings (in some accounts this is a small clock icon labeled Attribution).
- Pick 7-day click as the comparison window. Uncheck 1-day view and any other view-based options.
- Apply.
The Results, Cost per Result, and Purchase ROAS columns now reflect click-only attribution. Compare those numbers to your Enalitica or Google Ads reporting and the gap narrows significantly. You haven't changed the bidding signal at all, just what the dashboard shows you.
When the view-through inflation is removed from reporting, the gap between Meta-reported ROAS and our click-attributed ROAS in Enalitica typically narrows to roughly 1.3 to 1.8 times. The remaining inflation is cross-device click attribution and Meta's own modeled conversions, not view-through stacking.
What "view-through" actually means
A view-through conversion is a conversion where the user:
- Was served an ad impression at some point in the last 24 hours.
- Did not click on it.
- Found your site through some other channel: Google search, direct, email, organic social, even a different ad platform, and bought.
Meta still credits that order to itself.
In practice, this means Meta is claiming credit for orders that came from Google Ads, organic search, email, or word-of-mouth, as long as Meta managed to serve an impression somewhere in the user's feed in the previous day. For high-frequency retargeting campaigns on warm audiences, almost every buyer has seen at least one Meta impression in the last 24 hours, so Meta ends up taking credit for most of the store's conversions regardless of where they actually came from.
Meta does not deduplicate against other platforms
Meta has no idea what Google Ads, TikTok, or organic search did for that order. It looks at its own pixel and CAPI signal, applies its own attribution window, and decides credit based purely on its own data. Google does the same on its side. So the same order can be:
- Claimed 100% by Meta (because there was a 1-day view-through impression).
- Claimed 100% by Google Ads (because there was a
gclidclick 3 days earlier). - Claimed 100% by GA4 (last non-direct click).
Add up all three dashboards and you will routinely see "attributed revenue" exceeding 150 to 200% of actual revenue.
iOS 14.5+ and the modeling layer
Since iOS 14.5, most iPhone users opt out of Meta tracking. Meta's response was to fill the gap with statistical modeling: for the conversions it cannot directly observe, it estimates how many "should" have happened based on aggregate patterns and surfaces them as "modeled conversions" that look identical to real ones in the dashboard.
This is mathematically reasonable at the platform level but unverifiable at the campaign level. You cannot tell which line in your campaign report is a real order with an fbp cookie behind it and which is a modeled estimate.
Conversions API helps because it sends server-side events Meta can match deterministically. We covered the full setup in Meta Conversions API: The Complete E-Commerce Guide. If you run CAPI through server-side GTM, see our comparison of three setups beyond the default Meta CAPI tag. But CAPI does not change attribution rules. It just gives Meta a stronger signal to apply the same generous rules to.
Why Meta ROAS feels real
It feels real because the orders are real. Meta is not inventing transactions. It is over-claiming credit for transactions that other channels already drove. The trap is mistaking "Meta says it drove this order" for "Meta caused this order."
How Google Ads Counts Conversions
Click-based by default
Google Ads' headline conversion column is click-based. To get credit, Google needs a click that produced a gclid, gbraid (iOS app conversions), or wbraid (iOS web conversions, limited tracking). We broke down the differences in GCLID vs GBRAID vs WBRAID.
If the user only saw an ad and didn't click, the conversion is not in the main column. Google does report view-through conversions, but they live in a separate, optional column that most advertisers ignore. The default ROAS calculation excludes them.
Data-Driven Attribution
For accounts with enough conversion volume, Google defaults to Data-Driven Attribution (DDA) instead of last-click. DDA uses machine learning to split credit across touchpoints. A search journey might assign 0.3 to a generic keyword that started the journey and 0.7 to the branded keyword that closed it. Single-touch credit gets diluted compared to last-click. Google's official attribution model documentation explains how this works.
Smaller accounts fall back to last-click, which is closer to Meta's behavior. But still click-only.
GA4 and Google Ads agree
Google Ads conversions and GA4's "Google Ads" channel almost always agree. They share the same gclid join key and the same general philosophy: a conversion needs a click. Meta has no equivalent cross-check inside the Google ecosystem, which is part of why Meta's number can drift so far from reality without anyone noticing.
Why Google ROAS feels conservative
It feels conservative because Google counts only what it can prove. A buyer who saw a YouTube ad, then Googled the brand name, then bought, gets attributed to "Branded Search" rather than to the YouTube impression that planted the seed. That is technically incomplete but commercially honest. Google is reporting a click, and the click happened.
The side effect: when you compare Meta and Google ROAS side-by-side for the same week, Meta wins by a huge margin even when its ads contribute less to actual revenue. Founders who don't know the rules behind the two numbers shift budget toward Meta and watch overall revenue stay flat or drop. The classic "ROAS goes up, business goes sideways" pattern.
How Enalitica Counts Conversions
Enalitica is built around three rules:
- Real orders only. The source of truth is the WooCommerce or Shopify order record, not the Meta pixel or the Google Ads conversion tag. If the order does not exist in the shop database, it does not exist in our reports.
- Click IDs over cookies. We attribute via
gclid,fbclid,gbraid,wbraid,ttclid,msclkid, and others, captured first-party at landing time and stored on our own domain. ITP, ETP, ad blockers, and third-party cookie deprecation do not break this signal. We covered the full capture mechanism in How to Capture GCLID and FBCLID in WooCommerce. - No view-through. A user must have actually visited the site (we have a session for them) for any channel to be eligible for credit. Impression-only attribution is excluded by design.
Journey reconstruction
For every order we reconstruct the full session journey: which channel families touched the user across all sessions before the purchase. From that journey we classify the order:
- Direct: only one channel family appears in the journey. That channel gets full credit.
- Influenced (multi-touch): two or more channel families appear. The order is shown in each channel's tab as "influenced", and the cross-channel chart shows which other families co-touched.
This is the same rule for every channel: Meta, Google Ads, organic search, direct, email, referral. There is no special "Meta gets to claim view-throughs" carve-out. We dive deeper into the underlying methodology in Multi-Touch Attribution for E-Commerce, and the full landscape sits in our complete guide to ecommerce attribution.
How the numbers add up (and don't)
Two important nuances about Enalitica's numbers:
- Per-channel tabs are intentionally additive. An order on a multi-channel journey appears in every channel's "Influenced" count, once for Google Ads, once for Meta, once for Organic, etc. That is the point of the multi-touch view. Each channel can see the orders it actually contributed to.
- The store-level summary is intentionally deduplicated. The headline "total revenue" number assigns each order to a single primary channel (the last click before purchase) so the totals across channels sum to real shop revenue.
If you sum the per-channel "Direct + Influenced" numbers expecting them to equal the store total, they won't, and shouldn't. Multi-touch reporting is additive by design; the summary is deduplicated by design.
Conservative by design
Because we exclude view-through and tie credit to a real session, our per-channel ROAS numbers will almost always be lower than Meta's and similar to or slightly higher than Google's. In customer reviews this is the single biggest source of "wait, why is Enalitica ROAS lower than Meta?" The rest of this post is the answer.
What we send back to the platforms
We send our verified, deduplicated conversions back to Meta (Conversions API) and to Google (Enhanced Conversions / offline conversions) so the bidding algorithms still get a strong signal. The platforms get accurate optimization data; the dashboards still report whatever they report. This is intentional. We do not try to fix Meta's reporting. We just stop relying on it for spend decisions.
Worked Example: Same Week, Three Numbers
Real Slovenian D2C client, anonymised, week of 2026-04-21:
| Source | Reported revenue | Reported ROAS |
|---|---|---|
| Meta Ads Manager (default 7d click + 1d view) | €38,400 | 8.0 |
| Google Ads dashboard (DDA, click-based) | €11,200 | 3.7 |
| GA4 (last non-direct click) | €18,900 | N/A |
| Actual shop revenue (WooCommerce) | €31,500 | N/A |
| Enalitica Reports, Meta tab | €8,950 direct + €4,200 influenced | 2.7 / 4.0 incl. influenced |
| Enalitica Reports, Google Ads tab | €9,300 direct + €3,800 influenced | 3.1 / 4.4 incl. influenced |
Three things to notice:
- Meta + Google + GA4 attributed €68,500 of revenue. Real revenue was €31,500. Roughly half of all reported attribution is double-counted.
- Meta's standalone €38,400 is more than the entire store made that week. That is only mathematically possible because of view-through stacking.
- Enalitica's Meta-direct ROAS (2.7) is in line with Google's reported ROAS (3.7). When both sides use comparable click-based logic, they agree. The huge Meta dashboard number is the outlier, not the small Enalitica number.
Why The Numbers Don't Add Up
Mathematically, here is what happens. For any given order:
| Question | Meta answer | Google answer | Enalitica answer |
|---|---|---|---|
| Does an ad impression in the last 24h count? | ✓ | ✗ | ✗ |
| Does a click 7 days ago count? | ✓ | ✓ (within window) | ✓ (within window) |
| Do we check what other platforms did? | ✗ | ✗ | ✓ |
| Do we deduplicate against the actual order? | ✗ | ✗ | ✓ |
| Do we model missing data? | ✓ | Partially | ✗ |
Meta and Google each operate as if they are the only platform that exists. Enalitica operates as if the order is the only thing that's real and platforms are competing for credit on it.
When every platform claims orders independently, total reported attribution exceeds total actual revenue. EMARKETER's research on attribution shows that around 60% of marketers don't trust their own marketing attribution data, and double counting across walled gardens is the most-cited reason.
What This Means for Spend Decisions
A few practical takeaways from auditing dozens of e-commerce accounts running this exact pattern.
Don't pause Google because Meta's ROAS looks better
They are not measuring the same thing. Meta's headline number is best understood as an upper bound, not a point estimate. A reasonable mental model is:
Meta-reported ROAS ≈ 1.5 to 2.5 times true incremental ROAS (for stores running broad retargeting on default attribution settings).
If Meta is showing ROAS 6, true incremental ROAS is more likely in the 2.5 to 4 range. That is still a profitable channel, just not a magical one.
Use one common ledger for budget shifts
Comparing channel A's ROAS to channel B's ROAS only works if both numbers were calculated the same way. Either compare two click-based numbers (Google dashboard vs Enalitica Google tab) or two order-based numbers (Enalitica Google tab vs Enalitica Meta tab). Don't compare Meta dashboard to Google dashboard. Different definitions, different scales.
Pause on the profit pair, not on revenue alone
Even an honestly measured ROAS still compares revenue to spend. Enalitica also shows POAS (profit on ad spend: revenue minus product costs, shipping, payment fees and packaging, divided by spend) for every campaign, and it comes as the same direct plus multi-touch pair as revenue. Direct POAS counts only the orders the campaign closed; MT POAS adds the profit of every order it assisted. Before pausing anything, check both: a campaign below 1.0 on direct but above it on MT POAS is feeding profitable orders that other channels close, while a campaign below 1.0 on both is genuinely buying revenue at a loss no matter what its ROAS says.
Keep CAPI and Enhanced Conversions on
Bad reporting and good optimization signal can coexist. The platforms still need accurate event signal to bid well. You just don't need to read their dashboards as gospel afterwards. CAPI improves Meta's bidding accuracy without forcing you to trust Meta's view-through math.
For incrementality, run holdouts
Even Enalitica's number is correlation, not causation. A geo holdout, a campaign-pause experiment, or a Meta lift study is the only way to measure whether Meta is causing sales, not just touching them. We can build the journey reconstruction. We can't replace experimentation.
Don't compare cross-channel to a 100% target
If your three dashboards add up to 180% of actual revenue, that is normal. The fix is not to "find the missing 80%". It is to pick one source of truth and stop adding the others to it.
How to Read Each Dashboard Like an Adult
A short field guide for the next time you open Ads Manager.
| Dashboard | What you're actually looking at | When to trust it |
|---|---|---|
| Meta Ads Manager (default) | 7d click + 1d view, no cross-platform dedup, partial modeling | Bidding signal, not budget allocation |
| Meta Ads Manager (7d click only) | Click-based Meta credit, no view-through inflation | Closer to reality, still walled garden |
| Google Ads conversions | Click-based with DDA, view-through in separate column | Generally reliable for Google channel ROI |
| GA4 Acquisition Reports | Last non-direct click, sample-degraded above 500K events | Trend direction; absolute numbers degrade with consent loss |
| Shop / WooCommerce dashboard | Actual orders and revenue | Always. This is the only number that came from a payment processor |
| Enalitica Reports | Order-based, click-ID-anchored, channel-deduplicated | Spend decisions and channel comparison |
Meta and Google dashboards are useful. They are not wrong about what they see. They are wrong as a source of truth because they each see only their slice and assume the rest of the world doesn't exist.
How Enalitica Reports Solve This
Enalitica's Reports (Poročila) page is built specifically for the comparison problem this post describes.
One ledger, every channel
Each channel tab (Google Ads, Meta Ads, Organic, Social, Email, Direct) shows the same two columns:
- Direct revenue: orders where this channel was the only one in the journey.
- Influenced revenue: orders where this channel touched the user but a different channel was the converting session.
Both numbers are derived from the same order list. If you click a campaign or keyword row, you see the actual orders, with order numbers, customer city, products, and totals. No black-box modeling, no view-through impressions, no double-counting against other platforms.
The same direct-plus-multi-touch pair also exists for profit: campaign tables show POAS (profit on ad spend, after product costs, shipping, payment fees and packaging) next to ROAS, as direct POAS and MT POAS. Revenue tells you which campaign sells; the profit pair tells you which one earns.
Click-ID anchored
For paid channels, Enalitica anchors attribution to first-party click IDs captured at order time. A gclid captured in WooCommerce order metadata in February is still attributable in May, regardless of cookie state, ITP, or ad blockers. We covered the validity windows and capture mechanics in detail in GCLID vs GBRAID vs WBRAID and How to Capture GCLID and FBCLID in WooCommerce.
Keyword-level revenue per order
For Google Ads orders, we enrich each order with the exact campaign, ad group, keyword, match type, ad creative, and average CPC that drove the click. The Google Ads tab shows revenue grouped by campaign, then by keyword, with each keyword expandable to the actual orders.
That means the question "which exact keyword paid for itself this month?" has a real answer, not a campaign-level approximation.
Privacy-resilient
| Privacy event | GA4 attribution | Order-based attribution |
|---|---|---|
| User declines cookie consent | Lost | Captured (click ID in WooCommerce metadata) |
| Safari ITP purges cookies after 7 days | Lost for delayed purchases | Captured (server-side at order time) |
| Ad blocker blocks GA4 | Lost | Captured (orders synced from shop database) |
| GA4 JavaScript fails to load | No event fired | Order still exists with full attribution |
This is the structural reason order-based attribution holds up where event-based attribution decays. The event might not fire. The order always exists.
If your team is currently shifting budget based on Meta dashboard ROAS and you suspect the numbers feel optimistic, this is exactly the gap Enalitica closes. Book a demo and we'll walk through your last 30 days of orders together, comparing what each platform claims to what the shop database actually shows.
Implementation Checklist
Five things you can do this week, in order of effort.
- Open Meta Ads Manager and change the default attribution setting on one ad set. Ad set → Conversion → Attribution setting → 7-day click only. Run it for a week. Compare the new ROAS to the old one. The drop is the size of your view-through inflation.
- Stop comparing Meta dashboard ROAS to Google dashboard ROAS. Pick one source of truth (preferably an order-based one) and use it for both.
- Capture GCLID and FBCLID server-side at order time. WooCommerce 8.5+ does this automatically; older versions need a click ID capture plugin or snippet. This is the foundation everything else builds on.
- Turn on CAPI for Meta and Enhanced Conversions for Google. This improves bidding regardless of how you measure ROAS. See our Meta CAPI guide for the deduplication settings.
- Run a campaign-pause holdout once per quarter. Pause your top Meta campaign for 7 days. Watch what happens to total shop revenue, not Meta-reported revenue. The delta is the closest thing to a real incrementality number you can produce without geo experiments.
FAQ
Should I trust Meta-reported conversions or GA4 numbers?
Neither, as an absolute count. Trust each for what it measures well: Meta's number tells you which of its own campaigns and creatives perform relative to each other, GA4's number gives you a consistent (if incomplete) view across channels. For the absolute count of orders and revenue, trust your store's order database, it is the only system that recorded every sale. That is the number your bank statement will agree with, and it is the baseline both dashboards should be judged against.
Should I just disable view-through attribution in Meta?
Yes for reporting, no for optimization. Change the reporting comparison column to 7-day click (steps in How to switch your Meta reporting to click-only above) and you get honest numbers without touching how Meta bids. Don't turn off view-through events at the ad set level or stop sending them to Meta entirely, that degrades the algorithm's learning signal and your campaign performance can drop.
Why does my GA4 number disagree with both Meta and Google?
GA4 uses last non-direct click by default for its standard reports. If a user clicked a Meta ad two weeks ago and came back via direct yesterday, GA4 credits the Meta channel as the last non-direct touchpoint, but Meta's 7-day click window would have already expired. Different windows, different rules. GA4 is also subject to consent loss and ad blocker decay, so its absolute numbers should be treated as directional, not authoritative.
Is Meta's view-through attribution useful for anything?
Yes, for one specific question: "did anyone who saw this campaign convert at all?" View-through is a soft signal that helps with prospecting campaigns where you expect long, indirect journeys. It is not useful for headline ROAS comparison or for deciding how to split budget across paid channels. Treat view-through as a separate column you check occasionally, not as part of the conversion total you pay attention to daily. We break down exactly where view-through hides in both platforms' reports in how view-through conversions inflate ROAS.
Can Google Ads also over-attribute the way Meta does?
Yes, but less aggressively. Google Ads can over-attribute when a user sees a Display ad they don't click, then searches for your brand and buys. The Display impression gets recorded as a view-through conversion but is reported in a separate column, not the main one. So the headline number stays clean. The over-attribution potential exists; it's just not embedded in the default ROAS column.
Why doesn't Meta + Google + Enalitica add up to total shop revenue?
They will if you compare the right numbers. Meta and Google don't deduplicate against each other, so adding their dashboards always produces a bigger number than reality. Enalitica's per-channel "Direct + Influenced" view is also intentionally additive (each channel sees orders it touched). The number that does add up to total shop revenue is Enalitica's deduplicated store-level summary, which assigns each order to one primary channel (the last click before purchase). Use the additive view for "did this channel contribute?" and the deduplicated view for "where did this revenue come from?".
How does this change once Privacy Sandbox / Topics replaces third-party cookies?
It doesn't, much, for order-based attribution. We never relied on third-party cookies. The platform dashboards (Meta and Google) will lean even harder on modeling, which means the gap between dashboard ROAS and actual click-attributed ROAS will likely widen, not narrow. The further the platforms move into modeled-conversion territory, the more important an order-based ledger becomes as the sanity check.
What if I run mostly retargeting on Meta?
Retargeting amplifies the over-attribution problem. By definition, your retargeting audience has already visited the site, which means another channel almost certainly drove the original visit. When the user comes back and buys, Meta's view-through window claims credit for an order someone else (organic, direct, email) actually set up. If you run heavy retargeting, expect Meta-reported ROAS to be 3 to 5 times higher than the click-attributed number. Switch reporting to "7-day click only" to see what retargeting is actually contributing on top of the channel that originally brought the visitor.
Does Enalitica replace GA4?
No, it complements GA4. GA4 is great for session-level behaviour (scroll depth, video engagement, on-site funnel) and Enalitica is great for order-level revenue attribution. We pull GA4 data into the Reports view as enrichment, but the order is always the source of truth. If GA4 is missing, the order still gets attributed using its WooCommerce or Shopify metadata.
See your real numbers
Import 30 days of orders or leads instantly during 5-minute onboarding. Works for e-commerce and service businesses.
Start free