Skip to content

How to measure email marketing ROI on Shopify, step by step

Write down what email claims, count clicks only, and add up the bills and the discounts. Measure what email adds with a random holdout in one busy flow, then set the margin on the orders it caused against what it cost.

By , Founder & CEOUpdated 8 min read

Run the numbers for your store: the free email marketing ROI calculator.

Usually in seven moves. Write down what email claims, then count clicks only. Add up what email costs, discounts included. Measure what it adds with a random holdout in one busy flow. Then set the margin on the orders it added against those costs, one flow at a time.

Here ROI means the margin email caused, set against what email cost. Every menu path below comes from the Klaviyo, Shopify or Google help pages listed at the end.

Step by step

  1. Write down what email claims. Shopify's Total sales by referrer gives Email the orders whose last interaction came from an email link. Note that row and your Klaviyo flows' attributed revenue for the same dates: that is the before picture. Path: Shopify admin > Analytics > Reports > Category filter > Sales > Total sales by referrer.
  2. Count clicks, not opens. In Klaviyo's attribution settings, untick email opens and exclude Apple Mail Privacy Protection opens. Preview the change with Compare model before you save. Klaviyo recalculates past data after a change, and says updates can take up to 36 hours to show. Path: Klaviyo > account menu (lower left) > Settings > Attribution > Attribution windows.
  3. Add up the bills. Klaviyo prices its email plans on active profiles and emails sent, and its Billing page shows the Monthly Total. Shopify Messaging puts emails beyond the free monthly 10,000 on your Shopify bill as Marketing emails. Path: Klaviyo > your organization name (lower left) > Billing > Overview; Shopify admin > Billing section > View details.
  4. Price the discounts. Open Sales by discount codes and find the codes only your emails carry. Their Discount amount is a cost of email, even though no invoice shows it. Path: Shopify admin > Analytics > Reports > Category filter > Sales > Sales by discount codes.
  5. Measure what email adds. Split one busy flow at random right under its trigger, with one path that sends nothing. Tag each path with a profile property. Count who ordered in each group once your slow buyers have bought. How to run an email holdout test, step by step has the full build. Path: Klaviyo > Flows tab > your flow > add a split > Random sample.
  6. Turn the gap into margin. Multiply the orders the flow added by your average order value and your margin. Take off the flow's discounts and its share of the bills. What is left is the flow's return. Path: Shopify admin > Analytics > Reports > Average order value over time.
  7. Check what the sends cost in reach. Each Shopify Messaging campaign report shows an unsubscribe rate and a spam rate. Gmail asks senders to keep spam rates reported in Postmaster Tools below 0.3%. A flow that pays but burns the list is a loan, not a profit. Path: Shopify admin > Apps > Messaging > your campaign.

A worked example

For illustration, every number below is invented and round. Say your abandoned checkout flow takes in 2,000 people over eight weeks. For illustration, a random split sends about 1,000 down each path.

For illustrationEmailed pathHoldout path, no emails
People who entered the flow1,0001,000
People who placed an order13085
Orders the flow added45
Orders Klaviyo credited to the flow110

For illustration, Klaviyo credits the flow with 110 orders, while the holdout says it added about 45. If you add 130 and 85 and take the square root, you get about 15: the gap chance alone can make. For illustration, a gap of 45 is three times that, so the effect is real.

For illustration, take €45 an order and a 40% margin.

For illustrationAmount
Sales from the 45 added orders, at €45 each€2,025
Margin on those sales, at 40%€810
Discount: a 10% code on 80 emailed orders€360
The flow's share of eight weeks of email bills€60
What the flow returned after costs€390

One store's Break-even sheet puts the same test in ROAS terms: at a 40% margin, break-even ROAS is 2.5x, which is 1 divided by 0.40. For illustration, €2,025 of caused sales against €420 of costs is about 4.8x, comfortably over 2.5x. For illustration, Klaviyo's 110 credited orders would have suggested €4,950 of sales, more than twice the caused figure.

