Skip to main content
IntermediateContacts and Data

Segments and Filters

Build dynamic and static contact segments in NimbusOS with filter conditions, reversible operations, and automatic membership refresh for campaigns and reports.

9 min read
Updated April 23, 2026
1,900 words

A segment in NimbusOS is a saved query over the contact database. Dynamic segments auto-update as contacts change. Static segments freeze a set of contacts. Both are queryable across the platform for campaign targeting, analytics, and reports. Every segment operation is reversible because the SegmentOperationLog records before and after state on every edit. This article covers the segment model, the filter builder, the dynamic versus static choice, and the operational patterns you will use.

Dynamic vs Static

Dynamic segments are a live query. Membership updates automatically as contacts gain tags, update fields, receive enrichment, or change score.

Static segments are a frozen list. Membership is set at creation time and only changes with explicit add or remove actions.

When to use dynamic: any segment tied to contact attributes you expect to change. "Tier A contacts who opened in the last 30 days" is dynamic. "Contacts whose lead score is over 70" is dynamic.

When to use static: any segment that represents a fixed audience. "Prospects sourced from the March 2026 Apollo export" is static because you do not want new Apollo contacts showing up in it later. "Contacts imported from the conference attendee list" is static.

You cannot convert a static segment to dynamic in place. You can export the contacts and recreate as dynamic.

The Filter Builder

Dynamic segments are defined by filter conditions stored as JSON on the Segment row. The builder supports:

Field conditions. Any contact or company field. Operators: equals, not equals, contains, does not contain, starts with, ends with, greater than, less than, is empty, is not empty, matches regex.

Tag conditions. Has tag, does not have tag, has all of tags, has any of tags.

Engagement conditions. Opened in last N days, clicked in last N days, replied in last N days, never opened, never clicked, last engagement older than N days.

Score conditions. Lead score greater than, lead score less than, ICP tier equals, grade equals.

Segment conditions. Is in segment, is not in segment. Useful for building segments that reference other segments.

Custom field conditions. Any custom field with any operator appropriate for its type.

Date conditions. Created after, created before, updated in last N days.

Conditions combine with AND, OR, and NOT. Parentheses supported for complex groupings.

Building a Practical Segment

A segment for a first outreach campaign usually looks like this.

Rule 1 (AND). icp_tier in ['A', 'B'].

Rule 2 (AND). grade in ['A', 'B', 'C'].

Rule 3 (AND). has_tag('verified_email').

Rule 4 (AND). not in_segment('currently_in_campaign').

Rule 5 (AND). engagement_last_30_days == 0 (never engaged in 30 days, so not on a cooldown).

The segment's live count shows as you build. If the count is zero, one of the rules is filtering too aggressively. If the count is in the millions, the rules are too loose and you will probably be launching to a dirty list.

Reversibility

Every segment operation writes a SegmentOperationLog row with before state, after state, user, timestamp, and reason. Operations include:

  • Create segment
  • Update filter conditions
  • Add static members
  • Remove static members
  • Rename
  • Archive
  • Delete

From the segment detail page, Operation History lists every change. Each entry has a Reverse button. Reversing an operation restores the before state.

This is how the platform protects against the "I just accidentally removed 5000 contacts from the segment" mistake. You can always get back.

Irreversible operations are explicitly marked: segment deletion past the 30 day retention window, and any segment that was used as a campaign target after the edit (because the campaign already ran against the edited state).

Membership Evaluation

Dynamic segments are evaluated lazily. When you open the segment, membership is computed by running the filter query. When a campaign enrolls from the segment, membership is computed at enrollment time.

Two implications.

First, segment count shown in the dashboard is a snapshot. It is current at view time. It could change by the time you launch the campaign.

Second, performance of a segment query depends on the number of conditions and the selectivity. Most segments complete in under 100 ms. Segments with complex regex or across millions of contacts can take longer; the platform caches results for 30 seconds.

Using Segments in Campaigns

