TL;DR
Five days, and an open counts. That single default explains most of the gap between Klaviyo's attributed revenue and everything else in your stack, because neither GA4 nor Shopify will ever credit an email that nobody clicked. Klaviyo also ships a linear model alongside the default last-touch one, and switching it changes the reported revenue with no change in orders at all [2]. So the reconciliation ends in a decision rule rather than a matching exercise: Shopify is the record of revenue that happened, GA4 answers which acquisition channel earned the session, and only Klaviyo's number should be used to judge a flow.
Key Takeaways
- Klaviyo's documented default for new accounts is a last-touch model with a 5-day lookback for email clicks and opens, 5 days for SMS clicks with 1 day for SMS opens and 12 hours for deliveries, and 24 hours for push opens [1].
- Klaviyo calls it a "cooperative, multi-channel model" giving each Klaviyo-owned channel its own configurable window plus a single configurable window for non-Klaviyo channels [1]. Windows are editable under Account → Settings → Attribution.
- Klaviyo's linear model splits credit across touchpoints. Their own worked example sends a $100 conversion entirely to SMS under last touch and about $33 to each of three touchpoints under linear [2].
- Shopify's marketing reports identify channels through UTM parameters and integrated marketing apps, offer five models, and default to last non-direct click on a 30-day window [3].
- WeltPixel Conversion Tracking sends Klaviyo seven metrics, six of them originating in the browser plus Placed Order from the order webhook, all delivered server-side, and zero attribution fields of any kind.
- Placed Order's
$valueis the Shopify order total including tax and shipping, and itsTransactionIdcarries the#1001-style order name, which is your join key against a Shopify export. - Summing Klaviyo attributed revenue with paid-channel attributed revenue double-counts by construction, because two systems can both claim the same order under their own rules.
Klaviyo can credit an email nobody clicked
That is the whole discrepancy in one sentence, and it is worth putting the numbers next to it.
Klaviyo's documentation states that by default it uses "a last touch attribution model with the following lookback window for all new accounts" [1]:
| Channel | Clicks | Opens | Deliveries |
|---|---|---|---|
| 5 days | 5 days | not used | |
| SMS | 5 days | 1 day | 12 hours |
| Push | not used | 24 hours | not used |
| 5 days | 12 hours | not used |
Klaviyo describes the whole arrangement as a "cooperative, multi-channel model" in which each Klaviyo-owned channel gets "their own distinct configurable window" and non-Klaviyo channels share a single configurable one [1].
Read the email row again. An open, up to five days before the order, is enough to credit the campaign. Your customer can open the newsletter on Monday, come back through a Google search on Friday, and Klaviyo will still count that order as email revenue while GA4 files it under organic search. Neither system is broken. They were asked different questions.
What question is each system answering?
Three systems, three definitions. Line them up before you compare a single number.
| System | Credits on | Default model | Window |
|---|---|---|---|
| Klaviyo | Clicks and opens [1] | Cooperative last touch [1][2] | 5 days for email, per channel, configurable [1] |
| GA4 | A tagged click | Whatever the property is set to | Property lookback setting |
| Shopify | Clicks only [3] | Last non-direct click [3] | 30 days [3] |
Shopify's marketing performance reporting offers five models, last non-direct click as the default plus last click, first click, any click and linear, identifies channels through UTM parameters and integrated marketing apps, and covers data from October 1, 2021 onward [3]. The report's own mechanics are covered in how Shopify's Channel Performance report attributes orders. GA4's side of the same table is its own subject, and GA4 attribution models on Shopify sets out how data-driven and last-click differ there. For Shopify's own logic, how Shopify attribution works covers first click, last click and direct orders.
Once the table is in front of you, the arithmetic question dissolves. Nobody is off by a percentage that can be reconciled, because the three systems are counting different populations of orders.
The model switch that changes the number without changing the orders
Here is the demonstration Klaviyo publishes itself, and it is the fastest way to end an argument about whose number is right.
Klaviyo documents two model types. The default is described as "a co-operative last touch attribution model", and the linear option "equally gives credit to each touchpoint" [2]. Changing the model type is not something every account can do: Klaviyo states that Advanced KDP and Marketing Analytics are not included in its standard marketing application and require a subscription, and that customers on those products can update their attribution model type [2]. Windows, by contrast, are editable on any account. Their worked example takes a $100 conversion with three touchpoints: under last touch the full $100 goes to the last one, SMS, and under linear each touchpoint takes roughly $33 [2].
Same orders. Same revenue in Shopify. A reported email number that moves by tens of percent depending on a dropdown. If you have ever watched an email channel's revenue jump on a Monday with no campaign change, and your account carries the Advanced KDP or Marketing Analytics subscription, check whether someone changed the model type before you look for a tracking fault. On an account without it, the model type is not the variable and the windows are.
That is also why a reconciliation target is the wrong goal. You cannot tune three systems into agreement when one of them can restate its own history from a settings page.
Does the tracking app compute any of Klaviyo's numbers?
No, and knowing that saves you from debugging the wrong layer.
WeltPixel Conversion Tracking sends Klaviyo seven metrics. Six of them originate in the browser as the shopper moves through the store, Viewed Page, Viewed Product, Viewed Category, Product Searched, Added to Cart and Checkout Started, and the seventh, Placed Order, comes from the Shopify order webhook. All seven are delivered server-side to Klaviyo's Events API, so the browser is the source of the six rather than the transport. Klaviyo integration requires the app's Plus plan for new installs, which is our Plus plan and not Shopify Plus.
What the app does not send is any attribution field. No campaign ID, no flow ID, no UTM claim, no revenue split. Klaviyo's attributed revenue is Klaviyo's own model applied to events we deliver, and the mechanics of that delivery are covered in Klaviyo server-side tracking on Shopify.
Two more details make Placed Order easier to reconcile. Its $value is the Shopify order total with tax and shipping included, in the order's own currency, so it should tie to the order total in your Shopify export rather than to a subtotal. And it carries TransactionId as the order name, the #1001 form, alongside item names, item count, discount codes and total discounts.
Two reconciliation mechanics that actually help
Skip the percentage hunt and do these two things instead.
First, the day boundary. The Placed Order event is timestamped at the moment the app sends it, which is within moments of the order arriving on Shopify's order-created webhook. For an order placed at 23:59 in your store's timezone, that is still enough for the event to land on the following calendar day in Klaviyo while Shopify reports it on the previous one. If your Klaviyo and Shopify daily totals are close but never identical, check the first and last hour of the day before checking anything else.
Second, the join key. Export orders from Shopify with the order name and total, pull the Klaviyo Placed Order export with TransactionId, and join on those. That gives you an order-level comparison instead of a report-level one, and it separates the two questions that usually get tangled together: whether Klaviyo received every order, and whether Klaviyo credited them to the channels you expected. The first is a delivery question. The second is a model question, and no export will resolve it.
There is one thing worth knowing about metric names before you build that export. Klaviyo's own Shopify integration also writes Placed Order, alongside Fulfilled Order, Fulfilled Partial Order, Refunded Order and Cancelled Order [4]. If both sources are connected, know which Placed Order your report is counting. The wider diagnosis of duplicate metrics is a separate job and a separate article.
Which number should decide what?
Assign each system one job and stop asking it to do the other two.
Shopify is the system of record for revenue that happened. It owns the finance number, and no marketing report overrides it. GA4 answers which acquisition channel earned the session, which makes it the tool for paid and organic comparisons, and it will always underreport email against Klaviyo because it needs a tagged click. Why Shopify Analytics and GA4 revenue never match covers the two-system version of the same problem, and attribution windows and reporting delays on Shopify covers the timing half.
Klaviyo answers whether the message moved the customer. That question is only measurable against message engagement, which is why Klaviyo's number is the one that should judge a flow or a campaign, and why nobody else's number can. Use it to compare campaign A to campaign B and flow revenue month over month.
The corollary is the part that gets skipped in board decks. Adding Klaviyo attributed revenue to Meta attributed revenue to Google Ads attributed revenue produces a total larger than your Shopify revenue, every time, because each platform claims the orders its own rules let it claim. When email loses its UTMs on the way in, GA4 files those orders elsewhere entirely, which GA4 (not set) and unattributed Shopify orders covers in detail. Report the platform numbers side by side, label the model and window on each, and keep Shopify's total as the denominator.
If you want the event layer under all of this to be delivered from your order record rather than from a browser tag, WeltPixel Conversion Tracking [5] sends Klaviyo the browse and order metrics server-side, with the Shopify order total and order name on Placed Order so the join key is already there.
FAQ
Why is Klaviyo's revenue higher than GA4's email revenue?
Because Klaviyo credits opens as well as clicks, with a 5-day default window for both on email [1], and GA4 needs a tagged click. Orders from shoppers who opened but arrived by another route count for Klaviyo and not for GA4.
Should Klaviyo attributed revenue match Shopify's total sales?
No. Shopify's total is every order. Klaviyo's number is the subset its model credits to a message, on a configurable per-channel window [1], so it is a portion of Shopify's total by design.
Can I change Klaviyo's attribution window?
Yes, under Account → Settings → Attribution, where each Klaviyo channel has its own window and non-Klaviyo channels share one [1]. Changing it restates historical reports, so record the date you changed it.
Does the tracking app decide what Klaviyo attributes?
No. The app sends metrics with no attribution fields, so all credit assignment happens inside Klaviyo using its own model and windows.
Why are my Klaviyo and Shopify daily revenue totals slightly different?
Check the day boundary first. Placed Order is stamped when the event is sent, so late-evening orders can land on the next calendar day in Klaviyo while Shopify reports them on the day of purchase.
Sources
- Klaviyo Help Center, "Understanding Klaviyo message attribution" (default last touch model with 5-day email click and open windows; SMS 5 days clicks, 1 day opens, 12 hours deliveries; push 24 hours opens; WhatsApp 5 days clicks, 12 hours opens; cooperative multi-channel model with per-channel configurable windows; windows editable in Account Settings), help.klaviyo.com, accessed September 10, 2026
- Klaviyo Help Center, "Understanding attribution model types" (co-operative last touch as default; linear "equally gives credit to each touchpoint"; Advanced KDP and Marketing Analytics not included in the standard marketing application and a subscription required to update the attribution model type; worked example of a $100 conversion assigned fully to SMS under last touch versus roughly $33 per touchpoint under linear), help.klaviyo.com, accessed September 10, 2026
- Shopify Help Center, marketing performance and attribution (five models with last non-direct click as default, 30-day window, channels identified through UTM parameters and integrated marketing apps, data from October 1, 2021 onward), help.shopify.com, accessed September 7, 2026
- Klaviyo Help Center, Shopify data reference (Placed Order, Fulfilled Order, Fulfilled Partial Order, Refunded Order, Cancelled Order; Placed Order events synced alongside Ordered Product events), help.klaviyo.com, accessed September 10, 2026
- WeltPixel Conversion Tracking, Shopify App Store listing, apps.shopify.com/weltpixel-conversion-tracking, accessed September 10, 2026