All posts Pricing & margin · 25 May 2026 · 14 min read

The attribution window myth: why Meta says 8x ROAS while your bank account stays flat.

Meta says you got 8.4x ROAS this week. Your bank shows you broke even. Both are accurate; only one is useful. Here is what attribution windows actually do, the five ways they overstate ad performance, the 14-day pause test that exposes the truth, and the single math that does not lie.

Ibrahim Ölmez Founder, nouz · serial entrepreneur

Meta Ads Manager says you got an 8.4x ROAS this week. Your bank account shows you broke even. Both numbers are accurate. Only one of them is useful. This is the gap that destroys more small Shopify stores than bad products do — owners who scale ad spend against a platform-reported ROAS that includes view-through conversions on a 7-day window, cross-device matches the platform "modeled," brand-search clicks from people who were already coming, and last-touch credit for everything that happened to be near the bottom of the funnel. The bank statement is the one number that has been audited by reality. This post walks through what attribution windows actually do, the five specific ways they overstate ad performance, the simple 14-day pause test that exposes the gap, and the math that uses your bank account as the source of truth — because nouz is built on the idea that the only KPI that survives contact with reality is daily EBIT, and ad spend is a variable cost like any other.

TL;DR

The honest attribution math. Meta/Google ROAS is a model, not a measurement — they credit a sale to a click within a window (7-day click, 1-day view is the Meta default) and claim it caused the sale. Five biases inflate the number: last-click overcrediting, view-through inflation, cross-device double-counting, brand-search cannibalisation, and iOS-14 modeled conversions. The fix: compute blended ROAS (total revenue ÷ total ad spend, regardless of channel) and run a 14-day pause test on the channel you suspect. If revenue drops less than the channel "claimed," the channel was overstating. A 6x ROAS that does not show up in your bank is a 6x ROAS that does not exist.

The diagnostic moment: 8.4x ROAS, flat bank

Every Shopify owner who has ever scaled paid acquisition has lived a version of this scene. You open Meta Ads Manager on Monday morning and the week's ROAS reads 8.4x. You spent €1,800 last week and Meta says it generated €15,120 of attributed revenue. Phenomenal week. You open Shopify and gross sales for the week were €16,400 — close enough to Meta's number that the dashboard feels right. You feel a small surge of confidence and you start drafting the email to the agency about doubling next week's budget.

Then you open your bank account. The balance is exactly where it was the Monday before. You did €16,400 in sales and your bank account did not move. You assume payouts are delayed, or that this week's supplier invoice is the explanation, or that the card processor is sitting on funds. By the next Monday, after a second week of "8.4x ROAS" and another flat bank balance, the explanation has run out of room. The Meta number is large, the Shopify number is large, the bank number is flat, and the math should not work that way.

The reason the math does not work is not that anyone is lying. The Meta ROAS number is computed honestly, against the rules Meta has chosen. The Shopify gross sales number is also accurate. The bank account is also accurate. What is wrong is the implicit assumption that Meta's 8.4x ROAS means "Meta caused €15,120 of revenue that would not have happened otherwise." That is not what 8.4x ROAS means. It means "€15,120 of sales happened in a window after someone saw or clicked a Meta ad, and Meta is taking credit for all of it." Those are very different sentences. The first is a measurement. The second is a guess at causality made by a platform whose business model depends on the guess being generous.

The owners who eventually escape this loop do one thing: they stop treating platform-reported ROAS as a measurement of incremental revenue and start treating it as a directional indicator. The number that decides whether to keep spending is the bank balance — and underneath that, daily EBIT, which is bank-account math made visible before the bank tells you. More on the wider "sales up, bank flat" diagnostic.

What attribution actually does

Attribution is the platform's rule for deciding which clicks or impressions get credit for which conversions. Meta's default attribution setting in 2026 is "7-day click, 1-day view." That means: if a person clicks a Meta ad and then buys anything on your store within 7 days, Meta takes credit. If a person sees a Meta ad (without clicking) and then buys within 24 hours, Meta also takes credit. Google's default is similar — typically a data-driven model with a 30-day click window for paid search, sometimes longer for display.

There are two things to notice about that definition. First: it is a window, not a causal claim. The platform is not saying "this ad caused this sale" — it is saying "this sale happened within the window after some interaction with this ad, so we will count it." Second: the windows overlap with everything else. A customer who saw your Meta ad on Monday, saw your Google ad on Tuesday, opened your email on Wednesday, and bought on Thursday is claimed by Meta (saw an ad within 7 days), claimed by Google (clicked within 30 days), claimed by Klaviyo (opened an email within the conversion window), and possibly claimed by an affiliate or influencer if a discount code was used. The total credited revenue across all platforms is greater than 100% of actual revenue — sometimes 130-180% greater. The platforms do not reconcile against each other. Each one shows you the slice of credit it claims, and none of them tells you what would have happened without it.