A campaign can target one or more segments. Multi-segment targeting is OR: a contact in any of the selected segments is included.

You can combine segment targeting with additional campaign-level filters. Segment A AND icp_tier == 'A' narrows the segment further without editing the segment itself.

Using Segments in Automation

Segments power automation rules. The on_enter_segment trigger fires when a contact becomes a segment member. The on_exit_segment trigger fires when a contact leaves.

A common automation: on_enter_segment('demo_scheduled') triggers a Slack notification to the sales team and creates a task for the rep. No code required.

Using Segments in Reports

Custom reports accept a segment filter. A weekly "tier A contacts who engaged in the last 7 days" report is a segment plus a report template. The ScheduledReport fires on cadence and emails the CSV.

Segment Folders and Organization

A workspace with 50 segments needs organization. The Segment folders feature lets you group segments into folders like "Campaign segments", "Reporting segments", "Internal audit". Folders are organizational only; they do not affect segment behavior.

Favorites pin a segment to the top of the list. Colors tag a segment with a visual indicator. Active/inactive flag hides an archived segment from the default view.

Segment Exports

Any segment can be exported as CSV from the detail page. The export contains every field and custom field for every current member. Export size scales with the segment; a segment of 100k contacts produces a roughly 40 MB CSV.

Exports are generated asynchronously. The download link arrives in the workspace activity feed when ready.

Static Segment Management

Static segments need explicit member management.

Add contacts. From a contact list view, select contacts and use Bulk Add to Segment. Up to 10k per operation.

Remove contacts. Same pattern with Bulk Remove.

Clone membership. Copy the current membership of a dynamic segment into a new static segment. Useful when you want to freeze the set right before a campaign launches.

Nested Segments

A segment can reference another segment in its filter conditions (is in segment X). This is how you build complex audiences from simpler building blocks.

For example:

  • Base segment: tier_a_contacts -> icp_tier == 'A'
  • Derived segment: tier_a_engaged -> is in tier_a_contacts AND opened_in_last_30_days > 0
  • Derived segment: tier_a_engaged_us -> is in tier_a_engaged AND country == 'US'

Nesting is unlimited in depth. Deep nesting can affect evaluation time, so keep chains under 5 levels for best performance.

Troubleshooting

"Segment count says 0 but I have contacts matching the conditions"

Field names are case sensitive. icp_tier == 'a' does not match a contact whose icp_tier is 'A'. Double check casing.

Also check that you did not accidentally include a condition that is always false, like lead_score > 100.

"Segment membership is flickering"

A contact is near the threshold for a condition. A contact whose score is 69 with a condition of lead_score >= 70 will flicker in and out as score changes by a point or two. Loosen the threshold or remove the condition if flickering is causing noise.

"Campaign enrolled fewer contacts than the segment count"

Two likely causes. First, the campaign has its own filter that further narrows the segment. Second, suppression matched some contacts out at enrollment time. Check the campaign's enrollment log for the drop-off reason per contact.

Frequently Asked Questions

Can I share a segment with another workspace?

Not directly. Each segment is workspace-scoped. For agencies, you can export the filter conditions as JSON and rebuild the segment in another workspace.

What is the maximum contact count in a segment?

No hard limit. The platform handles segments of millions. Evaluation time scales roughly linearly with contact count and inversely with how selective the filter is.

Does archiving a segment affect campaigns using it?

Yes. Campaigns targeting an archived segment stop enrolling new contacts. Contacts already enrolled continue. You will see a warning banner on any campaign using an archived segment.

Can two segments have the same name?

Yes within different folders. Uniqueness is scoped to the folder. Without folders, names are unique across the workspace.

Useful next pages after this one: Contact Management for the underlying contact model, Data Enrichment for filling in the fields segments query against, and Campaign Types for how segments feed into campaign configuration.

Related articles

Still stuck?

Our team answers every support ticket. If the answer is not in the docs, open a ticket and we will write the missing page.