ReachBellDocs

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:

FieldTypeExample
platformenumdesktop, mobile, tablet
countryISO 3166-1 alpha-2US, DE, JP
citystringSan Francisco
devicestringiPhone, Pixel 8
browserenumChrome, Safari, Firefox, Edge
osenummacOS, Windows, iOS, Android
languageBCP 47en-US, pt-BR
tagsarray of stringpremium, newsletter
lastSeenDaysinteger7 (subscribers seen in the last 7 days)
emailStatusenumverified, bounced, complained, none
subscriptionDaterangefrom: 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:

  1. Name it descriptively. "US-premium-active-30d" ages better than "segment 4".
  2. Add filters. The reach estimate updates live as you go.
  3. 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 = US
  • tags includes "premium"
  • lastSeenDays <= 30
  • platform = 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?