Est. reading time: 9 minutes
The Klaviyo accounts we audit tend to share a setup story. The Shopify integration was connected on day one, the core flows went live soon after, and nobody has examined the data layer since. When a flow underperforms, the diagnosis goes to copy, timing, or the size of the discount. The feed underneath the flow rarely gets checked.
The instinct makes sense, because the integration presents itself as one connection with one status. In practice it runs as a set of distinct feeds (order events from Shopify’s servers, behavioral events from the visitor’s browser, consent and profile data, the product catalog), and every flow in the account depends on one of those feeds specifically. Once you can say which flow sits on which feed, most flow problems turn into data questions with concrete answers.
What the Klaviyo Shopify integration syncs, and in what order
Connecting the platforms starts a two-stage import. Klaviyo pulls the last 90 days of Shopify data first, so recent customers become usable quickly, then runs the complete historical sync, which can take minutes or days depending on order volume. Once history finishes, new data arrives in real time. The full inventory lives in Klaviyo’s Shopify data reference, and it splits into two groups worth keeping separate in your head.
The first group comes from Shopify’s servers. Checkout Started, Placed Order, Ordered Product, Fulfilled Order, Cancelled Order, and Refunded Order cover the commerce lifecycle, and for carriers that report status back to Shopify, Confirmed Shipment, Marked Out for Delivery, and Delivered Shipment arrive as well. These events fire regardless of what the customer’s browser blocks, which makes them the dependable half of the account. Profile data syncs alongside them (contact fields, locale, marketing consent, and any Shopify customer tags), and the product catalog syncs as well, which is what product blocks in your templates draw from.
The second group is tracked in the browser. Active on Site and Viewed Product come from Klaviyo’s installed snippet, while Added to Cart, Viewed Collection, and Submitted Search are captured through Shopify itself. Every event in this group records only for identified visitors, which the next section unpacks.
One rule governs all of it. Events sync once, at the moment they happen, and Klaviyo never revisits them. An order tag added after processing never reaches Klaviyo, so a segment built on late-added order tags will match nobody. The audit here is short. Open Analytics, then Metrics, filter to the Shopify integration, and confirm each metric shows recent activity. A metric that stalled or never populated is a feed problem, and it outranks every flow edit on the priority list.
Onsite events only exist for visitors Klaviyo has identified
Every browser-side metric above records against identified users. Identification happens when someone submits a Klaviyo form in that browser, clicks through from a Klaviyo email or text (the tracking parameter on the link ties the device to the profile), or enters an email at checkout. Until one of those happens, a visitor can view forty products and build three carts without Klaviyo attaching any of it to a person it can message.
That mechanism sits behind the most common complaint about browse abandonment. When the flow sends a few dozen emails a week against tens of thousands of sessions, the flow logic is not the constraint. Identification is. The same ceiling applies to any cart abandonment flow triggered on Added to Cart, and no amount of subject line testing moves it.
The fix lives upstream of the flow. Grow the identified share of traffic with sign-up forms whose offer can convert a cold visitor, and keep campaigns running, because every click from a Klaviyo email re-identifies that device for future sessions. Then judge browse and cart flows on revenue per identified visitor. Form strategy (offer, placement, timing) is its own discipline.
Three abandonment triggers with three different coverage profiles
Checkout Started is the workhorse. It fires once the shopper enters an email at checkout, on both one-page and multi-page checkout, though a heavily customized checkout may need the shopper to progress one step further. Because it syncs from Shopify’s side, ad blockers and cleared cookies don’t cost you the event. It also carries the cart contents and a checkout URL that rebuilds the cart when the person clicks through from any device, which is what makes cross-device recovery possible.
Added to Cart and Viewed Product sit earlier in the visit, and both come from the browser, so they inherit the identification ceiling. That gives each trigger a distinct profile. Viewed Product reaches the widest slice at the lowest intent, Added to Cart trades reach for stronger intent, and Checkout Started reaches the fewest people with the clearest intent and the most reliable event delivery.
A single shopper can qualify for all three in one session, so the filters matter as much as the triggers:
- Every abandonment flow gets a filter for Placed Order zero times since starting the flow.
- The cart flow adds Checkout Started zero times since starting the flow.
- The browse flow adds both Added to Cart and Checkout Started zero times since starting the flow.
With those in place, a shopper who buys or moves deeper stops qualifying for the shallower sequences instead of collecting all three in one inbox. The build itself (timing, message count, offer laddering) is a separate job.
Turn off Shopify’s own recovery email
Shopify can send its own automatic abandoned checkout email, and connecting Klaviyo does nothing to disable it. Klaviyo’s documentation is explicit that this is a manual step, handled in the Shopify admin’s checkout settings. Left on alongside a Klaviyo flow, it means abandoners hear from two systems with two messages and no coordination. Pick one owner for recovery, and for any brand invested in Klaviyo, that owner is Klaviyo.
Placed Order, Ordered Product, and the trigger mismatch that skips everyone
One completed order produces one Placed Order event plus one Ordered Product event for every line item, synced seconds apart as separate metrics. Placed Order carries the order-level picture (total value, item names, discount codes, order source). Ordered Product carries the per-item detail (SKU, variant, product tags), which is what product-specific branches and segments are built from.
The separation creates a trap Klaviyo warns about directly. Trigger a flow on Placed Order, add a filter for Ordered Product zero times since starting the flow, and every recipient gets skipped, because the Ordered Product event lands seconds after the trigger and trips the filter. Standardize on Placed Order for triggers and filters, and reserve Ordered Product for branching and segmentation.
The order feed also carries better timing anchors than most flows use. Fulfilled Order fires when the order is marked fulfilled, and where the carrier reports status, Confirmed Shipment, Marked Out for Delivery, and Delivered Shipment come through as events. A review request keyed to Placed Order lands while the box is still in transit. Keyed to Delivered Shipment, it lands when the product does. Two caveats keep this honest. Shipment events depend on carrier support, and Refunded Order syncs only for full refunds, so a partial refund won’t exit anyone from a sequence on its own.
Because the historical sync backfills the entire order history, a trigger split on Placed Order count separates first-time buyers from repeat buyers accurately from the first day the integration is live. That split is what makes a post-purchase flow worth the name. A reporting note for anyone reconciling dashboards. Klaviyo calculates revenue as subtotal plus shipping minus discounts and does not remove cancelled or refunded orders, so its number runs higher than Shopify’s for the same window.
Consent syncs unevenly, and the welcome flow inherits the result
The subscriber side of the integration routes Shopify email opt-ins (the checkout checkbox and Shopify’s own storefront forms) into one designated Klaviyo list chosen in the integration settings, and it has to be a list, since segments are not eligible. Landing on that list is what queues the welcome series. If the designated list and the welcome flow’s trigger list differ, checkout subscribers never enter the welcome sequence at all.
The sync’s edge cases shape who ends up subscribed. A brand-new contact who checks the box at checkout is subscribed as soon as the email is captured, at the Checkout Started step, while an existing Shopify contact who checks the same box has to complete the order before the subscription registers. During the initial historical import, a profile that already exists in Klaviyo keeps whichever consent status carries the more recent timestamp.
The direction of the sync is the part that rarely gets audited. An unsubscribe recorded in Shopify does not unsubscribe the profile in Klaviyo. With the to-Shopify sync enabled, subscribes and unsubscribes made in Klaviyo do update Shopify, though suppressions stay local to Klaviyo. Treat Klaviyo as the system of record for consent, turn the outbound sync on so Shopify follows, and check the current behavior against Klaviyo’s subscriber sync documentation, because this logic has changed before and can change again.
One configuration choice sits underneath all of it. A pre-checked subscribe box at checkout fills the list with passive subscribers who never wanted the mail, and Klaviyo recommends leaving it unchecked for exactly the deliverability damage that follows. What the welcome series should do with checkout-sourced subscribers, including when to filter them out, is its own build.
Run the audit in feed order. Confirm every Shopify metric is populating, measure the identified share of traffic before judging any behavioral flow, check the abandonment filters and Shopify’s own recovery email, standardize order triggers on Placed Order, and settle Klaviyo as the owner of consent. That sequence takes an afternoon across two admin panels, and it tends to resolve flow behavior that months of copy changes never touched. If you’d rather have us in the account for that afternoon, reach out and we’ll walk it together.










