Skip to main content

Identity Resolution

Klaviyo Abandoned Cart Flows: Why Identity Resolution Is the Missing Link

A Klaviyo abandoned cart flow can only email a shopper Klaviyo has identified. The trigger needs two things: a Started Checkout or Added to Cart event, and a known profile to attach it to. When a returning customer shops on a new device, or comes back after Safari has cleared Klaviyo's cookie, the cart happens but no profile receives it, so the flow never starts. Identity resolution closes that gap by recognising the shopper and sending the event to the profile Klaviyo already has.

This guide covers how Klaviyo's abandoned cart and abandoned checkout flows trigger, why so many carts never reach one, the setup Klaviyo itself recommends, an example flow you can copy, and how identity resolution gets the missing carts into your flows. It's the Klaviyo chapter of our website visitor identification and identity resolution guide, which explains the matching methods in more depth.

How Klaviyo abandoned cart flows trigger

Klaviyo flows are metric-triggered: a profile enters the flow when a specific event lands on it. For abandoned carts there are two events to choose from.

  • Started Checkout. Most of Klaviyo's pre-built abandoned cart flows use this one. It fires when a shopper enters their information at checkout and moves to the next step, according to Klaviyo's guide to creating an abandoned cart flow.
  • Added to Cart. It fires when a shopper adds an item to the cart. On Shopify you have to turn on the Track behavioral events setting to get it; on BigCommerce you set it up manually.

Klaviyo recommends running both as separate flows, because someone who starts checkout has shown stronger intent than someone who only added an item. To stop a shopper getting both, add the filter Started Checkout zero times since starting this flow to the Added to Cart flow.

The second requirement is less obvious: the event has to belong to an identified profile. Klaviyo's onsite JavaScript sets a first-party cookie, __kla_id, and Klaviyo's cookie documentation lists three ways a visitor becomes identified:

  1. They fill out a Klaviyo sign-up form.
  2. They click a link in a Klaviyo email or SMS.
  3. They go through checkout on your site, through a supported ecommerce integration.

An Added to Cart event from a browser Klaviyo can't tie to a person has no profile to trigger a flow on. Klaviyo can hold that activity in the browser and add it to the profile later if the shopper identifies themselves in the same browser (it calls this anonymous visitor activity backfill), but the flow doesn't fire for the cart while the shopper is anonymous.

Abandoned cart vs abandoned checkout in Klaviyo

The two names get used interchangeably, but in Klaviyo they are different triggers with different audiences.

Abandoned cart flowAbandoned checkout flow
Trigger metricAdded to CartStarted Checkout
Shopper intentInterested, still browsingReady to buy, stopped at payment
How the profile is usually knownAn earlier form, email click or checkout in the same browserThe email typed into checkout
Who it missesAnyone browsing on a device or browser Klaviyo doesn't recogniseShoppers who leave before typing an email
MessagingA lighter reminder of what they looked atA direct nudge to finish the order

Because Started Checkout usually arrives with an email address, the abandoned checkout flow reaches most of the people who trigger it. The abandoned cart flow is where identity matters most: an Added to Cart event carries no email of its own, so it only works when the browser was already identified.


Why most abandoned carts never trigger a flow

If you compare the number of carts in your store with the number of people entering your abandoned cart flow, the second number is often far smaller. Four things cause most of the gap.

The shopper was never identified. A first-time visitor who hasn't filled in a form, clicked one of your emails or started checkout is anonymous to Klaviyo. Their cart can't trigger anything.

The cookie expired. Klaviyo sets __kla_id to last two years, but browsers shorten that. Klaviyo's own documentation notes that Safari deletes JavaScript-set cookies after seven days of browser use without interaction with the site, Brave caps them at seven days, and Firefox purges storage for known trackers daily unless the visitor has interacted with the site in the last 45 days. A subscriber who comes back after a week on Safari looks like a stranger.

The shopper switched devices. Identification lives in one browser. A subscriber who clicked your email on their phone is identified on the phone. When they add to cart on a laptop that evening, the laptop browser is anonymous, and Klaviyo has no reason to connect it to the phone.

The shopper came back through a different door. Instagram's in-app browser, a private window or a new browser profile each keep their own cookies, so they usually start without Klaviyo's, even on the same phone.

Klaviyo has features aimed at the cookie problem. First-party ID uses a server-set cookie, __kle_id, to restore __kla_id when it expires, and Extended ID cross-references other platforms' cookies already in the visitor's browser to re-identify them. Both are worth turning on. They work inside the browser the shopper is using, so they help most with expired cookies and less with a new device the shopper has never identified on.