This is the entire problem in one sentence: attribution is a guess at causality, not a measurement of profit. The platforms have an incentive for the guess to be generous, because generous guesses make ROAS look better, which makes you spend more on ads, which makes the platform more money. The platforms are not lying — the math inside each window is correctly computed — but the framing ("you got 8.4x ROAS") sounds like a measurement and is actually a model with a thumb on the scale.

A simple test for "is this a measurement or a model?" If the same sale can be claimed by Meta, Google, Klaviyo, an affiliate, and a TikTok view-through within the same 7 days — and it can, routinely — then none of those numbers is a measurement of incremental revenue. They are overlapping claims. The bank statement is the only number that adds up to exactly 100% of what happened.

The five attribution lies

Calling them "lies" is unfair to the platforms in a technical sense — each individual number is computed correctly by its own rules. But the cumulative effect on an owner who reads platform dashboards as if they were profit reports is that the ROAS numbers are systematically more optimistic than the bank account. Five specific biases drive this, and any one of them can be enough to make a "profitable" channel actually unprofitable on the math.

1. Last-click overcredits the last touch

About 90% of paid attribution in small ecommerce still runs on a last-click or last-interaction model, even when the platform offers data-driven alternatives. The reason is simple: last-click is easy to understand, easy to audit, and easy to report to a client. It is also wrong in a specific direction — it credits whichever channel happened to deliver the final ad before the purchase, regardless of which channel actually moved the customer toward the purchase.

A typical bottom-of-funnel pattern: a customer discovers your brand from an organic Instagram post in week 1, signs up for your email in week 2 from an organic blog post, reads three emails in week 3, sees a retargeting Meta ad in week 4 because Meta knows they visited your site, clicks it, and buys. Last-click attribution awards 100% of that revenue to the Meta retargeting ad. Realistic causal credit is something like 20% Meta (closed the loop), 30% email (built intent), 30% organic Instagram (initial discovery), 20% blog/SEO (built familiarity). Meta gets 5x more credit than it earned on the actual causal path.

The effect on aggregate ROAS is large. Retargeting campaigns — which by definition only run against people who have already engaged with your brand — routinely report 8-15x ROAS in Meta Ads Manager. If you pause retargeting for two weeks, the typical revenue drop is 5-25% of the campaign's claimed contribution, not 100%. The "missing" revenue does not vanish — it converts through one of the other touchpoints that was already doing most of the work. Retargeting ROAS, in incremental terms, is usually 1.5-3x, not 8-15x.

2. View-through credits people who would have bought anyway

View-through conversions credit a sale to an ad that the customer saw but never clicked. Meta's default 1-day view-through window means: if your ad appeared in someone's feed within 24 hours before they purchased, Meta takes credit, even if they scrolled past without clicking. The intent is reasonable — exposure matters, brand familiarity compounds, not every causal influence requires a click. The execution is corrupting because high-intent buyers are also high-volume browsers, so the people most likely to see one of your ads "by coincidence" within 24 hours of buying are the people who were already going to buy from you that week.

The arithmetic gets worse for brands with strong organic demand. If you have an active email list, a steady stream of organic search traffic, and a returning-customer base — all sources of customers who would have bought without any paid touch — view-through attribution will silently credit your paid campaigns for the organic demand because the organic buyers also see your retargeting ads in their feed. The fraction of view-through "conversions" that are actually organic demand inflation is hard to measure precisely but it is meaningful — typically 30-60% of view-through credit for brands with healthy organic channels.

The clean test: in Meta Ads Manager, switch the attribution setting from "7-day click, 1-day view" to "7-day click" only (no view-through). Watch reported ROAS drop. The amount it drops is approximately the share of credit that was view-through inflation. For brands with a strong organic base, dropping view-through usually cuts reported ROAS by 25-50%. That cut is the closest thing you get to seeing the bias in a single click.

3. Cross-device blind spots double-count

A customer browses your store on their phone over lunch, sees a Meta ad on Instagram on the same phone, then goes home and buys from their laptop in the evening. Meta sees a click on the phone, sees a purchase on the laptop, and connects them through its identity graph — sometimes correctly, often partially. Google sees the same purchase happen after a search-ad click that landed on the laptop. Both platforms claim credit, and both are doing their own probabilistic cross-device matching with imperfect data.

