--- title: Segments description: Create dynamic audience groups with filters --- ## What are segments Segments are dynamic groups of contacts based on filter conditions. Unlike static lists, segments automatically update as contact data changes. Use segments to: - Target specific audiences in campaigns - Trigger workflows when contacts enter/exit - Analyze cohorts and user behavior - Personalize communications ## Creating segments ### In the dashboard 1. Go to **Segments** 2. Click **Create Segment** 3. Name your segment 4. Add filter conditions 5. Enable membership tracking (optional) 6. Save ### Via API ```bash curl -X POST {{API_URL}}/segments \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "Active Premium Users", "filters": { "operator": "AND", "conditions": [ { "field": "data.plan", "operator": "equals", "value": "premium" }, { "field": "subscribed", "operator": "equals", "value": true } ] } }' ``` ## Filter conditions Combine conditions with `AND` or `OR` operators to build precise segments. ### Available operators **Equality** - `equals` — Exact match - `notEquals` — Does not match **Text** - `contains` — String includes value - `notContains` — String excludes value **Numeric/Date** - `greaterThan` — Larger than value - `lessThan` — Smaller than value - `greaterThanOrEquals` — At least value - `lessThanOrEquals` — At most value **Arrays** - `in` — Value in array - `notIn` — Value not in array **Existence** - `exists` — Field has a value - `notExists` — Field is missing or null ### Field paths Access contact fields with dot notation: - `email` — Contact email address - `subscribed` — Subscription status - `createdAt` — When contact was created - `data.firstName` — Custom field - `data.preferences.newsletter` — Nested field - `data.lastPurchaseDate` — Custom date field ## Example segments ### Premium subscribers All contacts on premium plan who are subscribed: ```json { "operator": "AND", "conditions": [ { "field": "data.plan", "operator": "equals", "value": "premium" }, { "field": "subscribed", "operator": "equals", "value": true } ] } ``` ### Recent signups Contacts who joined in the last 7 days: ```json { "operator": "AND", "conditions": [ { "field": "createdAt", "operator": "greaterThan", "value": "{{now - 7 days}}" } ] } ``` ### Inactive users Users who haven't logged in for 30+ days: ```json { "operator": "AND", "conditions": [ { "field": "data.lastLoginAt", "operator": "lessThan", "value": "{{now - 30 days}}" }, { "field": "data.lastLoginAt", "operator": "exists", "value": true } ] } ``` ### High-value customers Total spending over $1000: ```json { "operator": "AND", "conditions": [ { "field": "data.totalSpent", "operator": "greaterThanOrEquals", "value": 1000 }, { "field": "subscribed", "operator": "equals", "value": true } ] } ``` ### Free tier churned users Users who downgraded from paid to free: ```json { "operator": "AND", "conditions": [ { "field": "data.plan", "operator": "equals", "value": "free" }, { "field": "data.previousPlan", "operator": "in", "value": ["pro", "premium"] }, { "field": "data.downgradedAt", "operator": "exists", "value": true } ] } ``` ## Membership tracking When you enable `trackMembership`: **What happens:** - Plunk computes and stores segment membership - When contacts enter, sends `segment.entered` event - When contacts exit, sends `segment.exited` event - Provides historical membership data **Use when:** - You want to trigger workflows on entry/exit - You need to track cohort changes over time - Segment is relatively stable (not millions of changes per day) **Disable when:** - Segment changes very frequently - You only need current membership (not history) - You have millions of contacts and want to save storage ### Using entry/exit events With membership tracking enabled, use segment events to trigger workflows: ```json { "triggerType": "SEGMENT_ENTRY", "triggerConfig": { "segmentId": "high-value-customers" } } ``` Or use the generic event trigger: ```json { "triggerType": "EVENT", "triggerConfig": { "eventName": "segment.entered" } } ``` Event data includes: ```json { "segmentId": "seg_abc123", "segmentName": "High Value Customers" } ``` ## Using segments ### In campaigns Send a campaign to a segment: ```bash curl -X POST {{API_URL}}/campaigns \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "Premium Feature Announcement", "audienceType": "SEGMENT", "segmentId": "premium-users", "templateId": "feature-announcement" }' ``` ### In workflows Trigger workflows when contacts enter a segment: ```bash curl -X POST {{API_URL}}/workflows \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "VIP Welcome", "triggerType": "SEGMENT_ENTRY", "triggerConfig": { "segmentId": "high-value-customers" } }' ``` ## Managing segments ### Get segment with count ```bash curl -X GET {{API_URL}}/segments/segment_id \ -H "Authorization: Bearer sk_your_secret_key" ``` Returns member count: ```json { "id": "segment_id", "name": "Premium Users", "memberCount": 1542, "filters": {...} } ``` ### List segment members ```bash curl -X GET "{{API_URL}}/segments/segment_id/contacts?limit=50" \ -H "Authorization: Bearer sk_your_secret_key" ``` ### Update segment ```bash curl -X PATCH {{API_URL}}/segments/segment_id \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "Updated name", "filters": { "operator": "AND", "conditions": [...] } }' ``` When you update filters, membership is recomputed automatically. ### Delete segment ```bash curl -X DELETE {{API_URL}}/segments/segment_id \ -H "Authorization: Bearer sk_your_secret_key" ``` Active campaigns and workflows using this segment will stop working. ## Best practices **Start broad, then narrow** — Create general segments first, then add specific conditions. **Test your filters** — Preview segment size before using in campaigns to avoid sending to wrong audience. **Name clearly** — Use descriptive names: "Q4 2024 Premium Signups" not "Segment 3". **Avoid overlapping segments** — If using in workflows, ensure segments don't overlap to prevent duplicate emails. **Use for analysis** — Create segments to understand user cohorts, even if not used in campaigns. **Combine with events** — Track events and use them in segment conditions for behavior-based targeting. ## What's next - [Build campaigns](/guides/campaigns) to send to segments - [Create workflows](/guides/workflows) triggered by segment entry - [Track events](/guides/events) to use in segment filters