TL;DR
-
Attribution divides revenue you already made. Changing the model moves credit between channels and leaves your total alone.
-
Add up what every platform claims and compare it against Shopify revenue. The overlap is the size of the problem you are managing.
-
Your platforms disagree because their defaults disagree. Shopify reads last non-direct click over 30 days, Klaviyo credits an email that was only opened, and Meta changed its windows twice in 2026.
-
A four-week geo holdout shows whether a channel causes sales or only claims them. No dashboard can tell you that.
-
Fix UTMs and server-side events before you buy an attribution tool.
Your ad platforms will always claim more revenue than your store took. This article shows you how big that gap is, why it happens, which number to budget against, and how to test whether a channel earns what you spend on it.
Signs your eCommerce attribution is broken
|
What you are seeing |
What is usually behind it |
|
Platform revenue adds up to more than you sold |
Every platform counts the same order |
|
Email revenue looks better in Klaviyo than anywhere else |
Klaviyo credits an email that was only opened |
|
Paid social shows almost no sessions in Shopify |
utm_medium set to social instead of paid_social |
|
Branded search has your best ROAS |
It charges you for demand you already had |
|
Two people quote different ROAS for the same month |
Different models, different windows, neither written down |
|
Meta numbers moved and nothing in the account changed |
Meta changed its windows twice in 2026 |
What marketing attribution does
Attribution assigns credit for a sale to the marketing that came before it.
- It divides revenue you already made.
Switch from last click to a multi-touch model and email loses credit, paid social gains it, and your bank balance does not move.
- No model is correct.
Each one is a rule for splitting credit, and each platform's default favors its own channel. What you can decide is which rule you report on and what you check it against.
- Two numbers in your reporting are facts.
Total revenue, which Shopify counts from real orders, and total marketing spend, which you read off invoices. Every channel-level number between them is an estimate.
Why attribution got harder
Apple's App Tracking Transparency, introduced with iOS 14.5 in 2021, made cross-app tracking opt-in. Safari limits how long tracking cookies last, and ad blockers strip pixels outright. In the EEA and UK, Google's Consent Mode now decides whether ad data is collected at all.
Platforms now see only part of each journey and fill the gaps with its own modeling, independently of the others. That is why platform numbers became estimates, and why they no longer add up.

The four consent signals Google checks before it collects ad and analytics data. Two were added in v2.
How to reconcile platform claims against Shopify revenue
Open every platform, pull the revenue each one says it drove last month, and total it. On the Shopify side, use total sales, which includes tax and shipping, because that is closer to the order value most platforms record. Note that Meta Ads Manager and Google Ads report conversions against the date of the click or impression by default, not the order date, so a calendar month will never line up to the dollar.
The figures are an example sized to a mid-market Shopify brand. The store did $400,000 in revenue on $100,000 of marketing spend.
|
Platform |
Spend |
Revenue it claims |
Reported ROAS |
|
Meta Ads Manager |
$55,000 |
$210,000 |
3.82 |
|
Google Ads |
$30,000 |
$140,000 |
4.67 |
|
Klaviyo, email and SMS |
$2,000 |
$120,000 |
n/a |
|
TikTok Ads |
$8,000 |
$25,000 |
3.13 |
|
Affiliate platform |
$5,000 |
$18,000 |
3.60 |
|
Total claimed |
$100,000 |
$513,000 |
|
|
Shopify actually recorded |
$400,000 |
4.00 blended |
The platforms claim $513,000 against $400,000 of revenue. $113,000 of credit has been counted more than once, and the total comes to 128% of the money that came in.
Every platform is counting correctly by its own rules, but no platform can see the others. A customer who clicked a Meta ad on Tuesday, searched your brand name on Thursday and opened an email on Friday is recorded by three systems as three separate wins.

