Conditions
Conditions filter the trigger's data. A run is created only when they pass; otherwise the match is recorded under “Why it did not run” with every condition's actual value. No conditions means every trigger occurrence runs.
{
"all": [
{ "field": "percent_of_supply", "op": ">=", "value": 0.5 },
{ "field": "is_mint", "op": "==", "value": false },
{ "any": [
{ "field": "time.hour_wib", "op": ">=", "value": 8 },
{ "field": "amount_decimal", "op": ">=", "value": "100000" }
] }
]
}The root is a group: all (AND) or any (OR). Groups nest up to 4 levels, with at most 50 nodes. Fields are the trigger's data paths (see Triggers); a typo is rejected when you save, with a suggestion.
Operators
| Operator | Meaning | Example |
|---|---|---|
| == | equals | { "field": "token.symbol", "op": "==", "value": "USDG" } |
| != | is not | { "field": "from", "op": "!=", "value": "0x0000000000000000000000000000000000000000" } |
| > >= < <= | numeric comparisons (exact decimals) | { "field": "amount_decimal", "op": ">=", "value": "1000" } |
| IN / NOT_IN | one of / none of a list (up to 500 values) | { "field": "to", "op": "IN", "value": ["0xaa…", "0xbb…"] } |
| CONTAINS | a text contains a substring, or a list contains a value | { "field": "event.name", "op": "CONTAINS", "value": "Swap" } |
| EXISTS | the field is present and not null | { "field": "token.symbol", "op": "EXISTS" } |
Semantics
- Numbers are exact. Numbers and numeric strings compare as decimals:
"1000000000000000000000"equals1e21, and token amounts never lose precision. Write big values as strings. - Hex is case-insensitive. Addresses and hashes match in any case; other text is compared exactly.
- Missing data fails. A missing or null field fails every operator except
EXISTS: a flow never runs on data it does not have. - No guessing. Comparing incompatible types (text with
>) fails withtype_mismatch, shown in the trace. - Everything is evaluated. All conditions are checked (no short-circuit), so the trace always shows each result.
Useful fields
time.hour_wib,time.minutes_wib(08:00 = 480),time.weekday_wib(1 = Monday): business hours in WIB, from the block time.percent_of_supply,is_mint,is_burnon token transfers.body.*for inbound webhooks: any path into the JSON you posted, e.g.body.order.total.
Limits that also filter
After the conditions pass, a match can still be held back by settings.max_runs_per_hour (default 60) or by the plan's monthly runs. Both are recorded as evaluations (rate_limited, plan_limited). A flow whose events exceed three times its hourly cap pauses itself and you get a notice.