BACK TO BLOG
USE CASESNovember 11, 20269 min read

Shopify With Causality Engine: Check Sales Attributed to Marketing

JH

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:

  1. 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.
  2. 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.
  3. 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

QuestionAnswerPage that states it
What Shopify isThe platform that holds the store, checkout and ordersShopify entry
What Shopify credits to marketingLast non-direct click by default; direct left out; five models to switch betweenMarketing performance
What makes a visit "marketing" to ShopifyA utm_campaign parameter in the landing URLSame page
What reaches GA4Events mapped from Shopify's standard events, purchase among them, through the Google & YouTube appGoogle's event reference
Which GA4 channel a visit lands inGoogle's rules on source and medium, not Shopify's channel namesDefault channel group
What Causality Engine readsThe Attribution paths CSV from GA4, 12 months or moreHow it works
Link between the twoNone. Its Shopify page lists no app to install and nothing to grantCausality Engine's Shopify page
Cost of the checkFirst 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:

SourceOrdersRevenue
Shopify, paid orders, Total sales1,312$96,480
Shopify, Sales attributed to marketing (last non-direct click)not shown here$61,900
GA4, purchase events1,187$78,050
Meta Ads Manager, claimed744$52,300
Google Ads, claimed633$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

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.

TAGS
Causality EngineShopifyEcommerce AttributionGA4Worked Example

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.

Agentic marketing, built for your team

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.