# Operators & Fields

Available fields and comparison operators for segment rules.

Each segment rule is made up of three parts: a **field** (the piece of
contact data to test), an **operator** (how to compare it), and a
**value** (what to compare it against). This reference lists every field
and operator available in SendBeam. The same fields and operators are accepted by the
segments [API](https://sendbeam.io/docs/api), and previews and sends evaluate them identically.

## Available fields

SendBeam exposes the following fields for use in segment rules.

| Field | Type | Description |
| --- | --- | --- |
| `email` | Text | The contact's email address |
| `first_name` | Text | The contact's first name |
| `last_name` | Text | The contact's last name |
| `status` | Text | Contact status: `subscribed`, `unsubscribed`, `bounced` or `complained` |
| `source` | Text | How the contact was added: `manual`, `import`, `form` or `api` |
| `language` | Text | The language the contact reads in, as a two-letter code (`fr`). *is empty* finds contacts with no language |
| `created_at` | Date | The date and time the contact was added to the workspace |
| `tag` | Whether the contact carries a tag. Use with *has tag* / *does not have tag* and pick the tag (the API takes the tag id as the value). |  |
| `campaign` | Engagement | What the contact did with one sent campaign. Use with *opened*, *received but did not open*, *clicked a link in* or *received but did not click* and pick the campaign (the API takes the campaign id as the value). The "did not" forms only match people the campaign actually reached — never people it was not sent to. |
| `activity` | Engagement | Any open or click on any email from this workspace — campaigns, automations and transactional — in the last *N* days (1–365). *Opened nothing in the last 90 days* is the usual re-engagement or list-pruning segment. |
| `custom_fields.` | Text | Any custom field stored on the contact, for example `custom_fields.country` |

> In the segment form, choose **Custom field…** and type the key (for example `country`); through the API, pass the field as `custom_fields.country`. A custom field registered as a **Number** is compared numerically, so "greater than 9" correctly excludes 10. A field with no registered type is compared as text, where "greater than" is alphabetical — register the field as a Number if you want it to sort like one.
> 

## Available operators

Most operators work with most fields, but not every pairing is valid: the
`tag` field takes only **has tag** and **does not have tag**,
and `campaign` takes only **opened** and **clicked**. A rule
that pairs them wrongly is refused with a `400` rather than quietly ignored.
The table below lists them with the name shown
in the segment form and the value used in the API.

| Operator | API value | Description |
| --- | --- | --- |
| **equals** | `equals` (or `is`) | Field value matches the given value exactly, ignoring case |
| **does not equal** | `not_equals` (or `is_not`) | Field value does not match the given value |
| **contains** | `contains` | Field value includes the given text anywhere within it (case-insensitive) |
| **does not contain** | `not_contains` | Field value does not include the given text (case-insensitive) |
| **starts with** | `starts_with` | Field value begins with the given text (case-insensitive) |
| **ends with** | `ends_with` | Field value ends with the given text (case-insensitive) |
| **is empty** | `is_empty` | The field is empty or has never been given a value for this contact (no value needed) |
| **is not empty** | `is_not_empty` | The field has a non-empty value for this contact (no value needed) |
| **is after / greater than** | `greater_than` | The field is later than the given date, or sorts after the given value |
| **is before / less than** | `less_than` | The field is earlier than the given date, or sorts before the given value |
| **has tag** | `has_tag` | The contact carries the chosen tag (field `tag` only) |
| **does not have tag** | `not_has_tag` | The contact does not carry the chosen tag (field `tag` only) |
| **opened** / **clicked a link in** | `opened` / `clicked` | The contact opened, or clicked a link in, the chosen campaign (field `campaign` only). A click counts as an open. |
| `not_opened` / `not_clicked` | received but did not open / click | The campaign reached the contact and they have not opened it, or not clicked in it (field `campaign` only). Bounced and complained recipients are excluded. |
| `opened_within` / `clicked_within` | opened / clicked any email in the last N days | At least one open, or one click, on any email from this workspace in the window (field `activity` only) |
| `not_opened_within` / `not_clicked_within` | opened / clicked nothing in the last N days | Every contact without an open, or a click, in the window — including contacts who were sent nothing (field `activity` only) |

> The **is empty** / **is not empty** operators are especially useful for finding contacts with incomplete profile data, such as those missing a first name or a custom field value. Use them to run data-cleaning campaigns before major sends.
> 

## Example rules

The table below shows practical examples of rules you might use when building segments
in SendBeam.

| Goal | Field | Operator | Value |
| --- | --- | --- | --- |
| All subscribed contacts | `status` | equals | `subscribed` |
| Contacts from the UK | `custom_fields.country` | equals | `United Kingdom` |
| Signed up this year | `created_at` | is after / greater than | `2026-01-01` |
| Came in through a form | `source` | equals | `form` |
| Everyone at one company | `email` | ends with | `@acme.com` |
| Missing first name | `first_name` | is empty | — |
| On the Pro plan | `custom_fields.plan` | equals | `pro` |

> **equals** and **does not equal** ignore case, like **contains**, **starts with** and **ends with** — so *Gold* and *gold* are the same value. Leading and trailing whitespace is still significant, so if a rule is not matching contacts you expect, check the stored value's spacing.
>

---
Source: https://sendbeam.io/docs/segments/operators
