Inputs
A condition is a test in three parts: an attribute, an operator, and a value. Join conditions with and / or. Use Convert to advanced condition to build nested groups such as
(A and B) or (C and D). Conditions can test record attributes or any output of an earlier block. For the full operator set per attribute type, see Conditions & filters.
Outputs
None. The Filter block decides whether the run continues. It does not expose a value to later blocks. To pass data downstream, reference the upstream trigger or lookup block directly. For example, a record found earlier is available as{{ steps.find_records.records }}.
Behavior
The Filter block evaluates its conditions against the current run’s data. It then either continues to the next block or stops the run. A stopped run is not an error. It ends quietly, costs nothing, and appears in run history as a normal completed run that took the stop path. Conditions joined by and all need to be true. Conditions joined by or need only one. When you mix the two operators in a flat list, the structure evaluates differently than it reads. Wrap the intended grouping in a nested condition group instead. A multi-value attribute holds more than one value at once, such as a multi-select or a multi-reference relationship. For these, a condition is true if any one value matches. A condition likeTags contains Customer passes when any tag is Customer. There is no built-in “all values match” operator. To test that case, use an Execute code block instead.
Gotchas
- Expensive blocks run on every trigger. A workflow shaped
trigger → Web agent → Filterruns the paid block first. So it pays the artificial intelligence (AI) cost on every run, because the filter sits after that block. Move the filter directly after the trigger so the run stops before reaching anything that consumes credits. - The workflow re-triggers itself. A workflow that writes a record can fire its own trigger again and loop. Add a
Updated by → Type → is not → Workflowfilter to admit only human-driven changes. See Infinite loops and safety. - The filter fires on re-saves, not real transitions. Testing only the new value matches every save that lands on that value, including the ones already there. Add a second condition on the previous value, such as
New value is WonandPrevious value is not Won. The filter then passes once per actual transition. - Mixed and/or passes records it shouldn’t. A flat list like
stage is Won or stage is Lost and Owner is Priya Sharmaevaluates asWon or (Lost and Priya), not(Won or Lost) and Priya. Build the intended grouping with Convert to advanced condition. Check the and/or structure first whenever a filter leaks.
Examples
Gating a Slack alert on closed-won deals
This filter lets only a real transition into theWon stage reach a downstream Slack alert. It runs after an Attribute value changed trigger watching stage.
The run continues to the alert only when a deal actually moves into
Won. Re-saving an already-won deal stops the run quietly.
Blocking self-triggered loops
This filter admits only human edits. A workflow that writes back to the same object then does not re-fire itself.
A workspace member updating the record passes the filter. A write made by another workflow stops the run before it can loop.
Routing on a parsed webhook field
This filter sits after a Parse JSON block. It continues only for enterprise-tier leads, so the costly enrichment steps that follow run on a fraction of inbound traffic.jane@acme.com. A free-tier lead stops at the filter and consumes no enrichment credits.