What five platforms claimed for the same month, against the revenue the store recorded.
Why Shopify and Meta report different revenue
Shopify splits the same $400,000 using last non-direct click, so its channel numbers add up to exactly what you sold. Comparing the two views tells you which platform is claiming the most credit it cannot support.
|
Channel |
Platform claims |
Shopify credits |
Gap |
Shopify as % of claim |
|
Meta / paid social |
$210,000 |
$92,000 |
$118,000 |
44% |
|
Google Ads / paid search |
$140,000 |
$78,000 |
$62,000 |
56% |
|
Klaviyo / email and SMS |
$120,000 |
$76,000 |
$44,000 |
63% |
Neither column is right on its own. Shopify understates upper-funnel work because it credits whatever touch came last. The platforms overstate because each one counts every sale that happened near its own ads.
The answer sits between them, and the size of the gap shows where your budget is most at risk. A channel claiming more than twice what Shopify credits is the first one to put in a test.
Until you have tested a channel, budget against the Shopify figure and treat the platform's claim as the upper limit. Once a holdout test is done, budget against the tested figure instead, as shown in the holdout section below.
Default attribution settings by platform
Most of the gap above comes from settings. Each tool ships with its own model and its own window, and they are rarely changed or written down.
|
Tool |
Default model |
Default window |
What it over-credits |
|
Shopify marketing reports |
Last non-direct click |
30 days |
Whatever touch came last, and Direct |
|
GA4 |
Data-driven |
Configurable per property |
Google properties |
|
Google Ads |
Data-driven |
Per conversion action |
Search and Shopping |
|
Meta Ads Manager |
Standard |
7-day click, 1-day engage-through, 1-day view |
Retargeting and anything with reach |
|
Klaviyo email |
Last touch |
5 days from a click or an open |
Flows near the end of the journey |
|
Klaviyo SMS |
Last touch |
5 days from a click, 12 hours from delivery |
Cart and browse recovery |
Klaviyo credits opens, not just clicks. The default window is five days for email clicks and five days for email opens, per Klaviyo's own documentation. Someone who opens your Tuesday campaign, ignores it, then buys on Thursday after a Google search hands that order to email. This is the main reason email revenue looks better in Klaviyo than anywhere else. You can shorten the window, or drop opens and bot clicks from attribution, in Klaviyo's attribution settings.

