Most cart flows I open send the same sequence to everyone. This is how I turn that sequence into a decision system, using signals your ESP is already collecting.
The shift
Someone abandons a cart. A few hours later, an email. Twenty four hours later, another one. Then maybe an SMS with 10% off.
The trigger is fine. The assumption after it is the problem.
Someone who viewed a product once and added it to cart is nothing like someone who came back three times, read the reviews, added to cart and then left. The second person is handing you far more buying signal, and almost every flow I look at treats them identically.
None of what follows needs new tools or a data team. It is branching logic on data you already have.
Step one
Every one of these is already sitting in Klaviyo. You do not need custom events for any of it.
| Signal | Where it lives | What it actually tells you |
|---|---|---|
| Started Checkout | Metric | The strongest signal short of buying. They reached the last step and stopped, so something specific blocked them. |
| Added to Cart | Metric, count 7d | Once can be an accident. Twice in a week is deliberation. |
| Viewed Product | Metric, count 30d | Research depth. Repeat views of the same SKU mean real consideration, not browsing. |
| Placed Order | Metric, ever | Splits prospect from customer. This one changes the offer, not just the copy, so it branches before scoring. |
| Email engagement | Profile, 30d | Whether email is still a live channel for this person or you are talking into a void. |
| SMS consent | Profile | Whether you are allowed to escalate channel at all. |
| Cart value | Event property | Measured against your own AOV. Big carts usually need reassurance, not a discount. |
Step two
Here is the scoring I start with. It is arithmetic, not a model, and you can build the whole thing with conditional splits.
These weights are where I start, not a benchmark. I order them by how much signal each behaviour carries, then tune the numbers against placed order rate after a few weeks of data. If someone hands you universal point values, they have not seen your account.
Step three
Check customer status first, because it overrides the score. Then split everyone else on the number.
score 4 or below
The cart was a bookmark. Pushing for the sale today asks for a decision they have not reached.
Never here: a discount. You would be paying to skip the education step, and teaching them to wait for a code next time.
score 5 or above
They were at the last step. Something concrete stopped them, and in my experience it is rarely price.
Last resort: if you discount at all, it goes in the third message. Never the first.
has placed an order
This branch overrides the score. A returning customer with a full cart is the easiest revenue in the account.
Never here: a first purchase discount. You would be discounting a sale you already had.
Step four
Times run from the trigger. The splits matter far more than the delays, so tune the delays to your own consideration window.
Use Started Checkout as the primary trigger. Add a parallel Added to Cart flow only if your add to cart to checkout rate is bad enough that you are losing people before they ever reach it.
Have they placed an order, ever? Send them to the existing customer branch and stop scoring. This runs first because it changes the offer, not just the wording.
Everyone else splits on intent. Five or above goes high intent, four or below goes low intent.
Branch specific. No discount in any branch at this point.
Branch specific, and a genuinely different angle. Not a resend with a new subject line.
Opened or clicked either message? They are still thinking, so stay on the branch. Silent? A third email will not fix a dead channel. Either stop, or use SMS if they are consented and high intent.
If a discount shows up anywhere in this flow, it shows up here, and never in the existing customer branch.
Placed Order exits the flow, always. Add Started Checkout as a re entry trigger if you want the flow to restart rather than carry on with stale intent.
Before you ship it
This is the boring part, and it is where most of the money leaks. I run it before launch and again every quarter.
Afterwards
Flow wide numbers hide everything that matters here. Read each branch on its own.
The entire point of splitting is that the branches should behave differently. If they do not, your score is not separating anything.
More honest than conversion rate, because it accounts for the discount you gave away to get there.
The share of recoveries that used a code. If it climbs over time, you have trained the list to wait for one.
An over eager high intent branch shows up here long before it shows up in revenue.
Hold out a slice. Keep a small percentage out of the flow completely. Without it you cannot separate recovered revenue from revenue that was always going to arrive, and cart is the flow where that gap is widest, because these people were already buying.