The result is that the same sale can be counted twice across platforms, with neither one knowing the other took credit. In aggregate across a Shopify store running Meta + Google + email + affiliate, the sum of attributed revenue across all channels is routinely 110-160% of actual revenue. The "overage" is the cross-platform double-counting plus the within-platform cross-device approximations. If you have ever added up your platform-attributed revenue numbers and noticed they exceed your Shopify gross sales, this is why — and it is not an edge case, it is the default state of the data.

4. Brand-search ads cannibalise organic that was already coming

You run a Google ad on searches for your own brand name. When someone searches "[your brand name]" and clicks the paid ad at the top, Google credits the sale to paid search. Google Ads Manager shows a healthy ROAS — often 10-25x — on the brand campaign. The owner looks at the number, feels confident, and the campaign stays on for years.

The hidden math: most of those clicks would have happened on the organic result directly below the paid ad. A customer searching for your brand name has already decided to find you — the question is just which link they click. The fraction of paid brand-search clicks that are genuinely incremental (people who would not have clicked the organic result) is small in most categories — typically 10-30%, depending on how aggressive your competitors are at bidding on your brand terms. The other 70-90% is cannibalisation: paid budget spent buying clicks that organic was already delivering for free.

The test is brutally simple. Pause your branded search campaign for two weeks. Compare total revenue from brand-search-driven sessions (paid + organic combined) to the prior two weeks. If total branded revenue drops by less than the campaign claimed it generated, the difference is what was cannibalised. Most owners who run this test discover their brand campaign is contributing 15-30% of what the ROAS number suggested, and the campaign either gets cut or scoped to defensive bidding only (when a competitor bids on your brand name). More on how platform dashboards systematically mislead.

5. iOS 14/14.5 changed Meta to modeled (i.e. guessed) conversions

When Apple released iOS 14.5 in April 2021 with App Tracking Transparency, the share of iPhone users who allow apps to track them across other apps and websites dropped sharply — to roughly 25-30% in most markets within a year, where it has stayed. For Meta, that means roughly 70% of iPhone users no longer share the identifiers that let Meta deterministically connect "this ad impression" to "that purchase on your Shopify store." For users where the identifier is missing, Meta uses statistical modeling to estimate conversions — essentially guessing how many sales the ad probably generated, based on patterns from the minority of users where it can still measure directly.

Meta's modeled conversions are not random guesses — they are reasonably sophisticated. But "reasonably sophisticated guess" is a different thing than "measurement," and the guesses tend to be more optimistic than reality because the model is calibrated against the deterministic data from non-Apple devices, where measurement is still good and ROAS tends to be higher. Apple's own communications about ATT, and independent audits by ad-tech researchers, have suggested Meta's modeled conversions in iOS-heavy categories can overstate true conversions by 15-40%, depending on the campaign type and the audience.

The practical implication for a Shopify store: if a meaningful share of your customers are iPhone users (which is the default in the US, UK, much of Western Europe, Australia, Japan), a meaningful share of your Meta-reported conversions are modeled estimates rather than measured events. The ROAS number you see in Ads Manager is partly a measurement and partly a model — and the model component is biased upward. You cannot tell from the dashboard which conversions are which; Meta does not break it out.

The cumulative effect. Each of the five biases is small on its own — 5%, 10%, 15% of inflation. Stacked together on a typical Shopify store running Meta + Google with default attribution, the combined effect routinely makes platform-reported ROAS 1.5-3x higher than incremental ROAS measured against actual bank revenue. A reported 8x ROAS is often a real 3-4x. A reported 4x ROAS is often a real 1.5-2x. A reported 2x ROAS is often a money-loser.

What you would discover if you cut the channel

The cleanest possible test of whether a channel is generating incremental revenue is to turn it off and watch what happens. Incrementality testing, in academic terms, is a randomised experiment that compares conversions in a treatment group (sees ads) to conversions in a control group (does not see ads), holding everything else constant. The big-budget version of this exists — Meta's Conversion Lift studies, Google's ghost-ad experiments — and they require six-figure ad budgets to run reliably, which puts them out of reach of small Shopify stores.

The small-shop version is simpler and surprisingly informative: pause the channel for 14 days, watch your overall revenue, and compare to a baseline. If your overall revenue drops by less than what the channel was "claiming" it generated, the channel was overstating. If overall revenue drops by approximately what the channel claimed, the channel was honest. If revenue drops by more than what the channel claimed (rare but real, especially with brand-building campaigns), the channel was actually under-reported.

