The safe way to decide whether your abandoned cart discount belongs in email one or email three is to route entrants down parallel branches with a random-sample split and read placed-order revenue net of discount cost, not to let Klaviyo's built-in A/B test crown a winner. That native test only judges open and click rate, so it will happily declare the earlier, deeper discount the winner while it quietly erodes margin and teaches repeat buyers to wait for the code. Build three branches (discount in email one, discount in email three, and a no-discount control), run them side by side, and compare revenue per recipient and repeat-abandonment before you roll one out.
Key takeaways
- The short answer: split entrants with a Random sample conditional split into email-one-discount, email-three-discount, and a no-discount control, then compare Placed Order revenue minus discount cost per branch.
- Klaviyo's native flow email A/B test cannot pick this winner: its only winning metrics are Open Rate and Click Rate, never revenue.
- A native flow variation is only called significant at 500-plus recipients per variation and 90 percent win probability, so low-traffic stores wait weeks for a verdict.
- The control branch is what tells you whether the discount recovered a sale that would have closed anyway, which is the number that protects margin.
- Watch repeat-abandonment rate alongside revenue: a discount that lifts this week's recovery while training customers to stall is a loss disguised as a win.
What you need
- Klaviyo account with Manage Flows permission (Analyst or Manager role).
- A store integration sending the Started Checkout and Placed Order metrics, typically Shopify.
- An existing abandoned cart flow, or the access to build one, triggered on Started Checkout.
- Enough checkout volume to reach a decision: aim for at least a few hundred entrants per branch per week, since branch-level reads need volume the same way the native test does.
- A discount mechanism you can vary by branch (two distinct codes or price rules so you can attribute redemption).
Build the branch test and read revenue, not opens
- Confirm the flow trigger is Started Checkout and that the flow filter
Has not Placed Order since starting this flowis present, so people who buy on their own drop out. Klaviyo documents Started Checkout as the standard trigger in its guide to creating an abandoned cart flow; if you are still deciding between checkout and add-to-cart as the entry point, that trade-off is covered in Added to Cart vs Checkout Started in Klaviyo. - Immediately after the trigger, drag in a Conditional split and set the condition to Random sample. Klaviyo's documentation on adding a conditional split shows the Random sample option and the percentage selector that decides how many profiles take the YES path.
- Give the first path roughly 33 percent for the email-one-discount branch. Remember the multi-branch behaviour Klaviyo describes: a percentage applies to the profiles evaluated for that path, not to everyone who entered the split, so on the next path set 50 percent to halve the remaining two-thirds into the email-three-discount branch and the control.
- In the email-one-discount branch, build the sequence with the discount code in message one (send after roughly one hour), a plain reminder as message two, and a final reminder as message three.
- In the email-three-discount branch, keep messages one and two discount-free and place the code only in message three. Keep timing and copy otherwise identical so the discount position is the only variable.
- In the control branch, send the same three reminders with no discount in any message. This branch measures the sales you recover without spending margin at all.
- Use a distinct discount code per discount branch (for example
CART1andCART3) so redemption is attributable to a branch rather than pooled. - Do not enable the message-level Automatic Winner Selection for this test. Klaviyo's flow email A/B test documentation states that for flow emails only Open Rate and Click Rate are available as winning metrics, so its automatic winner would optimise engagement, not the revenue-minus-discount number you actually care about.
- Let the test run until each branch has enough conversions to compare. Then open each branch's message analytics and pull Placed Order count, total revenue, and the redemption count for each code.
Turn the branch numbers into a margin decision
For each branch, compute revenue per recipient and, more importantly, incremental margin per recipient against the control:
rev_per_recipient = branch_placed_order_revenue / branch_recipients
discount_per_recip = (redemptions x avg_discount_value) / branch_recipients
incremental_margin = (rev_per_recipient - discount_per_recip) * gross_margin_rate
- control_rev_per_recipient * gross_margin_rate
The branch with the highest incremental margin wins, not the one with the highest raw recovery. It is common for the email-three branch to show slightly lower gross recovery but higher incremental margin, because a share of the email-one redemptions were buyers who would have converted on the plain reminder in email two anyway. The control branch is what exposes that overlap.
Why the native A/B test is the wrong instrument here
Klaviyo will only mark a native flow variation statistically significant once at least 500 recipients have received each variation and one variation reaches a 90 percent win probability, with the credible intervals of the top two variations overlapping less than 10 percent, per Klaviyo's explanation of statistical significance in flows. Two problems follow. First, the metric it tests toward is engagement, which does not equal margin. Second, a lower-volume store rarely accumulates 500 recipients per variation quickly, so you either wait weeks or read an inconclusive result. Branch-level reads give you the revenue view directly, but they inherit the same volume reality: Klaviyo notes that random-sample branch testing works best on large audiences, and its own write-up of random-sample branching use cases frames the technique around sizeable lists. Below a few hundred conversions per branch, treat the read as directional and extend the window.
| Approach | Decides on | Volume to conclude | Best for |
|---|---|---|---|
| Native flow email A/B | Open or Click rate only | 500+ recipients per variation, 90% win probability | Subject lines, creative, copy |
| Random-sample branches | Placed Order revenue and redemption you compute | Few hundred conversions per branch (directional below that) | Discount position, timing, channel mix |
| Branches plus a control | Incremental margin vs no discount | Highest, needs the control populated too | Deciding whether to discount at all |
Troubleshooting
- Branches look uneven. Random sample assigns per profile, so a 33 percent path will not land exactly one third. This is expected; compare per-recipient rates, not raw totals.
- Percentages do not add up. If you set 33 percent then 33 percent on the second path expecting a third each, you will be short, because the second percentage applies to the two-thirds that remain. Set the second path to 50 percent to halve the remainder.
- Redemptions you cannot attribute. If both discount branches share one code, you cannot tell which position drove revenue. Use a separate code per branch.
- Control branch is converting suspiciously well. That is the signal to read carefully, not a bug: it means much of your recovery does not need a discount, and the email-one branch may be spending margin on buyers you already had.
- People still get the discount after buying. Confirm the
Has not Placed Order since starting this flowfilter is on the flow and that Placed Order is firing without delay from your integration.
How to verify it worked
You have a defensible decision when three things hold. First, each branch shows a clear revenue-per-recipient figure and, for the discount branches, a redemption count tied to its own code. Second, incremental margin per recipient against the control is positive for the branch you plan to keep; if the winning branch's incremental margin is at or below the control, the discount is not paying for itself and the right move is a leaner or later offer. Third, repeat-abandonment does not climb in the branch you choose: pull the share of that branch's recipients who trigger Started Checkout again within the following weeks without buying, and confirm the earlier-discount branch is not training that behaviour. When the branch you promote holds the highest incremental margin and the lowest repeat-abandonment, route 100 percent of entrants down it and retire the split.