Klaviyo segments are saved sets of conditions that Klaviyo checks against every profile continuously, so membership changes on its own as behaviour and properties change — nobody adds or removes anyone by hand. A list is the opposite: a fixed group, usually populated by a signup form, that only changes when someone is added, removed, or unsubscribes. Most of the actual send targeting on a healthy Shopify account runs on Klaviyo segments; lists mainly hold subscription and consent status.
The distinction matters because the two are built and maintained completely differently, and mixing them up is where a lot of Klaviyo accounts end up with flows firing off stale audiences nobody is watching.
What’s the difference between a list and Klaviyo segments?
A list is membership you assign directly — someone fills in a form, and Klaviyo writes them onto that list until they’re removed or unsubscribe. A segment is membership Klaviyo works out for you, continuously, from a set of conditions you define once.
That single difference explains almost everything else. A list can’t get stale in the sense a segment can, because nothing is being recalculated — but it also can’t reflect a change in behaviour unless something actively moves the profile. A segment always reflects the current state of its conditions, which is powerful and also the reason a badly built segment can quietly go wrong: it’s telling you the truth about a definition that stopped matching what you meant.
For a Shopify brand, the practical split is usually: one or two lists tied to signup sources and subscription status, and a working set of segments — engaged, VIP, at-risk, one-time buyer, and a handful of narrower ones for specific flows — that campaigns and flows actually target.
What are the condition types inside Klaviyo’s segment builder?
Klaviyo groups segment conditions into three broad categories, and naming them correctly is the first thing to get right before building anything.
What someone has done covers event-based conditions built on metrics — Placed Order, Opened Email, Clicked Email, Started Checkout, Viewed Product, and any custom event a Shopify app or your own tracking sends into Klaviyo. Every one of these conditions needs a time window: at least once, zero times, at least N times, all inside a stated range such as “in the last 60 days.”
Properties about someone covers profile-level fields rather than events — email marketing consent, SMS consent, location, a default Shopify customer field, or a custom property you’ve set on the profile yourself. These don’t need a time window in the same way; they describe a current state, not a history of actions.
Predictive analytics covers Klaviyo’s own modelled fields, on accounts where they’re available — things like a predicted churn risk or an estimated date of next order, calculated from a profile’s own order history rather than typed in by anyone. Exact field names, and which plans and integrations have access to which predictive fields, have moved between Klaviyo releases. Check your own segment builder’s condition list before assuming a specific field name is still current — this is worth confirming directly in-app rather than trusting an older screenshot or a competitor’s blog post.
Inside any one segment, you combine conditions from any of the three categories with AND, OR and NOT groupings, nested as deep as the logic needs. Engaged, VIP, at-risk, one-time buyer and subscribers — the five working definitions this guide builds — use mostly the first two categories, because they don’t depend on a predictive feature set that varies by account.
How do you build an engaged segment that doesn’t lie to you?
Start with an OR group: “Opened Email” at least once in the last 60 days, OR “Clicked Email” at least once in the last 60 days. Wrap that whole group in an AND with “is subscribed” to email marketing, since an unsubscribed profile shouldn’t count as engaged no matter what it did before unsubscribing.
That’s a working engaged segment — but the setting that matters most is the one easiest to get wrong, which is the subject of the next section.
The step almost every team gets wrong: the window that shrinks on its own
Here’s the setting most teams never think to check: an engagement segment built on “opened or clicked in the last N days” doesn’t measure how engaged your subscribers are. It measures how many of the emails you sent in that window got opened. Those are different things, and the gap between them is invisible until send volume changes.
Say your engaged segment is defined as “Opened Email at least once in the last 60 days.” If you send four campaigns a week, every subscriber gets roughly eight chances inside that 60-day window to open something and stay in the segment. Cut back to one campaign a week — a slower month, a deliverability pause while you clean a list, a holiday lull — and the same subscribers now get roughly two chances in the same window. Nothing about their actual interest changed. The segment shrinks anyway, because the denominator moved: fewer emails sent means fewer possible opens, and a trailing-window condition can only count opens against sends that actually happened.
This becomes expensive the moment the engaged segment feeds a flow filter or a suppression rule — which it usually does, since “only send to engaged profiles” is the whole point of building the segment. A flow that checks “is in Engaged segment” before sending will start excluding real, interested customers the moment send frequency drops, at exactly the point a brand is often trying to be more careful about who it emails, not less. The flow doesn’t send an error. It just quietly reaches fewer people, and the drop looks like a real engagement decline in a dashboard, when the actual cause was the mailing calendar.
The fix isn’t a different segment definition — it’s a habit: before trusting any trailing-window segment’s count, check Klaviyo’s own campaign and flow send history for the same date range the window covers, and confirm sends actually happened inside it at a normal cadence. If send volume dropped, read the segment’s size drop in that light before deciding anything about the audience is wrong. This is exactly the kind of interaction between a segment definition and a sending calendar that a lifecycle flows build has to account for, because a flow filter that silently degrades is worse than one that’s obviously broken — nobody investigates a number that’s merely a little lower than last month.
How do you build a VIP segment?
A VIP segment needs a threshold, and the honest answer is that the threshold is yours to set from your own order data, not a number to copy from somewhere else — order frequency and average order value vary too much by category and price point for a borrowed number to mean anything on a different store.
Structurally, build it as “Placed Order” at least [your threshold] times, optionally grouped with a spend-based alternative using OR: “Placed Order” with a total value at least [your threshold] over the same lifetime window. The OR matters because order count and total spend reward different customers — a frequent, lower-basket buyer and a rare, high-basket buyer can both deserve VIP treatment, and a segment built on count alone misses the second.
Pull the actual numbers from your own Klaviyo account: look at the distribution of lifetime order count and lifetime value across your customer base, and set the VIP threshold somewhere in the upper range of that distribution — high enough to be meaningfully above average, not so high the segment is too small to be worth building flows around.
How do you build an at-risk segment?
At-risk means someone who has bought before and has since gone quiet — not someone who has never bought, and not someone who’s merely a little slower than usual. Build it on two conditions in AND: “Placed Order” at least once, ever, and “Placed Order” zero times in the last [your own lapse window].
A stronger version adds a second, independent signal: “Opened Email” zero times over the same window, or a shorter one. Requiring both no-purchase and no-engagement reduces false positives from someone who’s simply between purchase cycles for a low-frequency product but is still reading your emails — that person isn’t at risk, they’re on schedule.
Set the lapse window from your own average time between orders, not a generic figure — a skincare brand with a 30-day replenishment cycle and a mattress brand with a multi-year cycle need completely different windows for “gone quiet” to mean anything.
How do you build a one-time-buyer segment?
The setting that trips people up here is using “at least 1” instead of “exactly 1.” “Placed Order” at least once catches every customer you have, including your VIPs — it’s not a one-time-buyer filter at all. The condition needs to say “Placed Order” equals exactly 1.
Add a second condition so the segment only holds people who’ve actually had a chance to buy again: the first order placed more than [your own follow-up window] ago. Without that second condition, the segment includes yesterday’s first-time buyer, who hasn’t failed to reorder — they just haven’t had time yet.
How do you build a subscribers segment?
Build this on the profile property for email marketing consent — “is subscribed” to email marketing — rather than on membership in a specific list. The reason is that consent and list membership can drift apart: a profile can remain on a list created by an old signup form while its actual subscription status has changed since, through an unsubscribe, a preference update, or a suppression event. A segment built on the consent property always reflects the current, real answer to “can I email this person,” where a list-membership condition only reflects history.
| Segment | Core condition | Category | Common mistake |
|---|---|---|---|
| Engaged | Opened/Clicked Email in the last N days, AND subscribed | What someone has done | Trusting the count without checking send frequency over the same window |
| VIP | Placed Order ≥ threshold, OR total value ≥ threshold | What someone has done | Copying a threshold from another brand instead of your own order distribution |
| At-risk | Placed Order ≥ 1 ever, AND zero times in the lapse window | What someone has done | Using one generic lapse window across products with very different purchase cycles |
| One-time buyer | Placed Order = exactly 1, first order older than the follow-up window | What someone has done | Using "at least 1" instead of "exactly 1," which catches every customer |
| Subscribers | Subscribed to email marketing (property) | Properties about someone | Building it on list membership instead of the consent property |
Reading the table: every segment above except Subscribers is event-based, because most of what distinguishes these customer states is behaviour over time, not a static fact about the profile. Subscribers is the one exception, and it’s exactly the kind of condition that belongs in the properties category — a current state, checked once, not accumulated over a window.
How do these five segments fit together in a flow?
None of these segments do anything on their own — they earn their keep as filters on a flow or a campaign, and engaged, VIP, at-risk, one-time buyer and subscribers are designed to be mutually exclusive enough to use as branch logic. A post-purchase flow might route a first-time buyer through an education track, a VIP through an early-access offer, and an at-risk past buyer through a win-back message, all from the same trigger event, differentiated only by which of these segments the profile currently sits in.
That kind of branching — one trigger, several paths, decided by segment membership — is most of what a lifecycle flows engagement is actually building underneath the emails themselves. Getting the segment logic right first is what keeps the flow from routing the wrong message to the wrong customer, which is a harder problem to notice than a broken sync, because every email still sends — just to the wrong list of people.
If your Shopify brand is past the point where flows are handled ad hoc and needs the segment layer built once and maintained rather than rebuilt inside every flow filter, that’s the specific gap scaling brands run into once order volume outgrows what one person can reconcile by eye. It’s also worth reading alongside how AI is changing email marketing if the same team is weighing where automation belongs in the segment-and-flow layer versus where a human judgement call still has to sit.
How do you verify a new segment actually worked?
Before wiring any new segment into a live flow filter, open the segment and check three things: the current member count against what you expected given your own list size, a handful of individual profiles you know personally to confirm they landed on the correct side of the logic, and — for anything built on a trailing time window — Klaviyo’s own send history over that same window, checked against the campaign and flow calendar. A segment that returns zero members, or an implausibly large one, is almost always a condition checking the wrong property or the wrong direction (zero times versus at least once), not a genuine account state.
Sources
No external figures are quoted; this article is written from how Klaviyo’s segment builder is configured and operated on Shopify accounts, and describes condition categories and settings rather than measured statistics.