Workflows

Node reference

Every workflow node type with its settings, validation rules, output variables and an example configuration — generated from the engine.

This reference is generated from the engine's node catalog (lib/workflow-schema.ts), its validation rules and its canvas summaries, so it always lists exactly the nodes the designer offers. "Validation" shows the messages you see when a required setting is missing. Every node's results are also available as {{<prefix>_<name>}}, where the prefix is the node's label in snake_case (or its configured output prefix), so two nodes of the same type don't overwrite each other.

Every node also has two engine-level options:

  • onError: stop (default) fails the run; continue logs the error, sets last_error, last_error_node and has_error, and carries on. See Error handling.
  • executionMode: sync (default) or async for nodes that can be fired and forgotten, such as Call Sub Workflow.

Triggers

Every workflow has one trigger. It decides when a run starts and which variables the run begins with. Workflows can also be started from the API, MCP or CLI (workflows start) whatever their trigger.

NodeTypeWhat it does
Task Createdtask_createdWhen a new task is created
Task Receivedtask_receivedWhen a task lands in the queue
Task Submittedtask_submittedWhen a task is accepted
Task Updatedtask_updatedWhen a task is modified
Task Completedtask_completedWhen a task is completed
Task Rejectedtask_rejectedWhen a task is rejected from the queue
Workflow Errorworkflow_errorWhen any workflow fails with an error
Workflow SLAworkflow_slaWhen a workflow SLA is nearing or breached
Policy Reviewretention_policy_reviewWhen a retention policy review becomes due
Policy Executedretention_policy_executedWhen a retention policy action such as purge is executed
Data Table Eventdata_table_eventWhen a data table row is created, updated, or deleted
Middlewaremiddleware_receivedReceive a webhook and return a workflow response synchronously
SchedulescheduleRun on a schedule
Webhookwebhook_receivedTriggered by an incoming webhook

Task Created

task_created · When a new task is created.

SettingsOptional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}.
SetsTrigger variables for the task: task_id, task.*, task_data.*.

Task Received

task_received · When a task lands in the queue.

SettingsFires when a task lands in a queue or inbox. Optional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}.
SetsTask trigger variables.

Task Submitted

task_submitted · When a task is accepted.

SettingsFires when a queued task is accepted. Optional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}.
SetsTask trigger variables.

Task Updated

task_updated · When a task is modified.

SettingsFires on task edits (status, priority, assignee, fields). Optional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}.
SetsTask trigger variables plus the changed values.

Task Completed

task_completed · When a task is completed.

SettingsFires when a task is completed. Optional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}.
SetsTask trigger variables, outcome and outcome_notes.

Task Rejected

task_rejected · When a task is rejected from the queue.

SettingsFires when a task is rejected from the queue. Optional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}.
SetsTask trigger variables.

Workflow Error

workflow_error · When any workflow fails with an error.

Settingserror_scope chooses any workflow or specific workflow_ids. Use it to build one central error handler that notifies, logs or retries.
Setserror_workflow_id, error_workflow_name, error_run_id, error_message, error_node, error_timestamp.
config
{
  "error_scope": "specific",
  "workflow_ids": [
    "<workflow-id>"
  ]
}

Workflow SLA

workflow_sla · When a workflow SLA is nearing or breached.

Settingsworkflow_scope / workflow_ids choose the workflows; event_types picks warning, breach or both.
SetsThe run, workflow, SLA label, due time and SLA status.

Policy Review

retention_policy_review · When a retention policy review becomes due.

Settingspolicy_scope / policy_ids choose which retention policies start a review run.
SetsPolicy id and name, the asset under review and its due date.

Policy Executed

retention_policy_executed · When a retention policy action such as purge is executed.

Settingspolicy_scope / policy_ids choose the policies; action_types filters purge, archive or other actions.
SetsPolicy, action type and affected asset.

Data Table Event

data_table_event · When a data table row is created, updated, or deleted.