A worked example. Suppose Meta is claiming €4,000 of weekly attributed revenue on €1,000 of spend (4x ROAS). You pause Meta for 14 days. In a clean test where the rest of your stack is steady, you would expect total weekly revenue to drop by ~€4,000 if Meta's number is honest. If total revenue drops by €1,500, Meta was overstating by roughly 2.7x — incremental ROAS is actually 1.5x, not 4x. If total revenue drops by €3,800, Meta was approximately honest. If revenue drops by €4,500, Meta was slightly understating (sometimes happens with awareness-driven campaigns where view-through under-credits the long-tail impact).

The test is not perfect — seasonality, competitor activity, weather, news cycles, and your own organic momentum all introduce noise. The cleaner you can hold everything else constant during the test, the better the signal. But even a noisy version of this test is more honest than trusting platform ROAS unchallenged. Most small Shopify owners who run their first pause test on Meta discover incremental ROAS is 30-60% of what Meta claimed. The discovery is uncomfortable; the discovery is also worth the test.

The math that does not lie

There is exactly one number in your business that is not a model, not a guess, and not subject to attribution windows: the closing balance of your bank account at the end of the month, minus the closing balance at the start. Everything else is a representation of activity. The bank balance is the consequence of activity. It is the only number with a 100% match to reality.

The formula that ties bank movement to operating math is the one that lives in lib/calculations.ts in nouz and that this entire site is built around:

Gross revenue − Tax − Card transaction fees = Net revenue
Net revenue − COGS − Variable costs − (Monthly fixed ÷ 30.4375) = EBIT

Ad spend is a variable cost. Whatever Meta or Google said the ROAS was, the ad spend deducts from net revenue at face value — the actual euros that left your account and went to the platforms. There is no "attributed revenue" line in the EBIT formula. There is only revenue you actually collected (net of tax and card fees) and costs you actually paid (including ads). The math respects the bank because it is computed from the same inputs the bank sees.

This is why a daily EBIT number tied to actual cash inflows and outflows is the only safe basis for ad-spend decisions. The platform ROAS is a useful directional signal — it tells you whether one campaign within a platform is doing better than another within the same platform under the same attribution rules — but it is not a basis for deciding whether the channel as a whole is making you money. The bank statement is. More on the per-order math that produces the EBIT number.

What Meta/Google says vs what your P&L says

Side by side, the gap between what the ad platform dashboard reports and what the bank-statement math actually shows. Eight rows of the most common discrepancies, with a verdict on which to trust for which kind of decision.

What Meta/Google saysWhat your P&L saysWhich to trust
"8.4x ROAS this week from Meta""Revenue went up €1,800 on €1,800 of Meta spend — 1.0x incremental"P&L. Platform ROAS is a model with view-through, last-click, and cross-device inflation baked in.
"Branded search delivered 15x ROAS""Pausing branded search dropped revenue by 8%, not the 60% Google claimed"P&L. Most branded-search clicks were cannibalising organic that was already coming.
"View-through conversions added €2,400 this week""Switching to 7-day click only dropped attributed revenue by €2,300 — view-through was inflation"P&L. View-through credit is often organic demand the platform happened to overlap with.
"Retargeting ROAS is 12x""Pausing retargeting for 14 days dropped revenue by ~20% of claimed contribution"P&L. Retargeting credits the last touch on customers who were already converting via other channels.
"Total attributed revenue across Meta + Google + Klaviyo = €22,000""Shopify gross sales for the same period: €15,000"P&L. Cross-platform double-counting is the default — the attributed numbers exceed reality by 40-60%.
"Campaign CAC is €18 per acquired customer""Total ad + agency + creative spend ÷ true new customers = €27"P&L. Platform CAC excludes agency fees, creative production, and customers acquired off-platform within the same window.
"Conversions Lift study shows campaign is 30% incremental""Same study, but for ROAS the incremental number is the only one that matters"P&L. Even Meta's own incrementality studies confirm reported ROAS is usually larger than incremental ROAS.
"Modeled conversions from iOS users: 480 this week""Bank-reconciled conversions across all devices: ~360 this week"P&L. Modeled conversions are statistically estimated and tend to overstate by 15-40% in iOS-heavy categories.

The pattern across every row is the same: the platform number is computed honestly within its own rules, the bank-statement number is what actually happened, and the gap between them is the difference between a model and a measurement. Owners who run their store on the platform numbers scale spend against optimistic estimates and run out of cash. Owners who run their store on the bank-statement math scale spend only when the bank confirms the model. Both groups can look at the same dashboards. Only one group keeps the business solvent.

The "blended ROAS" fix

