Shopify With Causality Engine: Check Sales Attributed to Marketing
By Joris van Huët
Enterprise Interim CMO & Marketing Leader · 15+ years · 50+ orgs
Published
2026-11-11
The short answer: if the Growth page in your Shopify admin says one revenue figure, GA4 says a smaller one and the ad accounts together say a larger one, all three can be correct at once, because each is built on a different definition. Shopify, the commerce platform that runs the store and the checkout (entry), credits "Sales attributed to marketing" by the last non-direct click and leaves direct visits out, per its marketing performance help page. The orders are Shopify's to count; which channel caused them is a separate question. Causality Engine, a causal attribution tool that reads one GA4 export, answers that second question, and its first finding is free on the start page.
Disclosure: I founded Causality Engine and own it, and this page recommends it. Every claim about it links to Causality Engine's own pages.
Three sums to do before anyone quotes a number:
- Strip one order down to what GA4 receives. For example, a basket of $84.00 with an $8.40 discount, $4.95 shipping and $15.88 tax. Shopify's Total sales counts net sales plus taxes, shipping, duties and fees (help page): 84.00 - 8.40 + 4.95 + 15.88 = $96.43. The purchase event the Google & YouTube app sends uses subtotal minus discounts, without shipping and tax (Google's Shopify event reference): 84.00 - 8.40 = $75.60. Same order, $20.83 apart.
- Use the connection you already have. If GA4 went on through the Google & YouTube sales channel, the setup article says certain ecommerce events are tracked automatically, so the purchase event a read needs is probably already flowing.
- Count orders, not revenue, when you compare. Shopify's sales reports include pending, unpaid and canceled orders (sales reports article). Compare GA4 purchases with paid Shopify orders for the same dates.
Shopify's attribution and the read, fact by fact
| Question | Answer | Page that states it |
|---|---|---|
| What Shopify is | The platform that holds the store, checkout and orders | Shopify entry |
| What Shopify credits to marketing | Last non-direct click by default; direct left out; five models to switch between | Marketing performance |
| What makes a visit "marketing" to Shopify | A utm_campaign parameter in the landing URL | Same page |
| What reaches GA4 | Events mapped from Shopify's standard events, purchase among them, through the Google & YouTube app | Google's event reference |
| Which GA4 channel a visit lands in | Google's rules on source and medium, not Shopify's channel names | Default channel group |
| What Causality Engine reads | The Attribution paths CSV from GA4, 12 months or more | How it works |
| Link between the two | None. Its Shopify page lists no app to install and nothing to grant | Causality Engine's Shopify page |
| Cost of the check | First finding free; €99 for a full read, excluding VAT (checked on 11 November 2026) | Pricing |
How Shopify decides which channel sold the order
The Performance section of the Growth page shows Sales attributed to marketing next to total store sales from every sales channel. The help page is precise about the rule behind it:
- Default model: last non-direct click. All credit goes to the last channel before the purchase, skipping direct visits; a journey that is direct from end to end is filed as direct.
- Other models: last click, first click, any click and linear, chosen on the Attribution page. Shopify warns that any click hands out more credit than the orders you received, and suggests it for one channel at a time.
- Path to purchase: touchpoints from up to 30 days before an order, or back to the customer's previous order if that was more recent.
- History: attribution data from 1 October 2021; cross-device journeys in all storefront data from 1 March 2023.
Shopify is open about why its figure will not match Meta or Google: each platform credits sales by its own rules. Fair. The models move credit by a rule you pick; none asks what would have sold anyway.
What the Google & YouTube app gives GA4
Shopify's GA4 setup article sends you to the Google & YouTube sales channel, and warns that nothing is tracked while the store is in private mode. Google's event reference lists what the app sends, from page_view and add_to_cart to purchase. Four details there decide whether the two can be compared:
- purchase fires on checkout_completed, with a transaction_id, so each order should appear once.
- value is subtotal minus discounts since 24 April 2025; tax and shipping travel as separate parameters.
- currency defaults to USD when the event carries none. A euro store should check the currency column in GA4 before trusting a revenue total.
- Disconnecting the integration stops purchase events too. Filtering with the shopify_event_name parameter is the narrower tool.
The channel is another matter. Shopify calls a visit marketing once it carries a utm_campaign; GA4 sorts by source and medium. Google's channel rules put a visit in Paid Social only when the source is a social site and the medium matches a paid pattern such as cpc, and a tag that fits no rule ends as Unassigned. Fix the tag, not the report.
A worked example: a month in three ledgers
For example, with figures invented for this page and no store behind them, take October:
| Source | Orders | Revenue |
|---|---|---|
| Shopify, paid orders, Total sales | 1,312 | $96,480 |
| Shopify, Sales attributed to marketing (last non-direct click) | not shown here | $61,900 |
| GA4, purchase events | 1,187 | $78,050 |
| Meta Ads Manager, claimed | 744 | $52,300 |
| Google Ads, claimed | 633 | $44,700 |
The ad accounts claim 744 + 633 = 1,377 orders, which is 1,377 - 1,312 = 65 more than the store sold, before email or search speak. Shopify keeps 96,480 - 61,900 = $34,580 outside marketing, the direct share its default rule sets aside. And GA4 saw 1,187 of 1,312 orders, 1,187 / 1,312 = 90.5%. The other 125 never reached the export. And the revenue lines cannot be subtracted at all: Shopify's includes tax and shipping, GA4's does not.
A causal read works on those 1,187 GA4 purchases. Its how-it-works page says it splits Direct back to the channels that sent those buyers, rebuilds last-click from the same file, and sets each channel's caused share beside it, with a data-health score from 0 to 100 and a next step: raise, cut or hold, tested in one region first. If that read gives Meta far less than Ads Manager does, the answer is a regional test before a budget cut, not a cut.
The free check: one region, Shopify's own report
Shopify holds the measuring stick. Its Total sales by billing location report groups sales by the country or region of the billing address (sales reports article). Pick one region you sell into, pause or halve one channel's spend there for three weeks, and leave everything else alone.
For example, a region that sold 214 paid orders in the three weeks before and 191 during, while the rest of the store moved from 2,960 to 2,930: the region fell 214 - 191 = 23 orders, or 10.7%, against 1.0% elsewhere. Roughly 23 - (214 x 0.01) = 21 orders went with the paused spend. By hand, free, and enough on its own.
Where the pairing stops
Causality Engine needs what GA4 holds: a purchase key event, 12 months or more of history (how it works), and paths that carry their source. It reads under the same consent and browser limits as GA4, so those 125 orders stay invisible to it as well. It reads channels, not campaigns, discount codes or POS sales. A channel under 1% of credit on both methods is called too small to act on, and an export too thin is declined, as the one-off read page puts it: no causal method recovers data that was never collected.
Shopify does what the read never will: it keeps the ledger. The Growth page sets marketing's share against total store sales from all sales channels (help page), and that total is the one every other figure on this page is checked against.
The default deserves one plain look. Sales attributed to marketing sits on the Growth page, where Shopify also sells its own marketing tools; Messaging, for one, bills sends past 10,000 a month (email pricing). A last-touch rule that sets direct aside and credits the touch before it makes the marketing column fuller than a test would, on the screen where the next marketing purchase is made.
The read, after the free test
When the question widens to every channel at once, export the Attribution paths report from GA4 and drop it on the start page. The first finding is worked out in your browser at no charge. Causality Engine, which I founded, then sells the full read of that file for €99 once, excluding VAT, refundable within 30 days (pricing, checked on 11 November 2026).
See also
- Shopify: plans, card rates and the third-party fee
- How to use Shopify: abandoned checkout recovery in Shopify Messaging
- Shopify on the marketplace: Shopify's affiliate program terms
- Causality Engine: what the read is, costs and declines
- How to use Causality Engine: from GA4 export to a regional test
- Causality Engine on the marketplace: its affiliate terms, stated as the owner's
- Causality Engine vs Shopify attribution: Shopify's five rules against one read
- Reconcile Meta, Google and Shopify revenue: three ledgers brought to one total
FAQ
Does Causality Engine plug into the Shopify admin?
No. Causality Engine's Shopify page describes one file, the GA4 Attribution paths export, as the whole input: no app, no admin permission, no sync.
Why is GA4 revenue lower than Shopify's for the same orders?
Mostly by definition: Google's event reference sets purchase value to subtotal minus discounts, while Shopify's Total sales adds tax, shipping, duties and fees. Purchases GA4 never saw widen it.
Which Shopify model should sit beside the read?
Last non-direct click, the default, because it is the figure people already quote. The read rebuilds plain last-click from GA4 itself, so the gap worth reading is between Shopify's default and each channel's caused share.
ABOUT THE AUTHOR
I am Joris van Huët, an enterprise interim CMO. 15+ years, 50+ organizations, including ING, P&G, Nestlé, BNP Paribas, WeTransfer and Vinted. I take on innovation projects (venture building, design sprints), agentic marketing (setting up and running AI agents) and hands-on multi-channel work. See the track record.
I wrote and published this with AI assistance, and I answer for it. Claims about my own experience are limited to the track record above, and a statistic links to its source or is labelled as an example. I sell interim and fractional CMO work, which is why this site exists. How this site is written.
The agents in this article, built into your workflows and handed over to your team: the first one within two weeks.
With Joris van Huët, interim and fractional CMO in Utrecht. From EUR 5,000 a month, monthly cycles, a 30-day exit.