Reference · Tools
Filter node
Passes data items through the workflow only if they meet specified criteria, dropping those that do not.
The Filter node evaluates each incoming data item against conditions you define and routes only the matches forward — for example, keeping only orders where status equals 'active' or amount exceeds a threshold. Items that don't match are dropped from the execution path entirely. Use it any time you need to narrow a dataset before the next step in your workflow.
- Works as
- Action
- Tool name
filter- Parameters
- 4
- Outputs
- Matched, Unmatched, Error
- Credentials
- None required
What you can build with Filter
- Filter only active users.
- Keep items where status is complete.
- Remove entries without email addresses.
- Select only orders over $100.
- Find records from last week.
Overview
Selectively passes data items through the workflow based on specific criteria. Items that do not meet the filter conditions are dropped from the execution path.
Node Type
Action — processes input items and produces output
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Matched, Unmatched, Error |
Credentials
This tool does not require any credentials.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Combine Conditions | options | Yes | and | How to combine multiple filter conditions. AND requires all conditions to pass; OR requires at least one. |
Options: and, or | ||||
| Conditions | fixedCollection | Yes | {} | Define the filter conditions. Each condition specifies a field, data type, operation, and comparison value. |
| — Field | string | Yes | — | The field path to evaluate (e.g., ‘status’, ‘user.email’, ‘items[0].name’). Supports expressions like {{ $json.fieldName }}. |
| — Data Type | options | Yes | string | The data type of the field. This determines which operations are available. |
Options: string, number, boolean, date, array, object | ||||
— Operation (operation) | options | Yes | equals | The comparison operation to perform on the string field. (shown when Data Type is string) |
Options: equals, notEquals, contains, notContains, startsWith, notStartsWith, endsWith, notEndsWith, regex, notRegex, isEmpty, isNotEmpty | ||||
— Operation (operation) | options | Yes | equals | The comparison operation to perform on the number field. (shown when Data Type is number) |
Options: equals, notEquals, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, isEven, isOdd, isEmpty, isNotEmpty | ||||
— Operation (operation) | options | Yes | isTrue | The comparison operation to perform on the boolean field. (shown when Data Type is boolean) |
Options: isTrue, isFalse, isEmpty, isNotEmpty | ||||
— Operation (operation) | options | Yes | after | The comparison operation to perform on the date field. (shown when Data Type is date) |
Options: equals, notEquals, after, afterOrEqual, before, beforeOrEqual, isInPast, isInFuture, isEmpty, isNotEmpty | ||||
— Operation (operation) | options | Yes | contains | The comparison operation to perform on the array field. (shown when Data Type is array) |
Options: contains, notContains, lengthEquals, lengthGreaterThan, lengthLessThan, lengthGreaterThanOrEqual, lengthLessThanOrEqual, isEmpty, isNotEmpty | ||||
— Operation (operation) | options | Yes | hasKey | The comparison operation to perform on the object field. (shown when Data Type is object) |
Options: hasKey, notHasKey, keyCountEquals, keyCountGreaterThan, keyCountLessThan, isEmpty, isNotEmpty | ||||
| — Value | string | No | — | The value to compare against. Supports expressions like {{ $json.compareField }}. (hidden when Operation is isEmpty, isNotEmpty, isTrue, isFalse, isEven, isOdd, isInPast, isInFuture) |
| Options | collection | No | {} | Additional filter options. |
| — Ignore Case | boolean | No | false | When enabled, string comparisons will be case-insensitive. |
| — Include Filter Metadata | boolean | No | false | When enabled, adds _filter metadata to passed items showing which conditions matched. |
| Max Concurrency | number | No | 50 | Maximum number of items to evaluate concurrently. |
Output Data
One output item per matching input item, on the Matched branch. The item JSON passes through unchanged and binary data is forwarded; the node only adds a property when Include Filter Metadata is on. Items that fail the conditions are separated out and keep their original JSON.
With Include Filter Metadata on, each passing item carries:
{
"_filter": {
"passed": true,
"conditionsEvaluated": 2,
"combineMode": "and",
"evaluatedAt": 1765432100000
}
}
- Data Type decides which operations are available and how both sides are read: a
numbercondition parses both values as numbers and never matches a field that is not numeric, and adatecondition never matches a value it cannot parse as a date. - Ignore Case applies to string and array comparisons only.
- A node with no conditions configured passes every item through.
- With error handling set to continue (the default), an item that fails evaluation travels out on
Matchedcarrying an_errorobject — check for it downstream rather than assuming everything on that branch matched.
Example Configuration
Keep only the items whose status is active:
{
"type": "filter",
"parameters": {
"combineMode": "and",
"conditions": {
"rules": [
{
"field": "status",
"dataType": "string",
"operation": "equals",
"value": "active"
}
]
}
}
}
Keep anything that is either high priority or flagged urgent, ignoring case:
{
"type": "filter",
"parameters": {
"combineMode": "or",
"conditions": {
"rules": [
{
"field": "priority",
"dataType": "string",
"operation": "equals",
"value": "high"
},
{
"field": "urgent",
"dataType": "boolean",
"operation": "isTrue"
}
]
},
"options": {
"ignoreCase": true,
"includeMetadata": true
}
}
}
Keep recent orders above a threshold — a number and a date condition combined with AND:
{
"type": "filter",
"parameters": {
"combineMode": "and",
"conditions": {
"rules": [
{
"field": "total",
"dataType": "number",
"operation": "greaterThanOrEqual",
"value": "500"
},
{
"field": "createdAt",
"dataType": "date",
"operation": "after",
"value": "{{ $json.periodStart }}"
}
]
},
"maxConcurrency": 25
}
}
Keep records that carry a tag and a nested identifier:
{
"type": "filter",
"parameters": {
"combineMode": "and",
"conditions": {
"rules": [
{
"field": "tags",
"dataType": "array",
"operation": "contains",
"value": "important"
},
{
"field": "metadata",
"dataType": "object",
"operation": "hasKey",
"value": "userId"
}
]
}
}
}
Error Handling
| Mode | Behavior |
|---|---|
| stop | Halts workflow on first error |
| continue | Skips failed items, passes successful ones through |
| errorPort | Routes failed items to Error output port |
Tips
Evaluates a condition against each input item and routes matches to the output. Use when you need to narrow a dataset to items meeting specific criteria (e.g., status equals active, amount greater than threshold). Produces only the items that satisfy the filter condition.
Key Points
- Always use the
rulesgroupKey insideconditions - The
valueparameter should be a string, even for numbers and dates - Booleans are tested with
isTrue/isFalse— there is no booleanequalsoption - Some operations like
isEmptyandisNotEmptydon’t require avalueparameter - Use appropriate operations based on the selected
dataType - The
optionsfields are nested directly under theoptionskey (no groupKey needed)
Frequently asked questions
What happens to items that don't match my filter condition?
The Filter node has three outputs: Matched, Unmatched, and Error. Items that fail your condition are routed to the Unmatched output rather than disappearing silently — you can connect that output to a separate branch if you need to handle rejected items, or leave it disconnected to drop them.
I'm filtering on a number, but my condition isn't matching. What am I doing wrong?
The Filter node requires the `value` parameter to be a string even when you're comparing numbers or dates. Pass '100' rather than 100, for example. The node handles the type comparison internally based on the `dataType` you select, so make sure that field is set to match the kind of data you're testing.
How do I filter on a boolean field — can I use equals true?
There is no boolean equals option. To test boolean fields, use the `isTrue` or `isFalse` operations instead. These don't require a value parameter — just select the field and pick the appropriate operation.
Do I need to provide a value for every condition I add?
No. Operations like `isEmpty` and `isNotEmpty` don't require a `value` parameter at all — they only need the field reference. Supplying a value with those operations won't break anything, but it also won't be used.
What's the correct structure for defining conditions in the Filter node?
Conditions must be defined using the `rules` groupKey inside the `conditions` parameter — skipping that groupKey will cause your rules to be ignored or throw an error. Options like case-sensitivity settings go directly under the `options` key with no groupKey required, so the nesting is shallower there than it is for conditions.
Build with the Filter node
Drop it into a workflow, wire it to an agent, or call it on a schedule.
Open BusyBotLast reviewed . Spotted something wrong? Tell us.