If per-channel attribution is unreliable, the practical workaround is to compute blended ROAS — total revenue across the business, divided by total ad spend across all channels, in the same period. It is less precise than per-channel attribution would be if attribution worked, but it has the enormous advantage that it cannot be fooled by any one platform's biases. There is no view-through, no cross-device, no last-click, no modeled conversions. There is just "we spent X on ads in total, and we did Y in revenue in total, so blended ROAS is Y ÷ X."

Blended ROAS formula. Blended ROAS = Total gross revenue ÷ Total ad spend across all paid channels (Meta + Google + TikTok + Pinterest + influencer + affiliate commissions + agency retainer + creative production attributable to ads). For a healthy ecommerce business with a meaningful paid-acquisition share, blended ROAS typically lands at 3-5x. Below 2.5x usually means the math is too tight to be profitable after COGS, shipping, fees, and fixed costs. Above 6x usually means you are under-investing in acquisition and could scale.

A worked example. Last month you spent €3,200 on Meta, €1,400 on Google, €600 on TikTok, €450 on an agency retainer, and €350 on creative production attributable to paid ads. Total ad spend: €6,000. Last month's gross revenue (from Shopify, net of nothing — gross including VAT): €24,000. Blended ROAS: €24,000 ÷ €6,000 = 4.0x. That is the number to use for go/no-go decisions on increasing or decreasing the ad budget. Per-channel attribution can inform the mix decision (which channel to favor at the margin), but blended ROAS is the only honest top-line measure.

There are two refinements that make blended ROAS more useful. First: strip VAT from the revenue numerator if your business is VAT-registered, because VAT is not yours. A €24,000 month with 20% VAT is €20,000 of revenue that is actually yours, and blended ROAS becomes €20,000 ÷ €6,000 = 3.33x. Second: net contribution margin, not gross revenue, is the real test — blended ROAS of 4x sounds healthy, but if your gross margin after COGS, shipping, fees, and packaging is 30%, then €24,000 of revenue produces €7,200 of contribution against €6,000 of ad spend, which is barely positive contribution per ad euro. The deeper version of this analysis is on the break-even ROAS calculator — it tells you the minimum blended ROAS you need given your cost stack.

The discipline blended ROAS enforces is uncomfortable: you can no longer tell yourself the story that "Meta is doing great, Google is doing great, all our channels are profitable" while the bank shows you breaking even. If every channel reports 6x ROAS individually and the blended number is 2.5x, the platform numbers are wrong. The blended number is right. Use the right one for decisions.

How to test if Meta is overstating your ROAS

The 14-day pause test is the simplest, cleanest incrementality test a small Shopify owner can run without statistical infrastructure. It does not give you a precise number, but it gives you a directional truth that is more valuable than the precise lie the platform is selling. The procedure:

  1. Pick a stable two-week baseline. Look at the 14 days before you start the test. Pull total revenue, total order count, total new customers, and total ad spend across all channels. Make sure nothing unusual happened in that window — no major sale, no product launch, no viral moment, no big email blast that would inflate or deflate the baseline. If the period is unusual, pick a different 14-day window.
  2. Pause the channel completely. Turn Meta off entirely for 14 days. Not "reduce spend by 50%" — fully paused. Half-measures contaminate the test because Meta's algorithm will reallocate the remaining budget in ways that distort the comparison.
  3. Keep everything else constant. Do not increase Google spend to compensate. Do not run a special email campaign. Do not change pricing, do not launch a new product. The test only works if the only changed variable is the paused channel.
  4. Measure during the pause. Track total revenue, total order count, and total new customers for the 14-day pause period. Compare to the baseline.
  5. Compute incremental contribution. "Lost revenue" during the pause ÷ "claimed Meta revenue" during the baseline = approximate incremental ratio. If Meta claimed €4,000/week of attributed revenue and pausing drops total revenue by €1,500/week, incremental contribution is roughly 1,500 ÷ 4,000 = 37.5%. Real ROAS is roughly 37.5% of reported ROAS.
  6. Decide. If incremental ROAS is at or above your break-even ROAS (computed against your full cost stack), keep the channel and turn it back on. If incremental ROAS is below break-even, either restructure the channel (different audiences, different creative, narrower targeting) or cut it.
  7. Re-test once a quarter. Incrementality drifts as audiences saturate, creative fatigues, and platform algorithms change. A channel that tested as 65% incremental in Q1 can drop to 30% by Q4 without anything obvious changing.
Things that contaminate the test. Seasonality (run the test in a stable period, not during peak retail season or summer slowdown). Concurrent campaigns (no influencer activations, no major email blasts, no PR moments). Competitor activity (a competitor running a big sale during your pause will artificially depress your baseline-period revenue). Macro news cycles (election weeks, major news events). The cleaner the test conditions, the more trustworthy the result — but even a noisy test is better than no test at all.

