Segments & cohorts
Why this matters for your business
Most merchants spend hours every week — or pay a consultant — to build customer lists. "Loyal customers who haven't bought in 30 days." "First-time buyers from Australia." "Anyone who opened the last campaign but didn't click." Then a week later the list is stale, and the work starts again.
Segments fix that. You describe the customer you want to reach once, in plain rules. The system keeps that audience current forever — adding new customers as they qualify, removing them the moment they don't.
The implication is bigger than it sounds. When your audiences maintain themselves, you stop running campaigns because the list happens to be ready. You start running them because the moment is right. The cadence changes from "monthly newsletter to whoever's on the list" to "today, the right offer to the right 200 people." That's a different business.
What this typically unlocks
| Outcome | Typical lift |
|---|---|
| Hours/week on audience-building | 6–10 hours saved — segments don't decay |
| Campaign open rate | +24% — tighter targeting beats blast |
| Conversion rate per send | +38% — message matches the moment |
| Audience freshness | < 5 seconds after the qualifying event vs. days for spreadsheet-managed lists |
| Speed from idea → live audience | ~2 minutes in the rule builder vs. half a day in CSVs |
What you actually get
Three flavours of audience:
- Dynamic segments — defined by a rule (e.g. "anyone who bought twice in the last 90 days, opted into WhatsApp, AOV > $80"). Membership recomputes the moment a customer starts or stops matching. This is the workhorse.
- Static segments — a fixed list of customers you manage manually (CSV upload, hand-picked from the customer table). Useful for one-off launches or VIP lists you curate yourself.
- AI-generated segments (Pro+) — describe the audience in English ("loyal high-value customers who've gone quiet for two weeks") and the AI builds the rule for you. Recomputes daily plus on demand.
Plus cohorts — audiences anchored to a moment in time ("first-order in March 2026", "everyone who received the holiday flow"). Cohorts power retention math; segments power live targeting.
How it powers every part of your store
| Where segments are used | What it makes possible |
|---|---|
| Campaigns as the audience | Pick a segment, pick a message, send. The audience is already current. |
| Journey enrolment | Auto-enrol everyone who joins a segment ("loyal at-risk" → win-back flow). |
| Predictive LTV (Pro+) on segments | Segment-level forecasts: "what will the loyal cohort spend in the next 90 days?" |
| Attribution by segment | "Which segment drove the most revenue this quarter?" without manual joining. |
| Anomaly detection segment-aware | "Sales dropped" → "actually, the loyal segment is fine, but engaged customers fell off". |
| Ad audiences export | Push a segment to Meta/Google Custom Audiences with one click — refreshes daily. |
| Storefront widgets by segment | Show a different exit-intent offer to "first-time visitors" vs. "loyal returners". |
How it works (without the technical bits)
The "trigger" trick — why it stays fast
If we recomputed every segment on every event, the system would
crawl. Instead, each segment declares which event types could
possibly affect its membership. A segment about "last order"
recomputes only on order events. A segment about "cart abandonment"
recomputes only on cart events. A page_view event triggers
neither.
This is invisible to you in the rule builder — the system figures out the triggers from the rule. But the consequence is real: you can have hundreds of segments without slowing down the platform.
Authoring rules — what's available
Eight kinds of conditions, combinable with AND / OR / NOT,
nested up to 4 levels:
| Condition | What it captures | Example |
|---|---|---|
| Equality | Match an exact value | lifecycleStage = 'loyal' |
| Comparison | Greater/less than | totalSpent > 500 |
| List | Match any of N values | country in ('US', 'CA', 'GB') |
| Tag/text | Has a tag or contains text | tags contains 'vip' |
| Time window | Happened within / since | lastOrderAt within 30 days |
| Aggregate | Count or sum | count of orders > 3 |
| Event existence | Did/didn't do an event | any event of type 'cart_abandoned' within 24h |
| Negation | The opposite of any of the above | NOT (lifecycleStage = 'churned') |
That's enough to express almost any real-world audience without needing SQL.
Three example rules
Each is something a merchant actually wants to send to. Each is 2-3 lines.
Cart abandoners (last 24h):
lifecycleStage in (engaged, converted, loyal)
AND last event of type 'cart_abandoned' within 24 hours
AND no event of type 'purchase' since that cart_abandoned
VIP at-risk:
lifecycleStage = 'loyal'
AND lastActivityAt within 60 days
AND lastActivityAt not within 14 days
High-LTV mobile shoppers in UK:
totalSpent > 250
AND country = 'GB'
AND any event of type 'page_view' has device = 'mobile'
AND count of orders > 2
Cohorts — segments anchored in time
A cohort is a snapshot. It captures "the customers who did X in the moment of Y" and never changes. Examples:
| Cohort | Definition |
|---|---|
| March 2026 first-orderers | Customers whose first order was in 2026-03 |
| Q1 win-back recipients | Customers who received the win-back flow step in 2026-Q1 |
| 2025 holiday cohort | Customers acquired Nov–Dec 2025 |
Use cohorts when you want to track a group over time — retention analytics, LTV-by-acquisition-month, win-back effectiveness. Use segments when you want to target customers who currently match a rule.
The two cooperate: a cohort like "March 2026 first-orderers" combined with a segment like "still active" gives you "March 2026 acquisitions who are still active" — your retention narrative.
Membership semantics — the fine print
- A customer can be in many segments simultaneously. Don't worry about overlap.
- Joining or leaving a segment doesn't trigger anything by itself. Journeys subscribe to the event that caused the join, not the membership change. (This avoids loops where recomputing the segment fires the journey fires another event fires another recompute.)
- Membership is eventually consistent. P95 lag from event to membership change is under 5 seconds; the rare exception is during heavy backfills, which surface in the audit log.
Real merchant scenarios
Scenario A — Founder-led store, 5 segments
Setup. New merchant, 800 customers, free tier. Builds five segments: cart abandoners, first-time buyers, second-time buyers, 30-day silent, opted-in to WhatsApp.
90 days later.
| Segment | Members | Used by | Notes |
|---|---|---|---|
| Cart abandoners 24h | ~25 (rolling) | Cart-recovery flow | Drives 11% of recovered revenue |
| First-time buyers | All-time + last-90d filter | Post-purchase upsell | 7-day re-buy rate up 3.2× |
| Second-time buyers | Pool of returning customers | Loyalty seeding flow | First step toward loyal tier |
| 30-day silent | Wax-and-wane based on cadence | Win-back | Recovers 4-5 customers/week |
| WhatsApp opt-in | ~180 of 800 | Flash offers | Replaced 80% of email blasts |
Total time spent maintaining segments: ~0 hours. They maintain themselves.
Scenario B — Mid-market brand, 50K customers, 60+ segments
Pain point. Marketing manager spent ~8 hours/week building audience CSVs in Klaviyo and exporting them to Meta. Three of the ten weekly campaigns were "the list nobody had time to refine".
After. All 60 segments live in the platform, exported daily to Meta Custom Audiences via the ad audience sync. Marketing time shifts from list-building to creative + offer testing.
| Metric | Before | After |
|---|---|---|
| Hours/week on segments | 8 | < 1 (review only) |
| Campaigns sent to "any list" | 3/week | 0/week |
| Avg open rate | 18% | 27% (tighter targeting) |
| Avg conversion per send | 1.4% | 2.1% |
| Meta lookalike performance | 2.1× ROAS | 2.9× ROAS (cleaner seed audience) |
Scenario C — Agency managing 12 brands
Setup. The agency builds a segment library — a set of 30 template segments (cart abandoners, win-back candidates, loyal at-risk, etc.) cloned into each new client account on day one.
Why it matters. Onboarding a new client used to take a week of segment-building. Now it's an hour. The agency can charge flat-fee for that hour and keep the rest as margin.
The roll-up dashboard shows segment-coverage health across all 12 brands — flags when a client's segments aren't growing (deliverability problem, pixel broken) or shrinking too fast (churn spike).
Best practices
✅ Lead with lifecycle stages. lifecycleStage = 'loyal' is
already a dynamic, multi-signal rule. Start there before building
custom thresholds.
✅ Preview the count before saving. The rule builder shows the live count as you type. If it's 0 or unexpectedly massive, fix the rule before it becomes a campaign audience.
✅ Use cohorts for retention math, segments for targeting. A common mistake is to build a "March 2026 first-orderers" as a dynamic segment — the membership shifts as customers buy again and the cohort dissolves. Use a cohort instead.
✅ Tag once, segment often. Add a free-form tag like vip
or b2b to important customers, then use it in multiple segments
(tags contains 'vip'). One source of truth, many audiences.
❌ Don't pile every condition into one segment. If your rule has 9 conditions, you're really building an audience matrix — better to split into 3 segments at lifecycle level + 3 at LTV level, then combine in the campaign or journey logic.
❌ Don't use full-text search in rules. "Body contains 'X'" forces a full table scan and slows recomputes. If you need it, add it as a tag instead and segment on the tag.
❌ Don't manually edit dynamic segment membership. It will get overwritten on the next recompute. If you want a fixed list, make it a static segment.
Plan tiers
| Capability | Free | Starter | Pro | Agency | Enterprise |
|---|---|---|---|---|---|
| Static segments | 5 | 25 | 100 | unlimited | unlimited |
| Dynamic segments | 5 | 25 | 100 | unlimited | unlimited |
| Members per segment | 1,000 | 10,000 | unlimited | unlimited | unlimited |
| AI-generated segments | — | — | ✓ | ✓ | ✓ |
| Cohort definitions | — | 5 | 25 | 100 | unlimited |
| Segment library / cloning | — | — | — | ✓ | ✓ |
| Real-time membership updates | ✓ | ✓ | ✓ | ✓ | ✓ |
| Daily Meta/Google ad-audience sync | — | — | ✓ | ✓ | ✓ |
| Custom recompute schedule | — | — | — | ✓ | ✓ |
Hitting a cap blocks creating new segments; existing segments keep working. The merchant sees a clear upgrade prompt with the size of the audiences that would be unlocked.
Frequently asked
My segment is empty — what's wrong?
Usually the rule is too restrictive (an AND condition nobody
satisfies). The rule builder shows the live count as you edit;
if it's 0 at save, look for AND conditions that contradict
each other or use a value no customer has.
Why is recompute slow on this one segment?
Almost always a full-table-scan operator like body contains '<long string>'. Move that match to a tag in the customer
profile and segment on the tag instead — instant.
Can I exclude customers from a segment?
Yes — use NOT in the rule, or use the campaign-level "exclude
audience" filter when sending. The latter is non-destructive
(the segment stays correct).
Do segments respect opt-out? Yes, automatically. The segment membership doesn't change, but the campaign send-time gauntlet (described in Customer 360) filters out anyone who's opted out of the campaign's channel.
Can I time-box a segment?
Use a cohort if you want a fixed snapshot. Use a dynamic segment
with a within X days clause if you want a rolling window.
What happens during a backfill? Membership is eventually consistent — during a heavy backfill (e.g. you imported 50K Shopify customers), recompute can lag by minutes. The audit log shows backfill events; campaigns started during a backfill are queued until consistent.
See also
- Customer 360 — the source of truth segments read from
- Campaigns — pick a segment as the audience
- Journeys & automations — flow enrolment by segment membership
- Attribution & revenue — segment- level revenue attribution
- Sales engine overview