The flow pays. The code is the soft spot. For illustration, all 80 code users got 10% off, including people the holdout suggests were coming anyway. If the gap holds when you drop the code from the last email, you keep the orders and the €360.

When to count? In one store's Journeys sheet, journeys with 1 touch took 0.5 days to buy. That store's journeys with 2 to 3 touches took 12.5 days. If your buyers look like that, count each group's orders until two weeks after the last person enters.

What to check when the report looks wrong

  • Email's ROI looks enormous. You probably divided credited revenue by fees alone. Redo it with the orders the holdout says were added, and put the discounts on the cost side.
  • Klaviyo's revenue figures shifted after step 2. That is the attribution change at work: Klaviyo recalculates history when settings change. Note your before figures first.
  • Your Klaviyo bill jumped. Klaviyo bills on active profiles, and any profile it can email counts, subscribed or not. To avoid a plan change, Klaviyo says to get under your plan's limit at least 24 hours before the next billing cycle.
  • Shopify billed you for marketing emails. Past the free 10,000 a month, Shopify Messaging charges $1 USD per 1,000 more emails. Its abandoned checkout automations stay free, so a big campaign is the likely cause.
  • The holdout still got a reminder. Your store's own abandoned checkout message may still be on. Klaviyo's help says to turn off default platform abandoned cart messages to prevent duplicates.
  • GA4 shows almost no email revenue. Untagged email links lose their source and can land in Direct. In one store's export, Direct holds 57.7% of revenue in every view (Channels sheet), and no model can pull email back out of it. Tag your email links before you judge the channel.

What to do this week

  1. Find your all-in monthly email bill. In Klaviyo, click your organization name, then Billing, and read the Monthly Total. In Shopify, open the Billing section and click View details for any Marketing emails line. Pass: you can name one monthly number for email, all in. Fail: costs hide across apps and invoices, so list them before you judge anything.
  2. See where Email sits in GA4's paths. In GA4, click Advertising, then Key event attribution paths under the Key events dropdown. Read the chart of early, mid and late touchpoints. Pass: Email shows up early or mid-path too, so it starts or moves journeys. Fail: it sits almost only in late touchpoints, so it mostly closes journeys others started, and a holdout will likely shrink its credit.
  3. Make sure the holdout will really get nothing. Start a checkout on your store with a spare email address and leave without paying. Pass: one abandoned checkout email arrives, from Klaviyo. Fail: a second one arrives from your store, so switch the store's own message off first, as Klaviyo's help advises.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: Sales reports (Shopify Help Center); How to change your attribution model (Klaviyo Help Center); Understanding Klaviyo message attribution (Klaviyo Help Center); How Klaviyo billing works (Klaviyo Help Center); Shopify Messaging email pricing (Shopify Help Center); How to A/B test flow branches (Klaviyo Help Center); How to add an update profile property action to a flow (Klaviyo Help Center); How to create an abandoned cart flow (Klaviyo Help Center); Key events attribution paths report (Google Analytics Help); Shopify Messaging email analytics (Shopify Help Center); Email sender guidelines (Gmail Help)

Frequently asked questions

  • What should count as the cost of email marketing?
    Everything you would stop paying without it: the platform plan, sending charges, the discounts your emails hand out and the hours spent building them. Discounts are the cost most reports miss, because they show up as lower revenue rather than as a bill.
  • Should I judge email on revenue or on margin?
    On margin. Revenue an email caused only pays if the margin on it beats what the email cost. In one store's Break-even sheet, a 40% margin means a break-even ROAS of 2.5x, so each euro of cost needs 2.5 euros of caused sales.
  • Why does Klaviyo credit the flow with more orders than the holdout shows?
    Because Klaviyo credits any order inside its window after a click or an open, whether or not the email changed anything. A holdout counts every order in both groups, so customers who would have come back anyway cancel out. The gap is the flow's work; the rest is credit.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.