A 14-day pause sounds like a long time to give up revenue if the channel is genuinely incremental, and it is. The trade-off is that you gain a high-confidence answer about whether you have been overpaying for that channel for months. Most small Shopify owners who run this test recover the "lost" 14 days of revenue within a quarter by reallocating budget away from the channels that turned out to be overstated and toward the channels (or the organic/retention investments) that turned out to be doing the actual work. More on the retention math that often emerges as the better investment after a pause test.

Why CAC from platforms understates true CAC

Closely related to the ROAS-inflation problem is the CAC-deflation problem. Platform-reported CAC numbers are systematically lower than your true CAC, for reasons that mirror the ROAS-inflation reasons but cut in the opposite direction:

  • Platforms exclude agency fees. If you pay an agency €1,500/month to manage your Meta ads, Meta's reported CAC ignores that line. True CAC includes it — agency cost ÷ acquired customers is part of the cost of acquisition.
  • Platforms exclude your time. If you spend 8 hours/week managing your own ads at an honest opportunity cost of €25/hr, that is €800/month of unbilled labor that real CAC includes. Most owner-operators never book this line, which is why their reported CAC looks lower than it is.
  • Platforms exclude creative production cost. The €600 you paid a freelancer to shoot the new product video this month is part of the cost of acquiring customers for the campaigns that used that video. True CAC amortises it across the customers acquired by ads running that creative.
  • Platforms exclude returns and refunds. If 15% of acquired customers return their order and you refund them, true CAC is computed against the customers who actually kept their order — not the gross acquired number. Platform CAC uses the gross number and looks better.
  • Platforms exclude cross-channel overlap. Meta CAC and Google CAC each take credit for some of the same customers, so the per-channel CAC numbers sum to fewer "unique" customers than the platforms imply. Blended true CAC is higher than either platform-reported CAC.

For a typical small Shopify store, the gap between platform-reported CAC and true CAC is usually 30-80%. A €15 Meta-reported CAC commonly translates to a €22-€27 true blended CAC once agency, creative, owner time, and returns are properly allocated. This matters because every break-even ROAS, every CLV:CAC ratio, every "should I scale?" decision is driven by the CAC number. Using the platform number instead of the true number is the difference between thinking you can scale profitably and discovering you have been scaling unprofitably.

The fix is the same fix as for ROAS: compute it from the totals, not the dashboards. Sum every euro of acquisition-related cost in a month (ads + agency + creative + tools + your own time if you want to be honest) and divide by net new customers acquired in that month (gross new, minus those who returned within 30 days). That is true blended CAC. Use it in every downstream calculation. The customer acquisition cost calculator walks the full computation.

How nouz makes the truth visible

The structural problem with attribution is that platforms reward themselves with credit, and there is no neutral referee. The structural fix is to build the daily P&L around the bank account, treat ad spend as a variable cost like any other, and look at whether EBIT actually moved. nouz is built on exactly that premise. The formula has not changed since the product launched:

Gross revenue − Tax − Card transaction fees = Net revenue
Net revenue − COGS − Variable costs − (Monthly fixed ÷ 30.4375) = EBIT

Ad spend is a line in "Variable costs." Whatever the platforms claim about ROAS, the spend deducts at the face value of the euros that left your bank. By the end of the week, after a campaign push, you can see two numbers side by side: what the platforms claimed in ROAS, and what the daily EBIT actually did. If EBIT moved up by less than the platforms claimed, the platforms were overstating. If EBIT moved up by approximately the claimed amount, the platforms were honest. The daily P&L is the referee.

A worked weekly review using nouz, after a €1,800 Meta push:

  • Week before the push: daily EBIT averaged €240. Weekly EBIT roughly €1,680.
  • Week of the push: €1,800 spent on Meta. Daily EBIT averaged €280. Weekly EBIT roughly €1,960.
  • Meta said: €1,800 spend × 8.4x ROAS = €15,120 of attributed revenue. Implied EBIT contribution at 12% net margin = €1,814.
  • Bank said: EBIT moved from €1,680 to €1,960. Real EBIT contribution from the Meta push = €280 — about 15% of what Meta's ROAS number implied at a healthy net margin.
  • Decision: the push paid for itself by €280 of incremental EBIT on €1,800 of spend. Real incremental ROAS in EBIT terms is ~1.16x ($1,800 + $280 = $2,080 ÷ $1,800). Worth doing if the alternative was zero, but nowhere near the "scale this aggressively" signal the dashboard implied.

