Skip to content

Condition (If) ​

Routes the email to the "true" or "false" output based on conditions over the email and the working data.

The Condition node splits a branch in two. Each row of the condition tree compares a field with a value; rows are combined with "all" or "any" and can be grouped. A field is either an email field (email.subject, email.from.domain, email.attachments.mimeTypes…) or a path in the working data (data.sort.category, data.http.bodyJson.items.0.id). The operators and comparison rules are the same as in trigger conditions.

Use Switch when you need more than two branches, and Categorize when the decision depends on the meaning of the email rather than on a field value.

At a glance ​

  • Type: flow.if · version 1
  • Category: Logic
  • Kind: Step — one stage of a run
  • Effect: No external effect (none) — nothing is written outside Mankomail; safe to replay
  • Needs a carrier email: No
  • Connection: None
  • Inputs: main
  • Outputs: true, false

Parameters ​

conditions ​

Conditions — Each row compares an email field (email.subject) or a working-data path (data.categorize_1.category) with a value.

  • Type: Condition tree (conditions)
  • Required: No
  • Tests email.* and data.* values

Outputs ​

  • true — Taken when the conditions match.
  • false — Taken when they do not match.

Data produced ​

What this node adds to the run data, and how to read it in an expression. <step> stands for the step key: the node name turned into an identifier (see Data and expressions).

  • {{ data.<step>.matched }} — boolean. true when the conditions matched (the true branch was taken), false otherwise.

Example ​

A workflow should only forward invoices from customers that carry a PDF. After the trigger, add a Condition node with conditions set to "all" of:

email.from.domain        matches domain   client.example
email.attachments.mimeTypes   contains    application/pdf
email.signals.isAutoReply     equals      false

Connect the next steps to the true port, and a Stop node with status "Ignored" to the false port. Downstream, {{ data.<step>.matched }} is true on the first branch and false on the second.

Tips ​

  • Text comparisons ignore case by default; accents always matter. Tick "Case sensitive" for an exact comparison.
  • A node with no condition row lets everything through (an empty "all" is true). An empty "any" group is false.
  • On a list field (recipients, attachment names, folders), the operators match when at least one element matches, except "does not equal", which requires that no element equals the value.
  • A data. path that does not exist counts as empty: "is empty" answers true and every other operator answers false. An email. field is never satisfied when the run has no triggering email (schedule, webhook, called workflow).
  • The value is converted to the type of the field: on a number, 9 "is greater than" 10 is false, as expected. On a text field, "is greater than" compares alphabetically, which works for ISO dates such as email.receivedAt > 2026-01-01.
  • An incomplete row (no field, unknown operator) is ignored at run time; the editor reports it before publishing.