Conditional Node
The Conditional node splits your workflow into two paths — True and False — based on rules you define. Data flows to one branch or the other depending on whether the conditions pass. It does not modify data; it is purely a router.
Configuration
Conditions
Settings
How the Two Branches Work
The Conditional node always has two output handles on the right side:
- True (green handle, top) — data flows here when the conditions pass.
- False (red handle, bottom) — data flows here when the conditions fail.
You connect different downstream nodes to each handle. Only one branch fires per execution — the other is skipped entirely. This is how you build "if this, do that; otherwise, do something else" logic in your workflow.
In this example, the LLM analyzes market data and responds with text. The Conditional checks if the response contains "BUY". If it does, the True branch fires and places an order. If not, the False branch fires and sends an email alert instead.
You don't have to use both branches. If you only care about one outcome — for example, only place a trade when the signal is strong — you can leave the False handle unconnected. The workflow simply ends on that path.
Configuration
| Field | Description |
|---|---|
| Conditions | One or more rules to evaluate. Click + Add to add more. |
| Field | Path to the data to check (e.g., llm.output, price_data.data.prices[0].current). Click Show suggestions to auto-discover available paths from connected nodes. |
| Operator | How to compare — see full list below. |
| Compare Mode | Static Value (compare against a value you type) or Another Field (compare two dynamic values from the input data). |
| Type | Text, Number, or Boolean. Choose Number for price and numeric comparisons so type coercion works correctly. |
| Value | The value to compare against. |
| Logic | When you have multiple conditions: AND (all must be true for True branch) or OR (at least one must be true for True branch). Only appears with 2+ conditions. |
| Pass Through Data | When ON (default), the original input data flows through to whichever branch fires. When OFF, only \{ result: true/false \} is sent. |
Operators
| Category | Operator | What it checks |
|---|---|---|
| Equality | Equals | Exact match (after type coercion) |
| Not Equals | Not an exact match | |
| Comparison | Greater Than | Field value is above comparison value |
| Less Than | Field value is below comparison value | |
| Greater Than or Equal | Field value is at or above comparison value | |
| Less Than or Equal | Field value is at or below comparison value | |
| Text | Contains | Field includes the comparison string |
| Not Contains | Field does not include the comparison string | |
| Starts With | Field begins with the comparison string | |
| Ends With | Field ends with the comparison string | |
| Existence | Is Empty | Value is empty string, null, undefined, or empty array |
| Is Not Empty | Value has content | |
| Exists | Field is present in the data | |
| Not Exists | Field is missing from the data |
"42" compares as 42 when Type is set to Number.Field Paths
Field paths let you reach into nested data structures:
| Syntax | Example | What it accesses |
|---|---|---|
| Simple key | output | Top-level field |
| Dot notation | data.close | Nested property |
| Array index | [0] | First element of an array |
| Combined | data.prices[0].current | Nested array element |
Click Show suggestions in the Field input to auto-discover all available paths from connected upstream nodes.
Pass Through Data
This setting is critical for understanding how data flows after the Conditional.
When ON (default): The original input data passes through unchanged to whichever branch fires. Downstream nodes reference the source node's output paths — the Conditional is invisible in the data chain.
For example, if a Price Data node connects to the Conditional, and the True branch connects to an Exchange Order node, the Exchange Order references {price_data.data.prices[0].current} — not {conditional.anything}.
When OFF: Only the boolean evaluation result is sent downstream: {conditional.result} is true or false.
Use Case: Trade Only When RSI Is Oversold
Check if RSI is below 30 before placing a buy order. If RSI is healthy, send a Telegram alert instead.
Condition setup:
- Field:
price_data.data.prices[0].indicators.rsi - Operator: Less Than
- Value:
30 - Type: Number
When the RSI is 28, the True branch fires and buys BTC. When the RSI is 55, the False branch fires and sends the Telegram message.
Use Case: Route on LLM Recommendation
Check if an LLM's free-text response contains a specific keyword.
Condition setup:
- Field:
llm.output - Operator: Contains
- Value:
BUY - Type: Text
The Contains operator converts both sides to strings, so it works on the LLM's full text response. If the LLM says "ACTION: BUY", the True branch fires. If it says "ACTION: HOLD", the False branch fires.
Use Case: Multi-Condition Gate
Require multiple signals to align before acting. This prevents trades based on a single weak indicator.
Condition setup (Logic: AND):
- Field:
price_data.data.prices[0].indicators.rsi, Operator: Less Than, Value:30, Type: Number - Field:
price_data.data.prices[0].current, Operator: Less Than, Value:60000, Type: Number
With AND logic, both conditions must be true. The True branch only fires when RSI is below 30 and price is under $60k. If either condition fails, the False branch fires.
Switch to OR logic if you want the True branch to fire when any condition passes.
Use Case: Compare Two Fields Dynamically
Instead of comparing against a hardcoded value, compare two fields from the same input data.
Example — current price vs. open price:
- Field:
price_data.data.prices[0].current - Compare Mode: Another Field
- Compare Field:
price_data.data.prices[0].candles[0].open - Operator: Greater Than
- Type: Number
This evaluates to True when the current price is above the candle's open price — no hardcoded values needed. Useful for detecting intraday trends.
Common Routing Examples
| Use case | Field | Operator | Value | Type |
|---|---|---|---|---|
| Route on LLM recommendation | llm.output | Contains | BUY | Text |
| Price above threshold | price_data.data.prices[0].current | Greater Than | 100000 | Number |
| RSI oversold | price_data.data.prices[0].indicators.rsi | Less Than | 30 | Number |
| Parsed function result | parser.action | Equals | BUY | Text |
| Funding rate spike | coinglass.data.fundingRate | Greater Than | 0.0005 | Number |
| Portfolio loss alert | portfolio.positions[0].unrealizedPnl | Less Than | 0 | Number |
| Structured output field | llm.output.signal | Equals | buy | Text |
| Confidence threshold | llm.output.confidence | Greater Than | 0.7 | Number |
Output
With Pass Through Data ON (default):
The original input data flows to whichever branch fires. Downstream nodes reference the source node's output paths directly.
With Pass Through Data OFF:
| Path | Description |
|---|---|
| {conditional.result} | true or false — the evaluation result |
conditional with your node's edge label. If the edge is labeled check, use {check.result}.Next Steps
- LLM Node — Generate analysis text to route with the Conditional.
- Function Node — Parse or transform data before conditional evaluation.
- Exchange Order Node — Place trades on the True branch.
- Price Data Node — Fetch market data to evaluate conditions against.
- Email Node — Send alerts on either branch.