That kind of reconciliation is the entire point. You do not need to dispute Meta's number or argue with the dashboard — you just need to see the bank-confirmed reality next to it, weekly, so the gap stops being abstract. By month two of doing this exercise, the platforms' attribution numbers become directional indicators (useful for comparing campaign A to campaign B within Meta) and the daily EBIT becomes the only number that drives spend decisions. The bank statement is no longer a surprise at month-end.

A nouz rule that catches the attribution problem correctly. Ad spend logs as a variable cost on the day it ran, against the revenue that landed on the same day (and the days following). By end-of-week, you can see whether the spend actually moved EBIT — not just whether it moved ROAS in a dashboard. Card fees apply to card revenue only (always, in ecommerce, that is 100% of revenue — there is no cash bucket). COGS snapshots at sale time so changing supplier prices tomorrow do not rewrite yesterday's margin. Fixed costs allocate by ÷ 30.4375 to keep daily comparisons clean. All four rules are why the daily EBIT number ties to the bank.

Try the true profit calculator for ecommerce to run one day's numbers without signing up. When you want the daily reconciliation to happen every evening — including the gap between platform-claimed ROAS and bank-confirmed EBIT — nouz is monthly, no contract, and setup takes about ten minutes. The live demo has sample ecommerce numbers pre-loaded if you want to see the shape before committing.

A 6x ROAS that does not show up in your bank is a 6x ROAS that does not exist. Platform-reported ROAS is a model with view-through inflation, last-click bias, cross-device double-counting, brand-search cannibalisation, and modeled conversions baked in. The bank statement is the only number that survives contact with reality. Until you reconcile them weekly, the gap between "Meta said 8x" and "bank moved by €280" will keep widening, quietly, every quarter.

What to do this week

You do not have to restructure your media plan this week. You do have to compute three numbers honestly so the attribution gap stops being a story and starts being a measured thing. A practical sequence:

  1. Today: compute blended ROAS for last month. Sum every euro spent on paid acquisition across every channel (Meta + Google + TikTok + influencer + agency + creative). Divide last month's gross Shopify revenue by that number. Write down the result. If you have multiple platforms claiming individual ROAS numbers, sum the attributed revenues across all of them and compare to actual Shopify gross — the overage is the cross-platform double-counting.
  2. Wednesday: compute true blended CAC. Total acquisition spend (same number as above) ÷ net new customers acquired (gross new, minus those who returned within 30 days). Use the CAC calculator if you want help sorting the categories. Compare to whatever your Meta/Google dashboards claimed CAC was. The gap is usually 30-80%.
  3. Friday: compute your break-even ROAS. Use the break-even ROAS calculator — it folds together your gross margin, your fixed-cost slice per order, your shipping and packaging, and tells you the minimum blended ROAS you need to be profitable. Compare to the blended ROAS you computed on day 1. If blended ROAS is below break-even, you are losing money on paid acquisition regardless of what individual platform dashboards say.
  4. Within the next month: run one 14-day pause test. Pick the channel where the gap between reported ROAS and your suspicion is largest (usually retargeting or brand search). Pause it for 14 days. Measure the actual revenue drop. Compute incremental ROAS. Either restructure the channel or cut it.

Most owners who run these four steps for the first time discover that their blended ROAS is meaningfully lower than the platform sums implied, their true CAC is 30-50% higher than Meta/Google reported, and at least one of their channels is contributing far less incrementally than the dashboard suggested. The good news is that these discoveries do not require you to abandon paid acquisition — they require you to allocate more honestly. The owners who do this exercise quarterly tend to settle into a paid-acquisition mix that actually pays for itself in EBIT, with much less spend and much more discipline than they ran before.

The deeper habit, beyond the one-time exercise, is daily reconciliation: ad spend logged against the day, EBIT computed against the same day, and the relationship between them tracked weekly. The true profit per Shopify order post walks the underlying per-order math. The break-even AOV post covers the AOV side of the equation — the floor below which no ROAS, attributed or incremental, makes the unit economics work. The CLV post covers the back end — why a sustainable acquisition strategy almost always depends on the second order, not the first. For definitions, see the ROAS glossary. For the wider operating system this fits inside, see the Shopify profitability pillar.

See what your ads actually did to EBIT, weekly. nouz logs ad spend as a daily variable cost and computes EBIT against the same day's revenue. By Friday evening you can see whether the week's ad push moved the bank-confirmed number or just the platform-reported one. Setup takes about ten minutes; enter your fixed costs, VAT rate, and card processor rate once. See pricing or try the live demo first with sample ecommerce numbers.

