Workflow Studio

Decision Tables

Replace complex nested Condition nodes with a spreadsheet-style table of inputs, conditions, and output values — readable by non-technical stakeholders.

A decision table maps a set of input values to output values based on condition rows. Instead of a chain of 10 Condition nodes, you get a clear table that anyone can read and modify. Access decision tables at /workflows/[id]/decision-tables/[tableId].

Table Structure

A decision table has three sections:

  • Input columns — Fields evaluated on each incoming row (e.g., severity, category, source).
  • Condition rows — Each row defines conditions on the input columns. A row matches when all its conditions are met.
  • Output columns — Values returned when a row matches (e.g., assignedTeam, priority, escalateTo).

Example: Incident Routing Table

#IN: severityIN: categoryOUT: assignedTeamOUT: slaPolicyIdOUT: escalate
1P1anyplatform-engineeringsla-p1-criticaltrue
2P2securitysecurity-teamsla-p2-securityfalse
3P2networknetwork-opssla-p2-standardfalse
4P2anyit-supportsla-p2-standardfalse
5P3, P4anyit-helpdesksla-p3-lowfalse
6anyanyit-supportsla-p3-lowfalse

Hit Policy

The hit policy controls what happens when multiple rows match the input:

PolicyKeyDescription
First MatchfirstReturn the output of the first matching row. Rows are evaluated top to bottom. (Most common)
UniqueuniqueExactly one row may match. Throws if zero or multiple rows match.
AnyanyMultiple rows may match but all matching rows must have identical output values.
Collect (array)collectReturn outputs from ALL matching rows as an array.
Rule Orderrule_orderReturn outputs from all matching rows in the order they appear in the table.

Condition Cell Syntax

SyntaxMatches
"P1"Exactly "P1"
"P1", "P2"Either "P1" or "P2"
anyAny value, including null (always matches)
not("P1")Anything except "P1"
> 10Numeric: greater than 10
>= 10, <= 50Numeric range: 10 to 50 inclusive
contains("sql")String contains the substring
starts("INC-")String starts with prefix
nullValue is null or missing
not nullValue is present and not null

Using in a Workflow

Add a Decision Table node to the canvas. In its config, select the table and map input fields from upstream node outputs or trigger data. The node's output is the matched row's output columns.

Decision Table Node Config
{
  "type": "DecisionTable",
  "tableId": "incident-routing",
  "inputs": {
    "severity": "{{trigger.record.severity}}",
    "category": "{{trigger.record.category}}"
  }
}
// Output: { assignedTeam, slaPolicyId, escalate }
Keep tables focused on a single decision. If you have routing logic AND priority calculation AND SLA assignment in one table, split it into three smaller tables. Smaller tables are easier to debug and audit.