Rule operators
Last updated: October 16, 2026
Every operator available in the rule builder — what it does, what kind of value to put on the right side, and a working example for each.
What's covered
This catalogs every operator you can choose in the rule builder when you're creating a policy rule or a form-level condition. It does not cover:
The
And/Orgrouping that combines multiple conditions — see 📄 Understanding policies for that.The facts (left side of a condition) you can build rules against — those depend on your account's standard fields, custom attributes, and connected entities. The rule builder shows what's available as you type.
About the facts in these examples. Most placement-level data on a typical Onboarded account lives under placement.custom_attributes.* rather than as top-level placement fields. The examples below use realistic paths: top-level fields when they exist (client.name, job.name, job.address.state, employee.date_of_birth) and placement.custom_attributes.* for everything else.
The operator dropdown shows every operator regardless of the fact you've selected. The rule builder won't stop you from pairing an operator with a fact type that doesn't make sense (e.g., less than on a text field). Most mismatched pairings evaluate to false and the condition never matches — but that isn't universal. The negative operators is not, is not in, and does not contain return true when the fact is missing, so a rule you expected to sit quiet can match instead. Use the tables below to pair operators with the right kinds of facts, and check the If the fact is missing column on the equality, membership, and list membership tables before you rely on a negative condition.
Equality
Use these on any single-value fact — text, number, date, or a single-select option.
Operator | What it does | Input | Example | If the fact is missing |
|---|---|---|---|---|
| Matches when the fact exactly equals the value. | Single value of the same type as the fact. |
| false |
| Matches when the fact does not equal the value. | Single value of the same type as the fact. |
| true |
A fact is missing when the record has no value stored for it — an unpopulated custom attribute, or an address that was never saved. is returns false against a missing fact; is not returns true.
Comparison
Use these on facts that are numbers or dates. Comparing strings with these operators is generally not what you want — string comparison is alphabetical, not what most rules need.
Operator | What it does | Input | Example |
|---|---|---|---|
| Matches when the fact is strictly less than the value. | A number or date. |
|
| Matches when the fact is less than or equal to the value. | A number or date. |
|
| Matches when the fact is strictly greater than the value. | A number or date. |
|
| Matches when the fact is greater than or equal to the value. | A number or date. |
|
Membership
Use these when the fact is a single value and you want to check whether it's one of several acceptable values — for example, "any of these states" or "any of these client names." Enter the values as a comma-separated list.
Operator | What it does | Input | Example | If the fact is missing |
|---|---|---|---|---|
| Matches when the fact is one of the listed values. | Comma-separated list of values. |
| false |
| Matches when the fact is not one of the listed values. | Comma-separated list of values. |
| true |
The asymmetry matters most here. A record with no stored value for the fact falls out of an is in condition, and falls into an is not in condition. A rule reading employee.address.state is not in CA, NY matches an employee with no address at all. If you need a negative condition, pair it with a second condition requiring the fact to exist.
List membership
Use these when the fact itself is a list — typically a multi-select field — and you want to check whether a particular value sits inside it.
Don't confuse contains with is in. They look similar but flip which side is the list. is in: the value is a list, the fact is a single value. contains: the fact is a list, the value is a single value to look for inside it.
Operator | What it does | Input | Example | If the fact is missing |
|---|---|---|---|---|
| Matches when the fact (a list) includes the value. | Single value to look for inside the fact. |
| false |
| Matches when the fact (a list) does not include the value. | Single value. |
| true |
Same shape as is in / is not in: an unpopulated multi-select never satisfies contains, and always satisfies does not contain.
Text matching and case
Text comparisons match case exactly unless you tell them otherwise. Spanish, spanish, and SPANISH are three different values to a rule, so a condition reading employee.custom_attributes.language_preference is Spanish skips a record that stores spanish.
The Aa button on the right side of the value input controls this. It starts selected, which means the comparison matches case. Click it once and the comparison ignores case instead. Hovering over the button tells you which state the condition is currently in.
The toggle appears only on the operators that compare text — is, is not, is in, is not in, contains, and does not contain. The comparison operators in the table above don't show it, since numbers and dates have no case.
Ignoring case also widens what counts as a match on true/false values. With the toggle off, a fact stored as TRUE or True matches a value of true. That's usually what you want for data arriving from CSV imports and upstream dropdowns, but it means a condition can start matching records it skipped before — confirm the new behavior on a test record before you rely on it.
Rules you built before this toggle existed keep matching case exactly. Nothing changes on an existing condition until you turn case matching off yourself.
Spaces count too. A text value has to match character for character, including spaces at the start or end. A condition reading employee.first_name is "Justin " — with a trailing space — skips an employee whose first name is stored as Justin. The Aa toggle doesn't help here, since it only changes how capitalization is compared.
A stray space can sit on either side of a condition: in the value you typed into the rule, or in the data that arrived from your ATS. For is in and is not in, the rule builder trims the spaces around each comma-separated value, but the fact is still compared exactly as it's stored. Numbers and true/false values aren't affected — 124 still matches 124. If a condition matches some records and not others, check both sides for extra spaces.
Related
📄 Understanding policies (Concept) — where operators sit in the bigger picture
📄 How do I build a policy? (How-to) — walks through using these operators in practice
📄 How do I fix a state-specific form that isn't being assigned? (How-to) — what happens when a rule runs against a fact that isn't there