Settingstable_id picks the data table (any table when empty) and event_types the row events (created, updated, deleted; all when empty).
Setsdata_event_type, data_table_id, data_table_name, row_id, row (the row values) and one variable per column.
config — shown on the canvas as “Data table (<tableid) · created, updated”
{
  "table_id": "<table-id>",
  "event_types": [
    "created",
    "updated"
  ]
}

Middleware

middleware_received · Receive a webhook and return a workflow response synchronously.

SettingsReceives an inbound webhook and holds the HTTP response open until the run finishes, so the workflow can validate, enrich or route a request synchronously. Keep these runs short.
SetsThe request body (_raw and mapped fields); the final variables become the response.

Schedule

schedule · Run on a schedule.

Settingsschedule_mode is every_minutes (interval_minutes), hourly (minute_of_hour), daily / weekly / monthly (time_of_day, day_of_week, day_of_month) or once (run_at), with an IANA timezone. Each occurrence fires exactly once; a missed slot catches up only the most recent occurrence.
Setsscheduled_at and the workflow's variables.
config
{
  "schedule_mode": "daily",
  "time_of_day": "06:30",
  "timezone": "Europe/London"
}

Webhook

webhook_received · Triggered by an incoming webhook.

SettingsCreate an inbound webhook for the workflow (Settings → Webhooks or usertasks webhooks create <workflow-id>); callers POST JSON to /api/webhooks/inbound?hook=<slug> with the webhook's secret as a Bearer token. A payload mapping can rename fields into variables.
Sets_raw (the full body) and one variable per mapped field.

Logic and flow

Branching, loops, waits, jumps and parallel paths.

NodeTypeWhat it does
Branch by ConditionconditionIf/else if/else branching
Branch by Valueswitch_caseMulti-way branch on a value
Loop For EachloopIterate over a collection
Loop N Timesloop_n_timesRepeat N times
Pause for DurationdelayWait a fixed amount of time
Pause Until Datepause_untilWait until a specific date/time
End Workflowend_workflowStop execution immediately
Go To Activitygoto_activityJump to another activity on the canvas
Parallel / SequentialparallelRun branches in parallel or sequentially

Branch by Condition

condition · If/else if/else branching.

Settingsbranches is an ordered list of if / else-if branches, each with rules (field, operator, value) joined by AND/OR; has_else adds an Else path. Connect one edge per branch label.
ValidationNo condition defined
config — shown on the canvas as “{{amount}} greater_than 10000”
{
  "branches": [
    {
      "label": "Large",
      "logic": "and",
      "rules": [
        {
          "field": "{{amount}}",
          "operator": "greater_than",
          "value": "10000"
        }
      ]
    }
  ],
  "has_else": true
}

Branch by Value

switch_case · Multi-way branch on a value.

Settingsfield is the value to test, cases the values (one outgoing edge each), has_default adds a fallback path.
ValidationValue field required; No cases defined
config
{
  "field": "{{region}}",
  "cases": [
    {
      "value": "EU"
    },
    {
      "value": "US"
    }
  ],
  "has_default": true
}

Loop For Each

loop · Iterate over a collection.

Settingsitems is the collection to iterate (the field suggests every list available at that point); item_var (default item) and index_var (default index) name the loop variables. Nodes connected to the loop body run once per item, and the data picker shows the item's fields there as Current item.
ValidationItems collection required
Sets{{item}} and {{index}} inside the body.
config — shown on the canvas as “each in {{vendors}}”
{
  "items": "{{vendors}}",
  "item_var": "vendor"
}

Loop N Times

loop_n_times · Repeat N times.

Settingscount repetitions with index_var (default i).
ValidationCount required
Sets{{i}} inside the body.
config — shown on the canvas as “3 times”
{
  "count": 3
}

Pause for Duration

delay · Wait a fixed amount of time.

Settingsduration and unit (seconds, minutes, hours, days). Waits of up to 30 seconds happen inline; longer waits pause the run (status waiting_for_event) and a queued delay_resume job continues it.
ValidationDuration required
Setsdelay_ms, resume_at.
config — shown on the canvas as “2 hours”
{
  "duration": 2,
  "unit": "hours"
}