One order, two claims. The open on Tuesday is enough for Klaviyo to take the sale.
Meta changed twice in 2026. In January the 7-day view and 28-day view windows were removed, leaving one day as the longest view window available. In March, click-through was narrowed to count link clicks only, and the likes, shares, saves and comments that used to sit in the click bucket moved to a new category called engage-through, which carries a one-day window. If your year-over-year Meta numbers look strange, that is why. The settings sit at ad set level under Show more options.
Google kept two models. First click, linear, time decay and position-based are no longer supported in Google Ads, and conversion actions that used them were migrated to data-driven. You have data-driven and last click. Data-driven needs conversion volume to produce stable results, so on low-volume conversion actions treat its splits as rough.
Before you argue about models, write down the current setting for every tool you use.
The five Shopify attribution models
Shopify ships five attribution models in Campaigns, which is included in every Shopify plan.
Check which report you are reading before you compare numbers with anyone. Campaigns carries all five models. The channel performance report carries three, last non-direct click, last click and first click. Two people quoting different figures for the same month are often reading two different surfaces.
Take one buyer, the journey Shopify uses in its own documentation. They click a Google ad, come back a week later through a Facebook ad, then two days after that they type your URL and buy.
|
Model |
Who gets the credit |
Use it to |
|
Last non-direct click (default) |
Facebook, 100% |
Run your weekly reporting |
|
Last click |
Direct, 100% |
See what closed the sale |
|
First click |
Google, 100% |
Find which channel introduces buyers |
|
Linear |
Google, Facebook and Direct, a third each |
Read longer journeys |
|
Any click |
Google, Facebook and Direct, 100% each |
Reconcile against what platforms claim |
five attribution models in Shopify, each with a 30-day window.
Any click is the most useful model for this exercise. It hands full credit to every channel in the journey, so it allocates more credit than you have orders. Shopify says as much, and recommends it for reconciling with platform-reported numbers rather than for reporting.
That makes it a free version of the reconciliation above. Run your month on last non-direct click, run it again on any click, and the difference is how much channel overlap your journeys contain.
Most attribution guides also list time decay and position-based (U-shaped, usually 40% to the first touch, 40% to the last and 20% across the middle). Shopify does not offer either, and Google removed both, along with first click and linear, from GA4 and Google Ads in 2023. Today they live mainly in third-party attribution platforms, so if a vendor's dashboard shows them, that is the vendor's rule, not an industry standard.
One caveat on Shopify's own figures. Shopify notes that Facebook and Google campaigns do not show cost, ROAS, CPA or CTR on the Growth page, so Meta and Google spend goes in by hand when you calculate customer acquisition cost.
Cost, ROAS, CPA and CTR sit blank for Facebook, Instagram, Google and Klaviyo on the Growth page.
The three layers of marketing measurement
No single tool answers every marketing question. Each layer below answers a different one, on a different schedule.
|
Layer |
Question it answers |
Source |
Cadence |
|
Blended |
Is the business working? |
Shopify revenue and total spend |
Daily or weekly |
|
Channel |
Where should the next dollar go? |
Platforms, Shopify, surveys |
Weekly |
|
Causal |
Did this channel cause anything? |
Holdout tests, MMM |
Quarterly |
Layer one: blended reporting
-
MER. Total revenue divided by total marketing spend. The example store runs $400,000 over $100,000, so MER is 4.0.
-
New customer acquisition cost. Total acquisition spend divided by first-time customers. Spend divided by all orders is a softer number that hides how much you pay to reach someone new.
MER tells you whether marketing as a whole is paying for itself. Read it next to contribution margin after ad spend, because a rising MER on falling margins is not a win. It cannot tell you which channel to cut, so do not use a falling MER as a reason to cut a channel you have not tested. Work out your break-even ROAS so you have a target to compare against.
If MER is healthy and channel reporting looks grim, your tracking is probably broken. If MER is falling while every channel reports a strong ROAS, you have an overlap problem, and the reconciliation above will show you its size.
Layer two: channel attribution
This is where attribution models live, and where the overlap problem from earlier sits. Read three views of the same month rather than one.
-
Shopify, last non-direct click. Sums to real revenue. Biased toward the bottom of the funnel.
-
Platform-reported. Generous, each platform blind to the others, useful for in-account optimization.
-
Post-purchase survey. Self-reported, covers channels no pixel sees.
When all three agree a channel is working, act on it. When they disagree sharply, that channel goes to layer three before it gets more budget.
Layer three: incrementality
The first two layers describe what happened near your ads. Neither tells you what would have happened without them, which is what a budget decision needs.
Branded search is the clearest case. People who already decided to buy search your name, click the ad, and get counted as paid acquisition. The ad intercepted demand that already existed and charged you for it.
Only a holdout test and marketing mix modeling answer this. Both are below.
How to run a geo holdout test
Turn a channel off in part of the country, leave it on everywhere else, and compare. Whatever the paused region loses is what the channel was producing.
How to design the split
-
Pick the channel. Take whichever one claimed the most credit it could not support in your reconciliation table. For the example store that is Meta.
-
Split your geography. Google's Meridian GeoX documentation recommends at least ten geographic units, and more makes the result more reliable. States or DMAs both work. Hold out units making up 15% to 20% of revenue.
-
Measure a baseline. Eight weeks of weekly revenue for the holdout set and the control set, before you touch anything.
-
Run four weeks. Shorter than four weeks and normal week-to-week movement is larger than the effect you are measuring. Longer costs you more in lost sales.
-
Read it in Shopify, not in the ad platform. The ad platform cannot see the sales it did not cause.
Check three campaign settings before you start.
- If the campaign has a capped daily budget, duplicate it rather than restricting the geos on it.
Strip geos off a capped campaign and the algorithm spends the freed budget in your control regions instead, which inflates the control group and invalidates the result. Uncapped campaigns can be edited in place, which keeps the learning history intact.
-
Turn off any conversion lift or brand lift study running on those campaigns. Those studies create their own hidden holdouts inside your regions, which contaminates both groups at once.|
- Set location targeting to people in the region (presence), not people interested in it, so the ads actually stop in the paused regions.
How to calculate incremental ROAS
The control group handles seasonality for you. Whatever the control did, the holdout should have done, and the difference is the ads.
|
Holdout geos |
Control geos |
|
|
Baseline weekly revenue |
$18,000 |
$82,000 |
|
Test weekly revenue |
$15,900 |
$84,460 |
|
Change over baseline |
+3.0% |
|
|
Expected holdout revenue at +3.0% |
$18,540 |
|
|
Weekly revenue lost |
$2,640 |
|
|
Meta spend in those geos, weekly |
$2,400 |
|
|
Meta-reported ROAS there |
3.8 |
|
|
Revenue Meta claimed, weekly |
$9,120 |
|
|
Incremental ROAS |
1.10 |
|
|
Real as a share of claimed |
29% |

