Klaviyo reports more email revenue than Shopify because the two tools answer different questions. Klaviyo asks “did this buyer engage with one of our messages before ordering?” Shopify asks “which visit placed the order?” An order can be a yes for Klaviyo and a paid-ad sale for Shopify at the same time. Neither number is wrong. Neither is a budget number either.
The gap gets louder the more channels you run. A store sending one newsletter a month with no ads sees the two numbers stay close. A store running Meta, Google and a daily email flow can see Klaviyo claim more than double what Shopify gives email, and still have Meta claim a chunk of the same orders.
What is Klaviyo actually counting as email revenue?
Klaviyo counts an order as email revenue when the buyer received a message and then opened or clicked it inside an attribution window set in your account, before ordering. It does not check what brought the buyer to the site. If they clicked a Meta ad an hour after opening your email, Klaviyo still credits the email.
That is a reasonable definition for an email tool. It answers “did people who engaged with this campaign go on to buy?” It is a correlation measure dressed up as revenue. The attribution window and whether opens count are both settings you can change, and most stores never look at them. Check yours before you argue about the number: open your Klaviyo account’s attribution settings and write down the window for email opens, email clicks and SMS.
Opens are the soft spot. Apple Mail Privacy Protection loads message content on the recipient’s behalf, which registers as an open whether or not a human ever read it. So an open-based window credits emails to people who never saw them. Bot and security-scanner clicks inside corporate inboxes do something similar for clicks. Excluding them is the fastest way to watch your “email revenue” shrink.
What is Shopify counting instead?
Shopify credits the session that placed the order, using what that session carried: UTM parameters, a click ID, or a referrer. If the buying session arrived from a Meta ad, Shopify gives the order to Meta. If it arrived with utm_source=klaviyo on the URL, Shopify gives it to email. If it arrived with nothing, it lands in Direct.
That makes Shopify stricter than Klaviyo, but not more complete. It only sees the last visit. An email that started the journey on Monday gets nothing if the buyer came back through a Google search on Thursday. And an email click with no UTMs often shows up as Direct, because native mail apps like Apple Mail and Outlook send no referrer; there is a full breakdown in attributing email campaign leads without UTMs.
So Shopify undercounts email as an opener and overcounts Direct, while Klaviyo overcounts email as a closer. The truth for most stores sits between them, and neither tool can tell you where.
Why is the same order counted by Klaviyo, Meta and Shopify?
Because every platform attributes inside its own walls and none of them subtracts what the others claim. Klaviyo sees engagement with its messages. Meta sees clicks and views of its ads, and by default credits purchases within a 7-day click or 1-day view window. Shopify sees the buying session. Add the three together and you get more attributed revenue than you actually took.
A worked example with round numbers. A buyer sees your Meta ad on Monday and clicks it. On Tuesday Apple Mail registers an “open” on your promo email. On Wednesday they search your brand on Google and buy for $100.
- Meta credits $100: a click inside its window.
- Klaviyo credits $100: an open inside its window.
- Shopify credits $100 to Google organic: the buying session came from search.
One order, $300 of claimed revenue, and the channel that genuinely started it gets credit only in its own dashboard. This is the same mechanism behind why Shopify attribution differs from your ad platform, with an email tool added as a third claimant.