Pause Until Date

pause_until · Wait until a specific date/time.

Settingsdate is an ISO date/time or expression. The run pauses and resumes from the queue at that time.
ValidationDate required
config
{
  "date": "{{=ADD_DAYS(NOW(), 1)}}"
}

End Workflow

end_workflow · Stop execution immediately.

SettingsStops the run immediately with status completed. Optional reason is written to the run log.

Go To Activity

goto_activity · Jump to another activity on the canvas.

Settingstarget_node_id is the activity to jump to; input_overrides can reset variables first. Useful for rework loops (send back to the requester, then re-approve).
ValidationTarget activity required
config — shown on the canvas as “→ Manager approval”
{
  "target_node_id": "<node-id>",
  "target_node_label": "Manager approval"
}

Parallel / Sequential

parallel · Run branches in parallel or sequentially.

Settingsbranches (two or more) and mode: parallel runs every branch at once, sequential one after another. The run continues after all branches finish.
ValidationAt least 2 branches required
config — shown on the canvas as “⫘ 2 branches”
{
  "mode": "parallel",
  "branches": [
    {
      "label": "Notify finance"
    },
    {
      "label": "Update ERP"
    }
  ]
}

Actions

Call systems, update tasks and data, notify people, run rules, agents and other workflows, and wait for people.

NodeTypeWhat it does
Update Taskupdate_taskModify task fields
Dataupdate_data_tableQuery, insert, update, or delete data store rows
Retention Policiesretention_policiesCreate, assign, and inspect retention policies and their assets
Call API / Referencecall_referenceExecute an API reference
Custom Activitycustom_activityRun uploaded custom workflow code with typed inputs and outputs
Create Subtaskcreate_subtaskAdd a subtask
Auto Actionauto_actionSet status, outcome, acceptance
HTTP Requesthttp_requestMake HTTP call
LoglogWrite audit log
Send Emailsend_emailSend an email via Resend
Call Sub Workflowcall_sub_workflowExecute another workflow as a sub-process
Decision Tabledecision_tableEvaluate a business rule / decision table and return outputs
User Taskuser_taskAssign a task to a person and wait for action
PlaceholderplaceholderEmpty action — swap out later
Server Eventserver_eventEmit or listen for a server event
Run Agentrun_agentExecute an AI agent with tools and instructions
Add User to Roleadd_user_to_roleAssign a governance role to a user
Remove from Roleremove_user_from_roleRemove a governance role from a user

Update Task

update_task · Modify task fields.

Settingsfield (one of the workflow-updatable task fields such as status, priority, due_date, assignee_id, title) and value.
ValidationField required
config — shown on the canvas as “priority = high”
{
  "field": "priority",
  "value": "high"
}

Data

update_data_table · Query, insert, update, or delete data store rows.

Settingstable_id and operation: insert, get, update, delete, list (with filters, sort_column, limit, offset) or set_retention. Rows are matched by row_id or match_column + match_value; column_values / field_mappings supply values. Output variable names are configurable (output_row_var, output_rows_var, output_count_var, output_row_id_var).
ValidationNo table selected
config — shown on the canvas as “get → Vendors”
{
  "table_id": "<vendors-table-id>",
  "table_name": "Vendors",
  "operation": "get",
  "match_column": "vendor_id",
  "match_value": "{{vendor_id}}"
}

Retention Policies

retention_policies · Create, assign, and inspect retention policies and their assets.

Settingsoperation: list_policies, create_policy (name, policy_mode, duration_value/duration_unit or exact_date, applies_to), delete_policy, list_assets or assign_policy (target_type data_table / data_row / role, target_id).
Setspolicies, policy, assets, counts.

Call API / Reference

call_reference · Execute an API reference.