Weekly revenue in the control and holdout regions over twelve weeks, with the expected holdout line dashed through the four-week test.
What the result tells you
The ratio between measured and claimed is the number to keep. Apply it to the full channel and you get a defensible figure to budget against. In the example, Meta's $210,000 claim becomes roughly $61,000 of incremental revenue.
An incremental ROAS of 1.10 means each dollar returned $1.10 in revenue before cost of goods, which is below break-even for almost any margin. Compare your own result against your break-even ROAS before deciding whether to cut, cap or restructure the channel.
Do not treat 29% as a benchmark. We have seen this ratio range from under a third to close to one, depending on the channel and campaign mix. Only your own test gives you a usable number.
Pausing has a lag. Demand you built before the test keeps converting for a week or two, so the first week understates the effect. Weight the later weeks, and keep measuring both groups for one to two weeks after the test ends, so lagged conversions are counted in the result.
If you would rather not build the split yourself, Meta runs Conversion Lift studies and Google runs geo experiments, though each measures only its own platform. Meta's Incremental attribution setting, at ad set level, estimates which conversions an ad caused rather than counting everything in a window. Meta has an interest in the answer, so treat it as a second opinion, not a replacement for your own test.
When marketing mix modeling pays off
Marketing mix modeling does not track individual customers. It uses weekly totals, such as spend, revenue, seasonality, promotions and price changes, to estimate how much each channel contributed. Because it needs no cookies or pixels, privacy changes do not affect it. It also covers channels no pixel reaches, such as TV, podcasts and retail.
What MMM needs from your data
-
Two to three years of weekly history. Models fit parameters per channel, and a single year gives only about 52 weekly observations to fit them with.
-
Variation in spend. A channel held at $55,000 a month for two years gives the model nothing to work with, so flat channels cannot be measured this way.
-
Clean inputs. Weekly spend by channel, promotions, price changes, stockouts, anything that moved revenue for reasons other than marketing.
Google’s Meridian and Meta’s Robyn are free to license but need a data scientist for several weeks. Without holdout results to calibrate against, an MMM only shows correlations.
When to skip MMM
Under roughly $500,000 a month in paid spend, in-house MMM is usually the wrong investment. The modeling cost is real, the data is thin, and the same budget spent on fixing your tracking and running two holdout tests a year will tell you more.
The order that works is blended reporting first, then clean tracking, then holdout tests, then MMM.
What post-purchase surveys measure
MMM reaches channels no pixel sees, and it costs a quarter and a data scientist to get there. One question on the order confirmation page covers some of the same ground for nothing. Ask the customer how they heard about you, while the purchase is still fresh.
Response rates are the reason this works. Fairing reports an average around 50% across its customers, and other vendors quote 40% to 70% for a single-select question on the confirmation page. These are vendor figures without published methodology, so treat them as a rough guide.
What surveys catch that tracking cannot
-
Podcast, radio and creator mentions that never produced a click
-
Word of mouth, referrals, packaging inserts, events and retail
-
Anything a customer saw on a device they did not buy from
Word of mouth has no pixel and no UTM, so it shows up as Direct in every report, yet it is often one of the largest lines in survey data.
Where survey data misleads
-
People remember the last thing, or the famous thing. A customer who found you through a creator's video may answer Instagram, because that is where the video lived. Facebook and Instagram blur together, and so do TikTok and Reels.
-
Non-response is not random. Customers who answer are not a perfect cross-section of customers who buy.
-
It reads first touch. "How did you hear about us" asks about discovery, so it undercounts the retargeting and email that closed the sale.
How to use survey data
Use survey data to calibrate your other reporting. If 22% of respondents name a podcast you spend $4,000 a month on and your analytics credit it with nothing, the podcast is working and your tracking cannot see it.
Keep the option list short, eight to twelve items, and match it to the channels you actually fund. A list with fifteen options and an Other field produces responses no one can act on. The survey shares space with everything else on the Shopify thank you page, which is one more reason to keep it to a single question.
Why AI traffic is hiding in your Direct and Referral lines
AI assistants now send buyers to Shopify stores, and in most accounts those sessions are not labeled. Traffic from chatgpt.com, perplexity.ai and copilot.microsoft.com lands in GA4 without a channel grouping that recognizes it, so it falls into Direct or Referral.
AI visits are flat, but they convert far more often than they did a year ago. We looked at 96 million sessions and 977,000 orders across 73 stores on Shopify, Magento, BigCommerce and WooCommerce between September 2025 and September 2026. AI assistant visits barely moved, 896 a day in September 2025 against 917 a day a year later. Orders from those visits went from 5.9 a day to 16.1.