Which number should you believe when paid ads are running too?
Believe neither for budget decisions. Use Klaviyo’s number to compare campaigns against each other inside Klaviyo, and use Shopify’s to see closing sessions. For the question “how much revenue does email really drive next to paid?” you need one ledger that credits each order once per model, from visits it can actually observe.
Three rules make that ledger honest:
- Credit visits, not opens. A click that lands on your site is evidence. An open that Apple’s servers generated is not. If every email link carries UTMs, an email click becomes a visit like any other.
- Count each order once per model. First touch gives one channel the order. Last touch gives one channel the order. The totals of each model must equal your real revenue, not a multiple of it.
- Show the models side by side. Where first touch and last touch disagree is exactly where email is doing work. Email that shows up big in last touch and small in first touch is closing buyers other channels found. That is valuable, but it is a different job from acquisition.
If you want to measure the contribution email makes without closing, that is assisted revenue, and it is a separate column precisely because it double-counts by design.
How do you check a single order by hand?
Pick five recent orders that Klaviyo credited to email and trace each one. It takes twenty minutes and settles most arguments.
- Find the order in Shopify. Note the date, time and what the order page reports for the customer’s session or referring source.
- Find the same customer in Klaviyo. Look at their activity feed: which message, whether the event was an open or a click, and how long before the order.
- Check your ad platforms. Filter Meta and Google conversions for that date and value.
- Write down the verdict. Open only, hours before a paid click? Email assisted at best. A UTM-tagged email click as the buying session? Email closed it. A click days earlier, then Direct? Email probably started it.
If most of your five are “open only,” your Klaviyo window is crediting inbox noise. Tighten it to clicks, or at least shorten the open window, and re-read the report. If most are real clicks followed by Direct purchases, Shopify is underselling email and your real problem is conversions landing in Direct.
What should you change in your setup today?
Four changes, all free, in order of impact.
Tag every email link. Add utm_source, utm_medium=email and utm_campaign to every link in every flow and campaign. Klaviyo can append UTMs automatically at the account level; turn it on and check that flows inherit it. This single change moves email clicks out of Direct and into a named channel in every other tool.
Separate opens from clicks in your head and in your settings. If you keep open-based attribution in Klaviyo, read it as a reach number, not revenue.
Stop summing platform reports. A slide that adds Klaviyo revenue to Meta ROAS revenue to Google conversion value is fiction. Put your real revenue total at the top and make every channel number reconcile to it.
Pick one model for budget and look at the other. Scale channels on the model that matches the decision: first touch for acquisition spend, last touch for retention and closing. The broader framework is in how to know which channel to scale.
How does PartialLeads give email and paid one ledger?
PartialLeads receives each paid Shopify order from the store’s order webhook, matches it to the visits that led to it, and writes a first-touch and a last-touch row for that order. Credit comes from visits the tag actually saw, so a UTM-tagged email click is a visit like a Meta click or a Google search, and all of them share one ledger. Each order is counted once per model.
The match is tiered: the visitor ID echoed from the storefront first, then email, then phone, then IP. Sessions are stitched into one person across visits and devices, so “clicked a Meta ad Monday, came back from an email Thursday, bought” reads as one journey, not three anonymous visitors. An email open that never produced a visit is not a touch. It cannot be, because nothing reached your site.
The Attribution report shows first touch, last touch and the PartialLeads resolved model side by side, each with its own purchase count and channel split. The channels table groups by source, medium or campaign, so email / klaviyo / spring-sale sits in the same table as meta / paid / prospecting, with revenue, purchases, average lag and ROAS per row. The Conversion Paths & Assists panel shows sequences like Meta Ads > Email and an assisting-channels table, labelled as full-credit so nobody mistakes it for a sum. Every figure here is itself an attribution model applied to observed visits, and the guide to reading an attribution report honestly applies to it too.
To check a single order, open the lead. The journey ribbon on the Leads list shows each touch left to right as a badge, with the conversion at the end, and the per-lead journey timeline shows timestamps and the source of each session.

Honest limits. PartialLeads does not read Klaviyo’s open data, so it cannot tell you an unclicked email influenced a sale; if that is the question, use a holdout test. An email click without UTMs can still land as Direct if nothing else ties the visit to the person. Only paid orders fire conversion events to ad platforms, and a refund nets against revenue in the Purchases ledger rather than disappearing. Matching is maximised, not guaranteed: an order that cannot be tied to any visit shows as unmatched instead of being guessed.
| What breaks | The mechanism | Where you see it in the dashboard |
|---|---|---|
| Klaviyo, Meta and Shopify each claim the same order | Each paid order is matched once and gets one first-touch and one last-touch row | Attribution report: model totals equal real revenue |
| Email opens credited as revenue | Credit comes from visits; an open that never reached the site is not a touch | Channels table grouped by source/medium |
| Email starts journeys but Shopify shows the closing visit only | First touch and last touch shown side by side | Attribution Models panel and First/Last toggle |
| Email clicks without UTMs land in Direct | Sessions stitched per person by visitor ID, email, phone and IP | Journey ribbon on the Leads list |
| Can’t tell what email did for one specific order | Per-person journey across visits and devices | Journey timeline on the lead |
Klaviyo’s number tells you whether your email program is engaging buyers. Shopify’s tells you where buyers were when they paid. The number you budget against has to come from one place that sees both, and counts each order once.
Tell us what's broken. We'll fix your tracking — free.
Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.
Sources
https://www.facebook.com/business/help/458681590974355
https://developers.facebook.com/docs/marketing-api/conversions-api