Settingsreference_id picks an integration reference (a saved REST/OData/database operation). input_mappings fill its inputs from variables; output_mappings copy response fields into variables and custom_outputs ([{ name, path }], added with + in the response model tree) read any path of the response. _ref_response_schema is a snapshot of the reference's response model for the data picker. Calls are logged with redacted headers and appear in the event stream as integration.call. An HTTP error status (4xx/5xx) does not fail the step: the response and status are stored so a Condition can branch on them (for example {{status}} gte 400). Only a transport failure (DNS, refused connection, timeout) fails the step, which then follows the node's On error setting.
ValidationNo reference selected
Setsresponse, status (the HTTP status code; also <prefix>_response / <prefix>_status), mapped outputs, custom outputs, and file fields for binary responses. Pick fields with the data picker — see Reading values from an API response.
config — shown on the canvas as “GET Get vendor”
{
  "reference_id": "<reference-id>",
  "reference_name": "Get vendor",
  "reference_method": "GET",
  "input_mappings": {
    "vendor_id": "{{vendor_id}}"
  }
}

Custom Activity

custom_activity · Run uploaded custom workflow code with typed inputs and outputs.

Settingscustom_activity_id picks an active custom workflow step; input_mappings fill its typed inputs. Code runs only when the server sets ENABLE_CUSTOM_ACTIVITY_CODE=true.
ValidationNo custom activity selected
SetsThe step's declared outputs, prefixed with the node's output prefix.

Create Subtask

create_subtask · Add a subtask.