The rate went from 0.66% to 1.76%, which is about 2.7 times.
Orders per visit nearly tripled.
The fix is a GA4 channel group for AI assistants that sits above Referral, so GA4 checks it first. Until that exists, treat any growth in your Direct line with suspicion. Whether assistants recommend your store at all depends on how ready it is for AI search.
Which attribution setup fits your ad spend
You do not need all of this. Buy the setup your spend justifies, not the one ahead of it.
|
Monthly paid spend |
What you need |
What to skip |
|
Under $25,000 |
Clean UTMs, Shopify reports, MER and new-customer CAC in a sheet |
Attribution software, MMM |
|
$25,000 to $100,000 |
The above, plus server-side tracking and a post-purchase survey |
MMM |
|
$100,000 to $500,000 |
The above, plus an attribution platform and two holdout tests a year |
In-house MMM |
|
Over $500,000 |
The above, plus quarterly MMM calibrated against lift tests |
Nothing, run all three layers |
Spend on measurement in proportion to the decisions it changes. A tool that costs $2,000 a month has to improve allocation by more than $2,000 a month, and at $30,000 of spend it rarely does.
Types of attribution tools
Attribution platforms such as Triple Whale, Northbeam and Polar Analytics run a first-party pixel, pull in spend from every ad account and show modeled multi-touch results next to Shopify orders. Incrementality platforms such as Measured and Haus run lift and geo tests for you instead of splitting credit.
Data pipelines move spend and order data into your own warehouse so an analyst can build the model. Most brands in the $100,000 to $500,000 band need the first. The second makes sense once you want more tests than your team can design.
If you are at the stage where a platform makes sense, the install matters more than the choice between vendors. A tool without server-side sync and correct attribution windows reports wrong numbers, however good the dashboard looks. The same Triple Whale implementation checks apply to any vendor.
Fix your tracking before you change the attribution model
Most of the attribution problems we get called in for turn out to be tracking problems. Across the stores we audit, GA4 commonly misses 15 to 20% of purchases, which a 15-minute store audit will catch.
Run these four checks in order.
1. UTM hygiene. Untagged links land in Direct. Mistagged links land in the wrong channel. The common failure is utm_medium set to social instead of paid_social, which files every paid click as organic and makes paid look worse than it is. Standardize your UTMs before you trust any channel report.

A store running real Meta spend showing 8 Paid Social sessions against 1,275 Organic Social, the usual sign of utm_medium set to social.
2. Server-side events. Browser pixels drop events. Ad blockers, Safari, slow connections and people who close the tab all take conversions out of your reporting, and the ad platforms optimize on less data as a result. Shopify also switched its default for app pixel data sharing to Optimized in January 2026, which lets it throttle a pixel without telling you, so check Settings > Customer Events. Server-side tracking recovers a meaningful share of those events.
3. Event deduplication. Once browser and server both send, the same purchase can be counted twice. Matching event_id on both sides is what stops it. A store without it sees Event Match Quality climb toward 9 or 10 while reported conversions double. Check this the week you turn server-side on, not the month after. Duplicate GA4 properties cause the same problem in GA4.

Browser and server counts for the same Purchase event in Meta Events Manager, with the match quality score.
4. Reconcile order counts. Compare total Shopify orders against orders reported across every platform for the same window. More reported than received means double counting. Far fewer means a tracking hole. Meta's Event Match Quality score on the Purchase event is the fastest read on whether the hole is a matching problem, so check it against healthy match quality ranges.
Run those four before you spend a dollar on an attribution platform. If your reporting cannot produce new customers by channel at all, close that analytics and reporting gap first.
How to run a monthly attribution check
Run this on the same day each month so the trend means something.
-
[ ] Pull Shopify revenue and total marketing spend, calculate MER
-
[ ] Pull new customers from New customers over time, calculate new-customer CAC
-
[ ] Pull claimed revenue from every platform and total it
-
[ ] Divide claimed by actual, and compare the ratio against last month
-
[ ] Run the Shopify report on last non-direct click and again on any click
-
[ ] Check survey responses against where your spend sits
-
[ ] Confirm no attribution window or model changed in any tool
-
[ ] Note which channel has the widest gap between claimed and credited
The last line is your test queue. Whichever channel tops it two months running goes into a holdout, and each quarterly test updates the ratio you apply to that channel.
What to do this week
Add up what your platforms claim and divide it by your Shopify revenue. The number takes twenty minutes to produce, costs nothing, and tells you how much of your reporting is double-counted.
If you would rather have someone else do that work, talk to a strategist.