Skip to content
Expedify
5 min

Condition

One yes/no question, two paths. How the Condition node compares a value, which of its 27 operators to reach for, and what happens when the variable it checks does not exist.

Every workflow you have built so far runs in a straight line: each node hands its output to the next, and the whole thing does the same thing every time. Real work is not like that. A warm lead should be called today; a cold one should go into a nurture sequence. Same trigger, same data, two different answers.

Condition is how a workflow chooses. It asks exactly one yes/no question and sends the run down one of two paths. It is the if-statement of automation — and it is the node you will reach for more than any other in the Logic group.

The three fields that make the question

A Condition is a sentence with three parts: a variable to check, an operator to compare with, and a value to compare against. Read left to right, the one in this lesson says: {{crmmanager_1.entity.lead_status}} contains Warm.

The three comparison fields, as the node defines them.

variable

What it holds
Variable to evaluate (supports legacy value_path)

operator

What it holds
Comparison operator One of: == · != · > · < · >= · <= · contains · not_contains · starts_with · ends_with · regex_match · is_empty · is_not_empty · greater_than · less_than · in · not_in · before · after · date_between · date_equals · within_last_days · within_next_days · time_before · time_after · time_between · time_equals Defaults to ==.

value

What it holds
Value to compare against (supports legacy comparison_value)

The variable side is dynamic — it is a {{ }} reference resolved fresh on every run. The value side is usually a literal, but it accepts a reference too, so you can compare two moving things to each other: is this deal worth more than the budget the contact told us?

A worked example

Here is the whole thing as it runs. A contact's lead status changes, the workflow reads that contact back out of the CRM, and the Condition decides what happens next.

One question, two paths

Click the Condition node to see the comparison it makes. The Yes and No connectors are its two output handles.

YesNo

Scroll for all 5 steps →

Two things in that diagram are worth pausing on. The trigger watches lead_status specifically, so editing a contact's phone number does not start this workflow. And the Condition has two outgoing connectors, not one — every downstream node hangs off either the Yes handle or the No handle. A Condition with nothing wired to one of its handles is a run that quietly stops.

Twenty-seven operators, four families

The operator dropdown is the part learners underestimate. It holds 27 operators, and they fall into four groups:

All 27, grouped by what they compare.

Equality & numeric

Operators
== != > < >= <=
Use it for
Amounts, scores, counts

String

Operators
contains not_contains starts_with ends_with regex_match is_empty is_not_empty
Use it for
Statuses, tags, free text

List membership

Operators
in not_in
Use it for
“Is it one of these three stages?”

Date & time

Operators
before after date_between within_last_days within_next_days plus the time_* siblings
Use it for
Renewals, follow-up windows, office hours

Two behaviours that surprise people. First, contains is case-insensitive — Warm matches warm and WARM. Second, both sides are parsed as a date first, then as a number, and only then as text — so 42 is genuinely less than 100, rather than sorting after it the way strings would.

What happens when the variable is missing

This is the failure worth knowing before you hit it. If the reference cannot be resolved — the field is empty, or the upstream node did not return what you expected — the Condition does not error. It compares against nothing and takes whichever path that implies: is_empty goes Yes, == goes No. The run continues down a branch you did not intend, which is much harder to spot than a failure.

When a Condition sends a run the wrong way, open the execution log and look at what the node actually compared. It reports both resolved sides, which almost always shows the reference was the problem rather than the operator.

Watch out: Flat config {variable, operator, value}; wire edges on the `true` / `false` handles.

The alias, and why it says if_1

Drag a Condition onto the canvas and the builder names it if_1 — not condition_1. That name is its alias: the namespace downstream nodes use to read its output, as in {{if_1.condition_result}}. Every node type has its own short base, and the number counts up as you add more of them.

Rename it. A workflow with three nodes called if_1, if_2 and if_3 is unreadable a month later. The Description field costs five seconds and turns the node into “Lead is warm or hot” on the canvas.

Try it

  1. Add a Condition to any workflow that already has a trigger.
  2. Set the variable to something the trigger gives you, pick is_not_empty, and leave the value blank.
  3. Wire a node to Yes and a different node to No, then run it and watch which one fires.
  4. Now break it on purpose: misspell the variable, run it again, and read what the node reports comparing.

Next: Multi-Condition Router — for when two paths are not enough and you need a run to pick one of several.

Related lessons