Klaviyo abandoned cart best practices

Fixing identification gets more carts into the flow. These settings decide what the flow does with them. All of them come from Klaviyo's abandoned cart guide unless noted.

Start from the pre-built flow. After you integrate your store, Klaviyo's flow library includes abandoned cart flows built for your platform. Customise one rather than building from scratch, and keep its dynamic product block.

Time the first message 2 to 4 hours after the trigger. Klaviyo's pre-built flows wait 4 hours. Send the second message 20 to 48 hours after that. Expensive, considered purchases can take longer delays. If your integration syncs hourly (anything other than Shopify or BigCommerce may), don't set a delay shorter than 1 hour and 15 minutes.

Send two or three messages. Klaviyo says this range gives the best results across its ecommerce customers.

Keep the discount out of the first email. Customers learn to abandon carts if the first reminder always carries a code. Put an incentive in the final message, or in a branch only for people who have never ordered.

Show only what they left behind. The dynamic content block shows each abandoned product's image, title, quantity and price, and repeats for multiple items. Keep the Return to Cart button; on Shopify it links to {{ event.extra.checkout_url }}. Don't add other products, which pull attention away from finishing the order.

Stop the flow when they buy. Add the flow filter Placed Order zero times since starting this flow. Klaviyo checks filters before every message, so anyone who orders is skipped from then on.

Turn off your platform's own reminders. Shopify and BigCommerce can send their own abandoned cart emails. Disable those so shoppers don't get two sets.

Add SMS after email works. Start email-only, confirm the flow behaves, then add text messages.

It is worth the effort. In Klaviyo's 2026 abandoned cart benchmark report, based on more than 110,000 Klaviyo customers, abandoned cart flows earned the highest revenue per recipient of any flow: $6.77 on average for email and $4.48 for SMS, with the top 10% of brands at $13.70 for email. The average email click rate was 6%.


A Klaviyo abandoned cart flow template

Here is a starting sequence built from the practices above. Adjust the delays for your products and price point.

StepAbandoned checkout flowAbandoned cart flow
TriggerStarted CheckoutAdded to Cart
Flow filtersPlaced Order zero times since starting this flowPlaced Order zero times since starting this flow; Started Checkout zero times since starting this flow
Message 14 hours later: "You left something in your cart." Dynamic product block and Return to Cart button. No discount.4 hours later: a lighter reminder of the products they added. No discount.
Message 2About 24 hours later: answer the likely objection (sizing, shipping, returns) and invite questions.About 24 hours later: reviews or details for the product in the cart.
Message 348 hours or more later: a final reminder. Offer an incentive only in a branch for people who have never ordered.Optional. Keep it short.

If your flows are firing for some carts and not others, check the trigger and the filters first. If those look right, the remaining gap is identification, which the next section covers.

How identity resolution fixes the trigger gap

An abandoned cart flow fails silently when the cart event and the customer's profile never meet. Identity resolution is the work of connecting them: recognising that today's anonymous browser belongs to a person you already know, then sending the event to that person.

Take a customer, Bob. On Tuesday he clicks one of your emails on his phone, browses and leaves. Klaviyo identifies his phone browser from the click. On Friday evening he comes back on his laptop through a Google search and adds a jacket to his cart.

Without identity resolution: the laptop browser has no Klaviyo cookie. The Added to Cart event has no profile, Bob doesn't enter the flow, and you never send the reminder.

With identity resolution: the laptop session is matched to Bob, either deterministically (he logged in, or the laptop has carried one of his identifiers before) or probabilistically from the signals the sessions share. The Added to Cart event is sent to Bob's existing Klaviyo profile, and the flow starts four hours later as designed.

There are two different situations to solve, and they need different data:

  1. The shopper is already in Klaviyo, but Klaviyo doesn't recognise this visit. This is first-party identity: matching the visit to a customer you already have. It covers subscribers and past buyers on new devices and after cookie loss.
  2. The shopper has never given you an email. No amount of first-party matching finds a contact you never collected. Reaching them takes third-party data: matching the visitor against an outside network of consumer profiles.

How Upstack gets the missing carts into Klaviyo

Upstack has a product for each situation.

Upstack Signal recognises the customers you already have. Signal resolves every visit against its identity graph of 750M+ devices and 150M+ customers, using deterministic and probabilistic matching, and an Upstack ID lasts the life of the customer rather than the life of a cookie. Through the Klaviyo integration, Signal looks up the shopper's existing Klaviyo profile, first from Klaviyo's _kx identifier carried on email clicks and then by email address, and sends Added to Cart and Started Checkout events to that profile. Your existing abandoned cart and abandoned checkout flows then fire for subscribers Klaviyo had lost track of. Signal doesn't create new profiles in Klaviyo; it only adds events to profiles that are already there. Our Klaviyo abandoned cart recovery page shows how the setup works and what three brands recovered.

