Segments
A segment is a filter you apply to your subscriber base at send time. Instead of broadcasting to everyone, you target the people most likely to care — premium customers, dormant trialists, US-only audiences for a US-only deal.
What a segment is
Conceptually, a segment is a WHERE clause over your subscribers. When a campaign or automation runs, ReachBell evaluates the segment against the current state of the subscriber table and dispatches only to the matches.
There are two ways to use them:
- Inline — built right inside a campaign, used once.
- Saved — built once in the Segments page, reused across many campaigns and automations.
Filter fields
Every segment is a combination of filters on these fields:
| Field | Type | Example |
|---|---|---|
platform | enum | desktop, mobile, tablet |
country | ISO 3166-1 alpha-2 | US, DE, JP |
city | string | San Francisco |
device | string | iPhone, Pixel 8 |
browser | enum | Chrome, Safari, Firefox, Edge |
os | enum | macOS, Windows, iOS, Android |
language | BCP 47 | en-US, pt-BR |
tags | array of string | premium, newsletter |
lastSeenDays | integer | 7 (subscribers seen in the last 7 days) |
emailStatus | enum | verified, bounced, complained, none |
subscriptionDate | range | from: 2026-01-01, to: 2026-06-30 |
A segment can mix any number of these. They're combined with AND — all filters must match for a subscriber to be in the segment.
Saved segments
Create a saved segment once in Audience → Segments → New segment:
- Name it descriptively.
"US-premium-active-30d"ages better than"segment 4". - Add filters. The reach estimate updates live as you go.
- Save.
Then reference it by ID in campaigns:
{
"segment": { "savedSegmentId": "seg_01HX7..." }
}
Saved segments are re-evaluated at send time, not at save time. A "trial users" segment will pick up newly added trialists automatically — you don't refresh it.
Live reach estimate
As you build a segment in the dashboard, a counter shows the current number of matching subscribers — "2,341 of 14,823 subscribers match". The estimate is exact (it's a real query, not a sample) but cached for 30 seconds to keep the UI responsive.
This is the single most important feedback while building a segment. If your reach drops to zero, a filter is wrong. If your reach hardly moves, your filter is probably redundant.
Tags
Tags are the freeform half of segmentation. Every field above is derived from the subscriber's device and behavior — country, browser, OS. Tags are whatever you want them to be: lifecycle stage, product interest, behavior, A/B cohort.
Apply tags from the SDK:
ReachBell.tag(['premium', 'newsletter']);
Or from your backend:
curl -X POST https://api.reachbell.com/subscribers/tag \
-H "x-api-key: rb_live_yourkey" \
-H "Content-Type: application/json" \
-d '{ "token": "tok_01HX3...", "tags": ["premium"] }'
Once applied, a tag is a filter you can use in any segment.
Dynamic vs static segments
ReachBell only supports dynamic segments. Every segment is a filter that's re-run at send time against the current subscriber table. There's no "freeze this list and send to exactly these 14,823 people in three days" workflow — by design, because frozen lists go stale fast.
If you genuinely need a frozen list (e.g. a regulatory campaign that must hit exactly the cohort that opted in by a given date), use a tag: tag the cohort, then filter on the tag. The tag is mutable but you control when it's applied.
CSV export
GET /segments/project/:projectId/export.csv?segmentId=seg_01HX7...
Streams a CSV of every subscriber currently matching the segment. Useful for spreadsheet analysis, deduping against a third-party list, or one-off cross-channel imports.
curl "https://api.reachbell.com/segments/project/proj_01HX2.../export.csv?segmentId=seg_01HX7..." \
-H "x-api-key: rb_live_yourkey" \
-o segment.csv
The CSV includes externalId, token, email, country, platform, tags, subscribedAt, and lastSeenAt.
Best practices
Even one filter helps. Splitting purchasers from browsers and sending to each separately typically lifts CTR 30–50%. You don't need a clever 8-filter rule to see gains.
Filter on lastSeenDays before every send. A subscriber who hasn't visited your site in 180 days is dead weight on your stats. Default your campaigns to lastSeenDays <= 90.
Keep tags short and consistent. premium is fine; Premium Customer Tier 2 (Quarterly Plan) is not — it makes filter building painful and Quirky tag drift over time means your segments stop matching anyone.
Name segments by what they mean, not how they're built. "US-engaged-30d" reads better in a list than "country=US AND lastSeenDays<=30".
Avoid the temptation to over-segment. Twenty hyper-specific segments are harder to maintain than five big ones, and the marginal CTR gain past the third filter is usually noise.
What's planned
A visual rule composer with nested AND/OR groups is on the roadmap. Today the dashboard ANDs every filter; the next iteration will let you express "(US OR Canada) AND (premium OR trial expiring in 7d)" without writing JSON.
A worked example
You're running a flash sale targeted at engaged US-based premium customers. You build a segment with:
country = UStags includes "premium"lastSeenDays <= 30platform = desktop OR mobile(excluding tablet)
The reach estimate reads "2,341 of 14,823 subscribers match" — about 16% of your base. You save it as us-premium-engaged-30d.
Then in your campaign you reference it:
{
"segment": { "savedSegmentId": "seg_us_premium_engaged_30d" }
}
A week later you re-use the same segment for an upsell campaign. The reach has shifted to 2,490 — new premium customers since the original save are automatically included, churned ones are automatically excluded. No maintenance.
What's next?
- Use a saved segment in the Campaigns API.
- Branch on tags inside Automations.
- Run an A/B test inside a segment to compare copy on the right audience.