Settingstitle, optional assignee and parent_task_id (defaults to the workflow's task).
ValidationTitle required
config — shown on the canvas as “"Collect W-9 from {{vendor.name}}"”
{
  "title": "Collect W-9 from {{vendor.name}}",
  "assignee": "{{requester_id}}"
}

Auto Action

auto_action · Set status, outcome, acceptance.

SettingsSet the task's status, outcome (+ outcome_notes), acceptance_status, priority or assignee_id without a person acting; target_task_id defaults to the current task.
ValidationNo action configured
config — shown on the canvas as “→ completed, outcome: Auto-approved”
{
  "status": "completed",
  "outcome": "Auto-approved"
}

HTTP Request

http_request · Make HTTP call.

Settingsmethod, url, headers, params, body, content_type and auth_type (bearer, basic, api_key). _response_schema (captured from a pasted sample under Response model) makes the response pickable in later steps. Prefer an integration reference for anything reused: references keep credentials encrypted and calls governed. Like Call API / Reference, an HTTP error status (4xx/5xx) is stored rather than failing the step — branch on {{<prefix>_status}}; only a transport failure or timeout fails it.
ValidationURL required
Setsresponse (or output_var) and <prefix>_status (the HTTP status code), plus file / file_url for binary responses.
config — shown on the canvas as “POST https://hooks.example.com/notify”
{
  "method": "POST",
  "url": "https://hooks.example.com/notify",
  "body": "{\"invoice\":\"{{invoice_number}}\"}"
}

Log

log · Write audit log.

Settingsmessage (expressions allowed) is written to the run log and the event stream as workflow.step.log.
ValidationMessage required
config — shown on the canvas as “Vendor {{vendor.id}} risk {{ri”
{
  "message": "Vendor {{vendor.id}} risk {{risk}}"
}

Send Email

send_email · Send an email via Resend.

Settingsto (comma-separated, expressions allowed), subject and body, or an email_template_id; optional from and reply_to. Needs RESEND_API_KEY on the server.
ValidationRecipient required; Subject required
config — shown on the canvas as “To: {{requester_email}}”
{
  "to": "{{requester_email}}",
  "email_template_id": "<template-id>"
}

Call Sub Workflow

call_sub_workflow · Execute another workflow as a sub-process.

Settingssub_workflow_id and input_mappings (variables passed to the child). By default the parent waits for the child to finish (executionMode: "sync"); set the node to async to fire and forget.
ValidationSub-workflow required
Setsstatus, results (the child's variables) and error.
config — shown on the canvas as “→ Vendor onboarding”
{
  "sub_workflow_id": "<workflow-id>",
  "sub_workflow_name": "Vendor onboarding",
  "input_mappings": {
    "vendor_id": "{{vendor_id}}"
  }
}

Decision Table

decision_table · Evaluate a business rule / decision table and return outputs.

Settingsdecision_table_id and input_mappings (one per table input). Rules are evaluated in order; the first enabled match wins.
ValidationBusiness rule required
Setsmatched, rule_id, rule_label and outputs (each output column), also prefixed with the node's output prefix.
config — shown on the canvas as “→ Invoice approval policy”
{
  "decision_table_id": "<table-id>",
  "decision_table_name": "Invoice approval policy",
  "input_mappings": {
    "amount": "{{amount}}",
    "risk": "{{risk}}"
  }
}

User Task

user_task · Assign a task to a person and wait for action.

Settingstask_title, task_description, outcomes (each outcome is an outgoing edge label), typed fields (text, number, date, boolean, choice), assignment (assignment_type individual or team, assignee_id or assignee_variable, team_id), completion_rule for multi-assignee tasks (first_response, all_complete, consensus, unanimous, custom), due date, reminders, escalation and redirect options, and an optional notification_template_id.
ValidationTask title required; Assignee required
SetsWhile waiting: user_task_id, user_task_title, user_task_description (plain text) and user_task_description_html. On resume: outcome, outcome_notes and task_data.<field> for every field.
config — shown on the canvas as “Approve invoice {{invoice → team”
{
  "task_title": "Approve invoice {{invoice_number}}",
  "outcomes": [
    "Approved",
    "Rejected"
  ],
  "assignment_type": "team",
  "team_id": "<team-id>",
  "fields": [
    {
      "key": "cost_centre",
      "label": "Cost centre",
      "type": "choice",
      "options": [
        "OPS",
        "FIN"
      ]
    }
  ]
}

Placeholder

placeholder · Empty action — swap out later.

SettingsA no-op stand-in while you sketch a flow; note explains what goes here.
config — shown on the canvas as “Post to ERP once the API is ready”
{
  "note": "Post to ERP once the API is ready"
}

Server Event

server_event · Emit or listen for a server event.

Settingsevent_name plus an optional outbound action: call an integration reference (reference_id) or write to a data table (table_id), with the payload built from variables.
ValidationEvent name required
Setsevent_id, event_name.
config — shown on the canvas as “invoice.approved”
{
  "event_name": "invoice.approved"
}

Run Agent

run_agent · Execute an AI agent with tools and instructions.

Settingsagent_id, the prompt in user_message, optional max_iterations, timeout_ms and output_variable. The agent uses only the tools and references it was granted.
ValidationAgent is required; Prompt / message required
SetsThe agent's structured output in output_variable.
config — shown on the canvas as “→ Invoice triage as triage”
{
  "agent_id": "<agent-id>",
  "agent_name": "Invoice triage",
  "user_message": "Classify invoice {{invoice_number}}",
  "output_variable": "triage"
}

Add User to Role

add_user_to_role · Assign a governance role to a user.

Settingsuser_id and role_id or role_name. Audited as a permission change.
ValidationUser required; Role required
Setssuccess, role_id, role_name, audited.

Remove from Role

remove_user_from_role · Remove a governance role from a user.

Settingsuser_id and role_id or role_name. Audited as a permission change.
ValidationUser required; Role required
Setssuccess, role_id, role_name, audited.

Data, files and documents

Transform values, JSON, dates, text, files and Office documents inside the run.

NodeTypeWhat it does
Set Titleset_titleSet the title for this workflow instance
Set SLAset_slaSet the SLA deadline and warning threshold for this workflow run
Set Variableset_variableStore a value
Calculate ValuemathMath expression
Modify Stringmodify_stringTransform text
Create Texttext_templateBuild text from template
Format Dateformat_dateFormat date to string
Date Mathdate_mathAdd time or find interval
RegexregexApply a regular expression
Build JSON Objectjson_build_objectCreate or update a JSON object from key/value pairs
Build JSON Arrayjson_build_arrayCreate a new JSON array or push items into an existing one
Add to JSON Arrayjson_add_to_arrayAdd an object to an existing JSON array variable
Get JSON Valuejson_get_valueExtract a value from a JSON object or array by path
File to Base64file_to_base64Read file from URL/storage → base64
Base64 to Filebase64_to_fileSave base64 data as file in storage
Download Filedownload_fileDownload from URL to storage
Read File Contentread_fileRead file content as text
CSVread_csvRead or write CSV files
Excelread_excelRead or write Excel files
Word Documentdoc_wordFind/replace, tables, lists, images in Word docs
Excel Spreadsheetdoc_excelUpdate cells, find/replace, insert data in Excel
PowerPoint Slidesdoc_powerpointFind/replace, tables, lists, images in PowerPoint
Check Permissioncheck_permissionCheck if a user has a specific permission

Set Title

set_title · Set the title for this workflow instance.

Settingstitle sets the run's display title (shown in run lists, reports and the task tracker). Expressions allowed.
config
{
  "title": "Invoice {{invoice_number}} — {{vendor.name}}"
}

Set SLA

set_sla · Set the SLA deadline and warning threshold for this workflow run.

Settingsmode relative (amount + unit) or exact (due_at); optional warning threshold (warning_amount/warning_unit or warning_at) and sla_label. SLA warnings and breaches fire workflow_sla triggers and appear in reports and the event stream.
ValidationSLA amount required
config — shown on the canvas as “Invoice approval · 3 days · warn 1 days early”
{
  "sla_label": "Invoice approval",
  "mode": "relative",
  "amount": 3,
  "unit": "days",
  "warning_amount": 1,
  "warning_unit": "days"
}

Set Variable

set_variable · Store a value.

Settingsname and expression. The value is resolved with the full expression syntax, so it can be a literal, {{variable}} or {{=FUNCTION()}}.
ValidationVariable name required
config — shown on the canvas as “needs_cfo = {{=IF(amount > 50000, true, false)}}”
{
  "name": "needs_cfo",
  "expression": "{{=IF(amount > 50000, true, false)}}"
}

Calculate Value

math · Math expression.

Settingsexpression is evaluated as arithmetic over variables (+ - * / %, parentheses); output_var (default result).
ValidationExpression required
SetsThe number in output_var.
config — shown on the canvas as “{{subtotal}} * 1.2”
{
  "expression": "{{subtotal}} * 1.2",
  "output_var": "total"
}

Modify String

modify_string · Transform text.

Settingsinput and operation: uppercase, lowercase, trim, trim_start, trim_end, replace (search, replace_with, replace_all), substring (start, end), pad_start / pad_end (length, pad_char), reverse or slug.
ValidationOperation required
Setsoutput_var.
config
{
  "input": "{{vendor.name}}",
  "operation": "slug",
  "output_var": "vendor_slug"
}

Create Text

text_template · Build text from template.

Settingstemplate with {{variables}} and inline functions; output_var (default text).
ValidationTemplate required
config — shown on the canvas as “Invoice {{invoice_number}} for”
{
  "template": "Invoice {{invoice_number}} for {{=FORMAT_NUMBER(amount, 2)}} {{currency}}",
  "output_var": "summary"
}

Format Date

format_date · Format date to string.

Settingsdate (default now) and format: iso, date, time, datetime, short, relative or custom with custom_format (YYYY-MM-DD HH:mm:ss tokens); output_var (default formatted_date).
ValidationDate value required
config
{
  "date": "{{due_date}}",
  "format": "custom",
  "custom_format": "DD/MM/YYYY"
}

Date Math

date_math · Add time or find interval.

Settingsoperation add / subtract (amount, unit minutes … years) or interval between date and date2 (returns ms, seconds, minutes, hours, days); output_var.
ValidationDate value required
config
{
  "date": "{{received_at}}",
  "operation": "add",
  "amount": 30,
  "unit": "days",
  "output_var": "pay_by"
}

Regex

regex · Apply a regular expression.

Settingsinput, pattern, flags (default g) and operation: match, test, replace (replace_with) or split. Patterns are checked for catastrophic backtracking before they run.
ValidationPattern required
config
{
  "input": "{{reference}}",
  "pattern": "INV-(\\d+)",
  "operation": "match",
  "output_var": "invoice_match"
}

Build JSON Object

json_build_object · Create or update a JSON object from key/value pairs.

Settingsfields (key/value pairs, values may be expressions); source_var merges into an existing object; output_var (default json_object).
ValidationAt least one field required
config — shown on the canvas as “{vendor, amount} → payment”
{
  "fields": [
    {
      "key": "vendor",
      "value": "{{vendor.id}}"
    },
    {
      "key": "amount",
      "value": "{{amount}}"
    }
  ],
  "output_var": "payment"
}

Build JSON Array

json_build_array · Create a new JSON array or push items into an existing one.

Settingsitems builds a new array, or source_var pushes into an existing one; output_var.
config — shown on the canvas as “[] → pair”
{
  "items": [
    "{{a}}",
    "{{b}}"
  ],
  "output_var": "pair"
}

Add to JSON Array

json_add_to_array · Add an object to an existing JSON array variable.

Settingsarray_var is the array variable to append to; fields builds the object to push (or value).
ValidationArray variable required
config — shown on the canvas as “push → lines”
{
  "array_var": "lines",
  "fields": [
    {
      "key": "sku",
      "value": "{{item.sku}}"
    }
  ]
}

Get JSON Value

json_get_value · Extract a value from a JSON object or array by path.

Settingssource object or array and a dotted path (items.0.price); output_var (default json_value).
ValidationSource required
config — shown on the canvas as “data.vendor.risk → risk”
{
  "source": "{{response}}",
  "path": "data.vendor.risk",
  "output_var": "risk"
}

File to Base64

file_to_base64 · Read file from URL/storage → base64.

Settingsfile_url (task file, storage path or URL); output_var.
ValidationFile URL required
config — shown on the canvas as “← {{task.files.0.url}}”
{
  "file_url": "{{task.files.0.url}}",
  "output_var": "pdf_base64"
}

Base64 to File

base64_to_file · Save base64 data as file in storage.

Settingsbase64_data, file_name, content_type; saves to storage; output_var receives the file URL.
ValidationBase64 data required; File name required
config
{
  "base64_data": "{{pdf_base64}}",
  "file_name": "invoice.pdf"
}

Download File

download_file · Download from URL to storage.

Settingsurl and file_name; downloads into storage; output_var.
ValidationURL required
config — shown on the canvas as “← {{response.document_url}}”
{
  "url": "{{response.document_url}}",
  "file_name": "statement.pdf"
}

Read File Content

read_file · Read file content as text.

Settingsfile_url and encoding; reads text content into output_var.
ValidationFile URL required
config
{
  "file_url": "{{file_url}}"
}

CSV

read_csv · Read or write CSV files.

Settingsmode read (file_url, delimiter, has_headers) into output_var, or write (data_var, file_name) to produce a CSV file.
ValidationFile URL required
SetsRows, or file / file_url when writing.
config — shown on the canvas as “→ rows”
{
  "mode": "read",
  "file_url": "{{file_url}}",
  "has_headers": true,
  "output_var": "rows"
}

Excel

read_excel · Read or write Excel files.

Settingsmode read (file_url, sheet_name, has_headers) or write (data_var, file_name).
ValidationFile URL required
SetsRows, or file / file_url when writing.
config — shown on the canvas as “rows → payments.xlsx”
{
  "mode": "write",
  "data_var": "rows",
  "file_name": "payments.xlsx"
}

Word Document

doc_word · Find/replace, tables, lists, images in Word docs.

SettingsTemplate from a URL or a data-table file (template_url or source_mode: "table"), mode such as find_replace with replacements, tables, lists or images; output_var receives the generated file.
ValidationTemplate source required
config — shown on the canvas as “find replace → contract”
{
  "template_url": "{{template_url}}",
  "mode": "find_replace",
  "replacements": [
    {
      "find": "{{VENDOR}}",
      "replace": "{{vendor.name}}"
    }
  ],
  "output_var": "contract"
}

Excel Spreadsheet

doc_excel · Update cells, find/replace, insert data in Excel.

SettingsTemplate source as for Word; update cells, find/replace or insert rows; output_var.
ValidationTemplate source required
config — shown on the canvas as “find replace → doc_file”
{
  "template_url": "{{template_url}}",
  "mode": "find_replace",
  "replacements": [
    {
      "find": "{{TOTAL}}",
      "replace": "{{total}}"
    }
  ]
}

PowerPoint Slides

doc_powerpoint · Find/replace, tables, lists, images in PowerPoint.

SettingsTemplate source as for Word; find/replace, tables, lists and images in slides; output_var.
ValidationTemplate source required
config — shown on the canvas as “find replace → doc_file”
{
  "template_url": "{{template_url}}",
  "mode": "find_replace",
  "replacements": [
    {
      "find": "{{QUARTER}}",
      "replace": "Q3"
    }
  ]
}

Check Permission

check_permission · Check if a user has a specific permission.

Settingsuser_id and permission (a key from the permissions table). Branch on the result.
ValidationUser required; Permission required
Setshas_permission, permissions.
config — shown on the canvas as “{{task.assignee_id}} · tasks.complete”
{
  "user_id": "{{task.assignee_id}}",
  "permission": "tasks.complete"
}

Collections

Count, pick, filter, sort, deduplicate and join lists.

NodeTypeWhat it does
Count Itemscollection_countCount items in a list
Get Itemcollection_getGet item by index or key
Filter Collectioncollection_filterFilter items by condition
Sort Collectioncollection_sortSort items in a list
Remove Duplicatescollection_uniqueDeduplicate a list
Join to Textcollection_joinJoin list items into a string

Count Items

collection_count · Count items in a list.

Settingscollection; output_var (default count).
ValidationCollection required
config
{
  "collection": "{{lines}}",
  "output_var": "line_count"
}

Get Item

collection_get · Get item by index or key.

Settingscollection and by: index (index), last, or key (key_field + key); output_var.
ValidationCollection required
config
{
  "collection": "{{vendors}}",
  "by": "key",
  "key_field": "id",
  "key": "{{vendor_id}}",
  "output_var": "vendor"
}

Filter Collection

collection_filter · Filter items by condition.

Settingscollection, item field, operator and value; output_var.
ValidationCollection required
config
{
  "collection": "{{lines}}",
  "field": "amount",
  "operator": "greater_than",
  "value": "0",
  "output_var": "billable"
}

Sort Collection

collection_sort · Sort items in a list.

Settingscollection, field and direction (asc/desc); output_var.
ValidationCollection required
config
{
  "collection": "{{lines}}",
  "field": "amount",
  "direction": "desc"
}

Remove Duplicates

collection_unique · Deduplicate a list.

Settingscollection and optional field to deduplicate on; output_var.
ValidationCollection required
config
{
  "collection": "{{emails}}"
}

Join to Text

collection_join · Join list items into a string.

Settingscollection, separator and optional field to join; output_var.
ValidationCollection required
config
{
  "collection": "{{lines}}",
  "field": "sku",
  "separator": ", "
}

Canvas tools

Organise the canvas or bind live data.

NodeTypeWhat it does
Sectionsection_groupGroup activities into a collapsible section
Live Referencelive_referenceFetch fresh data on demand when variables are referenced

Section

section_group · Group activities into a collapsible section.

SettingsA labelled, collapsible frame (width, height, color) for grouping activities on the canvas. It does not run.

Live Reference

live_reference · Fetch fresh data on demand when variables are referenced.

Settingsreference_id, binding_name and input_mappings. Instead of running once, the reference is called whenever an expression reads {{<binding_name>.*}}, so values are always fresh.
ValidationNo reference selected
config — shown on the canvas as “⚡ fx ← Get exchange rate”
{
  "reference_id": "<reference-id>",
  "reference_name": "Get exchange rate",
  "binding_name": "fx"
}