The honest summary: Meta and Google are not lying about your ROAS — they are reporting it inside attribution rules they wrote, with biases that systematically favour their own credit. Your bank statement is not biased. It also will not lie to you. The job of running a profitable Shopify store on paid acquisition is to reconcile the two regularly, so that when the dashboards say 8x ROAS and the bank says flat, you notice the gap on Monday instead of in February when the annual P&L finally arrives. The math itself is not complicated. The discipline of reconciling weekly is the entire business.

FAQ

Why does my Meta ROAS not match my bank?

Because Meta's ROAS is a model, not a measurement. It credits sales to ads within a window (default 7-day click, 1-day view) and uses cross-device matching, view-through attribution, and modeled conversions for iOS users. None of that is reconciled against your actual bank deposits. Stacked together, the biases routinely make platform-reported ROAS 1.5-3x higher than the incremental revenue your ads actually generated. The bank is the only number that survives contact with reality — compute blended ROAS (total revenue ÷ total ad spend across all channels) for the honest version.

What attribution window should I use?

For reporting purposes inside a single platform, the default Meta setting (7-day click, 1-day view) and Google's data-driven default are fine for comparing campaigns to each other within the same platform — that is, "is campaign A better than campaign B" inside Meta. For decisions about whether the channel as a whole is profitable, no attribution window is reliable; use blended ROAS computed across the whole business against actual bank revenue. If you want to see view-through inflation specifically, switch Meta to "7-day click only" (no view-through) and watch reported ROAS drop — the drop is the inflation.

How do I run an incrementality test?

The small-shop version: pick a channel you suspect is overstating (usually retargeting or branded search). Establish a stable 14-day baseline of total revenue. Pause the channel fully for 14 days. Measure the actual revenue drop. Compute incremental contribution as (lost revenue ÷ claimed contribution) × 100. If the channel claimed €4,000/week and revenue drops €1,500/week, real incrementality is 37.5%. Keep everything else constant during the test — no compensating spend increases on other channels, no major promotions. The test is noisy but directionally honest, which is more than any platform dashboard offers.

What is blended ROAS?

Total gross revenue (across the entire business, all channels combined) divided by total ad spend (across all paid channels, including agency fees and creative production attributable to ads). It is less precise than per-channel attribution would be if attribution worked, but it cannot be fooled by view-through inflation, last-click bias, cross-device double-counting, or modeled conversions because there is no attribution involved — just sum the inputs and sum the outputs. Healthy ecommerce businesses with meaningful paid acquisition run blended ROAS at 3-5x. Below 2.5x usually means the math is too tight after COGS, shipping, fees, and fixed costs. Use it for go/no-go decisions on budget level; use per-channel ROAS only to decide the mix at the margin.

Should I trust Google Ads ROAS more than Meta?

Slightly, but not by much, and not for the reasons most owners assume. Google's search-intent traffic is more deterministic (a person actively searching for "blue running shoes" has a clearer purchase intent than a person scrolling Instagram), so the attribution windows have less noise to model around. But Google still suffers from cross-device matching errors, branded-search cannibalisation (a huge issue if you run ads on your own brand name), and the same iOS measurement loss in some products. Both platforms' ROAS numbers should be treated as directional within-platform signals, not as bank-statement substitutes. Blended ROAS plus a pause test is the same fix for both.

How do I know my real CAC?

Total acquisition spend in a period (every paid channel, plus agency retainer, plus creative production attributable to ads, plus an honest line for your own time at market rate if you manage ads yourself) divided by net new customers acquired in that period (gross new minus those who returned within 30 days). Real CAC for most small Shopify stores is 30-80% higher than the per-platform CAC numbers in Meta or Google because platform CAC excludes agency, creative, owner time, and returns. The customer acquisition cost calculator walks the full computation in one form. Use the true blended number in every downstream calculation — break-even ROAS, CLV:CAC ratio, and ad-budget decisions all depend on it.

Can attribution ever be accurate?

Not at the per-click level for small ecommerce — the data fragmentation across devices, the iOS 14 measurement loss, the platform incentive to claim credit, and the cross-platform overlap make truly accurate per-channel attribution impossible without six-figure incrementality testing budgets. What is achievable is honest aggregate measurement: blended ROAS computed against actual bank revenue, true CAC computed against net new customers, and periodic pause tests to validate that individual channels are genuinely incremental. The owners who accept that attribution is approximate and use blended numbers for decisions consistently outperform the owners who chase per-channel precision that does not exist. The bank statement remains the only number with 100% reliability — every other number is a model trying to approximate it.