If you send Upstack's cart events to Klaviyo, use one source of Added to Cart events per flow, so the same shopper doesn't enter a flow twice from two integrations.

Upstack Audience finds the shoppers who aren't in Klaviyo yet. Audience matches anonymous visitors against our partner data network. When a visitor resolves, their email is verified and they are added to Klaviyo as a new profile on a list called UpstackData, so your welcome and abandonment flows can reach them. Shoppers who are already in your account go to a separate UpstackData Reactivate list instead of being duplicated. Audience runs on a Signal plan, starts at $0.025 per resolved match, and has a 14-day free trial. In one Shopify apparel brand's pilot (September 2025), it produced 106 orders in the first 7 days, 7–8% of daily orders came from shoppers Audience identified, and the flow's unsubscribe rate was 2.8%.

The same identity work improves your ad data. The emails and phone numbers Signal attaches also go to Meta through the Conversions API; our Meta Event Match Quality guide covers that side, and our post on using Klaviyo data to improve ad performance covers building ad audiences from your Klaviyo lists.


How to see how many carts your flow misses

You can size the gap with data you already have.

  1. In Shopify, open Orders > Abandoned checkouts and count the abandoned checkouts for the last 30 days.
  2. In Klaviyo, open your abandoned checkout flow and note how many people entered it over the same 30 days.
  3. Repeat for Added to Cart: compare carts created in your store analytics with entries into the Added to Cart flow.

The checkout comparison should be close, because checkout collects an email. The cart comparison shows how many shoppers added items without Klaviyo knowing who they were. That difference is the audience identity resolution can bring back into the flow.


Frequently asked questions

Why is my Klaviyo abandoned cart flow not sending?

First check the basics: the flow is live, your ecommerce integration is syncing Added to Cart or Started Checkout, and the flow filters aren't excluding everyone. If those are fine, the shopper is usually anonymous to Klaviyo. A cart only triggers the flow when Klaviyo can tie the browser to a profile through a form, an email or SMS click, or checkout, and that link is lost on new devices and after Safari deletes Klaviyo's cookie.

What is the difference between abandoned cart and abandoned checkout in Klaviyo?

An abandoned cart flow triggers on the Added to Cart metric, when a shopper adds an item. An abandoned checkout flow triggers on Started Checkout, when they enter their details at checkout and move to the next step. Klaviyo recommends running both, with a Started Checkout zero times since starting this flow filter on the cart flow so nobody gets both.

When should a Klaviyo abandoned cart email send?

Klaviyo's pre-built flows send the first message 4 hours after the trigger, and Klaviyo recommends 2 to 4 hours, with a second message 20 to 48 hours later. Allow longer for expensive products, and at least 1 hour and 15 minutes if your integration syncs hourly.

How many emails should a Klaviyo abandoned cart flow have?

Two or three. Klaviyo's research across its ecommerce customers found that range performs best. Keep any discount for the last message or for first-time buyers.

Can Klaviyo send abandoned cart emails to anonymous visitors?

No. A flow needs a profile with a way to contact the shopper. Klaviyo can store an anonymous visitor's activity and add it to their profile if they identify themselves later in the same browser, but the cart doesn't trigger a flow while they are anonymous. To reach shoppers who aren't subscribers yet, you need a contact for them, either from your own forms and checkout or from third-party identification such as Upstack Audience.

Does Upstack create new profiles in Klaviyo?

Upstack Signal doesn't: it sends cart and checkout events to profiles that already exist in your Klaviyo account. Upstack Audience does: it adds shoppers identified from partner data as new profiles on the UpstackData list, and puts existing profiles on the UpstackData Reactivate list instead of duplicating them.

What should I put in a Klaviyo abandoned cart email?

The products the shopper left, with image, title, quantity and price from Klaviyo's dynamic block, a Return to Cart button, and a short message that invites questions. Leave out other products and save any discount for a later message.


Want to see how many of your carts never reach Klaviyo? Book a demo and we'll measure it on your store's traffic.

About the author

Michael Alt

Founder & CEO, Upstack Data

Michael Alt is the founder and CEO of Upstack Data, the server-side tracking, identity resolution and attribution platform for Shopify and DTC brands.

Want similar results?

Start free for 21 days and see what clean signal does for your performance. No card, no contract.