
- Klaviyo credits a sale to the last email or SMS a customer opened or clicked inside the attribution window. It does not ask whether the email caused the sale.
- Apple Mail Privacy Protection opens count by default, so a customer who never read your email can still be "attributed" to it.
- The same order is often claimed by Klaviyo, Meta and Google at once. Add them up and they can exceed what Shopify actually took.
- The only reliable answer comes from a holdout: people who get no marketing email, compared with people who do. Any list above roughly 20,000 active profiles can run a basic version.
- In holdout tests, flows (abandoned checkout, browse abandonment, winback) usually hold up well. Frequent discount campaigns to your most engaged buyers usually hold up the least.
In this article
The retention agency's monthly report opens with a big number: email and SMS drove 38% of revenue. The proposal on the next slide follows naturally. If campaigns work this well, send more of them: six a week instead of four, plus a sitewide code to the engaged segment every other Friday. The founder is about to sign off.
Then someone asks a simple question: what happens to revenue if we stop sending campaigns for six weeks to a random tenth of the list? The answer, when they finally run the test, is that the business would lose about 8% of revenue, not 38%. Most of the rest was customers who were going to buy anyway, often from a phone that "opened" the email on its own. Email was still valuable. It was just a fifth as valuable as the dashboard claimed, and the plan to send more was about to make it worse.
Every founder has seen the Klaviyo dashboard number. Email and SMS drove 28%, 35%, sometimes 40% of revenue last month. It is the most comforting number in the business, because it seems to prove the channel you pay the least for is doing the most work.
The better question is not "how much revenue did email touch?" It is "how much revenue would we lose if we stopped sending tomorrow?" Those two numbers are rarely the same, and the gap between them decides how many campaigns you send, how much discount you give away, and whether your retention hire is worth what you pay.
How Klaviyo decides a sale belongs to email
Klaviyo uses a last touch model with a time window. If a person opened or clicked a message and then placed an order inside the window, the order is credited to the most recent message they engaged with. For accounts created after October 9, 2024, the default window is 5 days for email and SMS and 24 hours for push. Older accounts may still be on different defaults, and every account can change them.
Three details in that rule matter far more than most teams realise.
- Opens count, not just clicks. A customer does not need to click anything. Opening the email and buying through any other route within the window is enough.
- Machine opens count by default. Apple Mail Privacy Protection preloads emails on Apple devices, which registers as an open whether or not a person read it. Klaviyo counts these opens toward conversions unless you switch that off.
- The order can come from anywhere. Klaviyo does not check whether the buyer arrived from a Google ad, a Meta ad or by typing your URL. If the open happened inside the window, email gets the credit.
So a customer on an iPhone who receives your Monday newsletter, never reads it, sees a Meta ad on Wednesday and buys, is counted as an email conversion. Meta counts the same order as a Meta conversion. Google may count it too if they searched your brand name before buying.
| Source | How it inflates email revenue | How to check it |
|---|---|---|
| Apple MPP opens | Auto-opens make every Apple Mail subscriber look engaged, so their purchases fall inside the window | Turn off MPP opens in attribution settings and compare last quarter |
| Open-based credit | Orders placed with no click still count | Compare click-only attributed revenue with open-plus-click |
| Long window | 5 days catches most weekly buyers of consumables | Rerun with a 1-day click window and see what remains |
| Multi-touch overlap | Meta, Google and Klaviyo all claim the same order | Add platform-claimed revenue and compare with Shopify net sales |
| Recurring subscription orders | Auto-ship orders placed after an email open are credited to email | Split attributed orders by order source or subscription tag |
| Discount campaigns | Buyers who would have paid full price use the code | Compare full price repeat rate before and after heavy promo months |
Settings names differ slightly between accounts. The checks work with any attribution setup.
The four kinds of revenue hiding inside the email number
When you break email-attributed revenue down, it almost always falls into four buckets. Only one of them is fully incremental.
| Bucket | What it is | Incremental? |
|---|---|---|
| Would have bought anyway | Replenishment buyers, subscribers, loyal customers who were already coming back | No |
| Pulled forward | The email moved a purchase from next week to today | Mostly no. It changes timing, not total |
| Bought with a discount they did not need | Full price buyers who used the code because it was there | Negative. You gave away margin |
| Genuinely created | Abandoned carts recovered, lapsed customers won back, first purchases from warm subscribers | Yes |
The pull-forward bucket is the one founders miss most. Look at daily revenue around a big campaign send. If the campaign day spikes and the following four to six days sit below your normal run rate, a large part of the spike was timing. Total revenue for the fortnight barely moved.
Daily Shopify revenue around a campaign send, indexed to a normal day = 100 (illustrative)
Klaviyo credits the spike. The dip that follows is invisible in attribution but shows up in total revenue.
| Label | Daily revenue index |
|---|---|
| Day -3 | 100 |
| Day -2 | 98 |
| Day -1 | 101 |
| Send day | 185 |
| Day +1 | 120 |
| Day +2 | 85 |
| Day +3 | 80 |
| Day +4 | 84 |
| Day +5 | 90 |
| Day +6 | 96 |
Flows and campaigns behave very differently
Flows are triggered by what a customer just did: abandoned a checkout, browsed a product, went quiet for 90 days. Campaigns are sent because it is Tuesday. That difference shows up clearly when you test them.
- Abandoned checkout and browse abandonment usually hold up best in holdout tests. The customer showed intent and the message reaches them while it is still warm.
- Welcome series often lift first purchase meaningfully, but check what the welcome discount costs on customers who would have bought at full price. We covered that in Is your welcome discount building customers or bargain hunters?
- Winback flows to genuinely lapsed customers are often incremental, because nothing else was going to bring those people back.
- Post-purchase flows tend to look strong in attribution and weaker in holdouts, because they go to people who just bought and many were going to buy again anyway.
- Campaigns to your engaged segment are where the gap is widest. These people open everything and buy often. Klaviyo credits their purchases to whatever they opened last.
How to run a holdout on any list size
Klaviyo offers global holdout groups, which remove a share of your audience from all marketing messages and report the lift. Klaviyo recommends holding out around 5% and running for about three months, and the feature needs an account with at least 400,000 profiles. Most brands under $10 million in revenue will not qualify. You do not need the feature to run the test.
The simple version (lists above roughly 20,000 active profiles)
- Create a random 10% segment of your engaged, marketable profiles. The simplest way is to export them, give each profile a random number from 1 to 10 in a spreadsheet, re-import that as a custom property, and build a segment for everyone with the value 10.
- Exclude that segment from every campaign for six to eight weeks. Keep transactional messages (order confirmations, shipping updates) running for everyone.
- Leave flows running for both groups at first. You are testing campaigns.
- At the end, pull Shopify orders for both groups, not Klaviyo-attributed revenue. Use revenue per person across all channels.
- The difference in revenue per person, multiplied by the size of the mailed group, is your incremental campaign revenue.
Testing a flow
Inside a flow, add a conditional split on the same random property so that, for example, values 1 to 5 go down the normal path and values 6 to 10 exit without a message. Run it until each side has at least a few hundred triggered customers. Compare the conversion rate across all channels over the following 14 to 30 days.
| Metric | Mailed group | Holdout group |
|---|---|---|
| Engaged profiles | 54,000 | 6,000 |
| Shopify revenue in 8 weeks (all channels) | $518,400 | $54,000 |
| Revenue per person | $9.60 | $9.00 |
| Klaviyo-attributed campaign revenue | $142,000 | Not mailed |
Illustrative numbers. Incremental revenue = ($9.60 minus $9.00) x 54,000 = $32,400, about 23% of the $142,000 Klaviyo attributed to campaigns.
Shopify revenue per person over 8 weeks, all channels (worked example)
$0.60 x 54,000 mailed profiles = $32,400 incremental, against $142,000 attributed by Klaviyo.
| Label | Revenue per person |
|---|---|
| Holdout (no campaigns) | $9 |
| Mailed group | $9.6 |
In this example email campaigns are worth something real, about $32,400 over eight weeks. They are worth roughly a quarter of what the dashboard said. That changes how many campaigns you send, how much you pay an agency on a percentage of attributed revenue, and how you value your email list in a fundraise.
Illustrative cases
38% of revenue from email, until the MPP opens came out
- What the dashboard said
- Klaviyo attributed 38% of revenue to email and SMS. The agency proposed going from four campaigns a week to six.
- What was actually happening
- After switching off MPP opens and moving to a 2-day click window for internal reporting, attributed revenue fell to 17%. A six-week campaign holdout showed the incremental share was closer to 8% of revenue. Most campaign revenue came from a loyal group of about 4,000 customers who bought every five to six weeks regardless of what was sent.Abandoned checkout, browse abandonment and winback flows held up strongly in a split test. The daily campaigns did not.
- Decision
- Fix Cut campaigns to two a week, stop sitewide codes to the engaged segment, and move effort into flows and a replenishment reminder timed to the real reorder window.
Revenue did not fall when campaign volume came down. Unsubscribes dropped and gross margin improved because fewer loyal customers were being handed codes.
The email team was being credited for auto-ship
- What the dashboard said
- Email looked like the best channel in the business, credited with 41% of revenue.
- What was actually happening
- When attributed orders were split by source, 62% of email-attributed revenue was recurring subscription orders. Those shipments were scheduled weeks earlier and would have gone out whether or not an email was sent.Excluding recurring orders, email drove about 15% of one-time and first subscription revenue, which is still healthy.
- Decision
- Test Report email on non-recurring orders only, and test a pre-renewal reminder flow against a no-message group to see if reminders reduce skips and cancels.
A channel can be valuable and still be overstated. Knowing the real number let the founder pay the retention lead on the right metric.
Email and SMS share of revenue in the skincare case above, by method
Illustrative composite. Only the holdout measures what email actually caused.
| Label | Share of revenue |
|---|---|
| Klaviyo default (opens incl. MPP, 5-day window) | 38% |
| Click-only, 2-day window | 17% |
| Six-week campaign holdout | 8% |
What to change in your reporting
You do not need to stop using Klaviyo's numbers. You need to stop using them to make budget decisions. A practical setup:
| Number | Where it comes from | Use it for |
|---|---|---|
| Attributed revenue (Klaviyo default) | Klaviyo | Comparing one message with another inside email |
| Click-only, 1 to 2 day attributed revenue | Klaviyo with adjusted settings | A tighter internal view that removes most MPP noise |
| Incremental revenue per person | Your holdout, measured in Shopify | Deciding send frequency, discount policy and email budget |
| Email share of net revenue (incremental) | Holdout result divided by Shopify net sales | Board and investor reporting, agency fees |
What to do this week
- Check your attribution window and whether Apple MPP opens and bot clicks are included. Write down the current settings before changing anything.
- Rerun last quarter's email revenue with click-only, 2-day attribution for your own reference.
- Add up the revenue Klaviyo, Meta and Google each claimed last month. Compare it with Shopify net sales.
- Split email-attributed orders into first orders, repeat orders and recurring subscription orders.
- Set up a 10% random campaign holdout and let it run for six to eight weeks.
- Decide in advance what result would make you cut, keep or increase campaign frequency.
Email is usually one of the most profitable channels a DTC brand has. The point of measuring it properly is not to cut it. It is to stop paying for the part of the number that was never email's to begin with, and to put the effort where messages actually change what customers do.
Questions founders ask
Is Klaviyo attribution accurate?
It is accurate about what it measures: which message a buyer last opened or clicked inside a time window. It is not a measure of causation. Opens from Apple Mail Privacy Protection, long windows and overlap with paid channels mean attributed revenue is usually well above the revenue email actually created.
What is a good percentage of revenue from email for a DTC brand?
Attributed benchmarks of 25% to 40% are common, but they are not comparable between brands because settings differ. A more useful benchmark is your own incremental share from a holdout. For many brands that lands somewhere between a third and a half of the attributed figure, with flows holding up better than campaigns.
Should I turn off Apple Mail Privacy Protection opens in Klaviyo?
For decision-making, yes. MPP opens are generated by Apple's servers, not by people reading your email. Keep a note of the date you changed it, because your historical attributed revenue will look higher than your new numbers.
How big does my list need to be for a holdout test?
A basic campaign holdout works once you have roughly 20,000 engaged profiles, so the 10% holdout group has around 2,000 people. Smaller lists can still test individual flows with a random split, but results take longer to settle.
Does a holdout test lose me money?
Briefly and slightly. If email is highly incremental, the holdout group buys a little less during the test. That small cost buys you the one number that tells you how much to invest in email for the next year.


