How it works Clients Email marketing About Blog
Book a discovery call
Writing

Your abandoned cart flow is firing for fewer people than you think

·5 min read ·Mohamed Bsoul

Most abandoned cart advice is about the emails. Better subject line, better timing, add a third send, put the product image back in. All of it assumes the flow is reaching everyone who abandoned a cart.

It usually isn't. And the gap is not small.

Why the flow misses people

Klaviyo triggers the abandoned cart flow on Started Checkout, and in most setups that event is sent by a script running in the customer's browser. That is the part worth sitting with. The event does not come from your store's server, where you control everything. It comes from a piece of JavaScript on a stranger's phone, and a lot of things on that phone are actively trying to stop it.

Content blockers stop it. Privacy browsers stop it. Someone who closes the tab quickly can beat it. A script that fails to load because the page was slow never fires at all. None of this shows up as an error anywhere you would look, because from Klaviyo's side nothing happened. There is no failed event to count. There is just a customer who, as far as your flow knows, never started checking out.

So the flow does what it is told. It emails the people it heard about, and it is silent about the rest.

How to check yours in about ten minutes

You do not need a developer for this. You need two numbers over the same window, and Shopify and Klaviyo will both give you one each.

Take the last 30 days. In Shopify, look at Analytics → Reports → Sessions that reached checkout, or the abandoned checkouts count if that is easier to reach. In Klaviyo, open Metrics → Started Checkout and set the same 30 days.

Those two numbers should be in the same neighbourhood. They will never match exactly and they are not supposed to — the definitions differ slightly, some people check out on a second device, some sessions get counted differently. What you are looking for is not a small difference. You are looking for a hole.

If Klaviyo's Started Checkout count is meaningfully below what Shopify says reached checkout, the difference is people your flow never emailed. A shortfall in the teens is ordinary. A shortfall of a third or more is a revenue problem sitting quietly in your account, and it has been there the whole time you were rewriting subject lines.

What actually closes the gap

Add a server-side trigger. Shopify records an abandoned checkout regardless of what the browser did, because it happens on Shopify's side. If your integration can trigger on that rather than only on the browser event, the flow reaches people whose scripts never fired. This is the fix that matters, and it is the one most stores have not done.

Trigger on more than one event. A flow that only listens for Started Checkout inherits every weakness of that single event. Added to Cart catches a different, earlier group. They overlap, and Klaviyo's flow filters stop the same person getting two versions, so the overlap costs nothing.

Check identity, not just events. An event only helps if Klaviyo knows who it belongs to. If someone has not been identified, the event lands attached to nobody and the flow has no one to email. Every form on the site that captures an email should be feeding identity, and if your checkout captures email before it captures anything else, that ordering is worth more than it looks.

Why the emails get all the attention instead

Because the emails are visible and the gap is not.

Everyone can see the abandoned cart email. It arrives in your own inbox when you test it. You can read it, dislike the subject line, and change it in four minutes. It feels like work and it looks like progress.

The people who never triggered the flow are invisible by definition. Nothing lists them. No report has a row for "customers we did not email." You can only find them by comparing two numbers in two different tools and noticing they disagree, which nobody does on a Tuesday.

This is a general pattern in email work, and it is most of why we ended up building a machine to do it rather than hiring people. The check above takes ten minutes and is worth more than a month of subject line testing. It is also the kind of thing that never gets done, because it has no deadline, nobody asks for it, and a human doing this job has five more urgent things this week. A machine that looks at it every week does not have that problem.

What does a normal gap look like?

Somewhere in the low teens as a percentage is unremarkable, and chasing it is not a good use of your time. The two systems count slightly different things and always will. If Klaviyo is seeing a third or less of what Shopify reports reaching checkout, that is not a definitional difference, that is a broken trigger, and it should be the next thing you fix in the account.

Does this affect browse abandonment too?

Yes, and more so. Browse abandonment triggers on a viewed-product event that is entirely a browser event, with no server-side equivalent to fall back on. The same blockers hit it harder, and there is no Shopify-side record to reconcile against. It is one reason browse abandonment tends to underperform its reputation, and one reason we treat it as a supporting flow rather than a core one.

What we would look at first

If you handed us an account tomorrow, this reconciliation is in the first hour of work, before anyone writes a word of copy. Not because it is clever, but because there is no point improving a message that is not being delivered to a third of the people it was written for.

If you want to know what your own gap is, that is a fifteen-minute conversation and there is nothing to buy at the end of it.

Written by Mohamed Bsoul at Nahhda. If any of this is a problem you have, the fastest way to talk about it is 15 minutes.

Book a discovery call
// book a call

15 minutes, and no pitch.

A short call to hear about your business and work out together whether there is anything here worth building. If there isn't, we will tell you.

Mohamed Bsoul · Nahhda

Discovery call

15 minutes
Video call, link on confirmation
Times in your timezone

Come with your numbers open if you can. It makes the 15 minutes worth a lot more.