/crm/segments).

Two segment types
| Type | How members are added | When to use |
|---|---|---|
| Static | Manually (addCustomers) or via the add-to-segment node | Fixed lists: “Q1 batch”, “Cooldown — Mar 2026” |
| Dynamic | Auto-filtered by rules | ”Customers tagged hot-lead in VN” |
Create a segment
(Dynamic) Rule builder
AND/OR groups of predicates:
- Tag contains / not contains
- Company in list
- Has / has no inbound since date X
- Fit score per product > N
- Country / language
- Owner = user
- Currently in / never in another segment
Segment detail page
/crm/segments/:id:
- Members
- Settings
- Used by
Customer table for the segment. Actions:
- Add customers (static) — pick from the contact book
- Remove (static) — remove manually
- Recompute (dynamic) — force a recompute now
- Bulk actions — claim/tag/start campaign…
Service operations
| Operation | Use case |
|---|---|
resolveCustomerIds | Returns the ID list — used by automation to enroll |
listCustomers | UI table — paginated with filters |
addCustomers(segmentId, ids) | Bulk add (static only) |
removeCustomers(segmentId, ids) | Bulk remove (static only) |
upsertManyByName(orgId, names) | Idempotent — creates a segment if missing. Used by CSV import and automation. |
Dynamic recompute
Dynamic segments don’t store membership. Each list/resolve call:- Queries the DB by the rules
- Caches results for 60s
Special segments
Cooldown segment
Cooldown segment
A static segment holding customers who aren’t ready — populated by the Exit — Cooldown node. Convention: name it
Cooldown — <reason>.Campaign exclusion
Campaign exclusion
A static segment “Already ran campaign X” — campaign Y excludes this segment in its audience filter to prevent double-sends.
Suppression mirror
Suppression mirror
A dynamic auto-segment: “Customer has at least one suppressed contact”. Used for audit visibility.
API & exports
Segment endpoints return the audience list, used by:- The campaign builder (pick a segment as the audience)
- CSV export of segment members
- Outbound webhook events
segment.joined/segment.left