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;continuelogs the error, setslast_error,last_error_nodeandhas_error, and carries on. See Error handling.executionMode:sync(default) orasyncfor 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.
| Node | Type | What it does |
|---|---|---|
| Task Created | task_created | When a new task is created |
| Task Received | task_received | When a task lands in the queue |
| Task Submitted | task_submitted | When a task is accepted |
| Task Updated | task_updated | When a task is modified |
| Task Completed | task_completed | When a task is completed |
| Task Rejected | task_rejected | When a task is rejected from the queue |
| Workflow Error | workflow_error | When any workflow fails with an error |
| Workflow SLA | workflow_sla | When a workflow SLA is nearing or breached |
| Policy Review | retention_policy_review | When a retention policy review becomes due |
| Policy Executed | retention_policy_executed | When a retention policy action such as purge is executed |
| Data Table Event | data_table_event | When a data table row is created, updated, or deleted |
| Middleware | middleware_received | Receive a webhook and return a workflow response synchronously |
| Schedule | schedule | Run on a schedule |
| Webhook | webhook_received | Triggered by an incoming webhook |
Task Created
task_created · When a new task is created.
| Settings | Optional filters narrow which tasks start a run. The task is available as {{task.*}} (title, status, priority, assignee) and its fields as {{task_data.*}}. |
| Sets | Trigger variables for the task: task_id, task.*, task_data.*. |
Task Received
task_received · When a task lands in the queue.
| Settings | Fires 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.*}}. |
| Sets | Task trigger variables. |
Task Submitted
task_submitted · When a task is accepted.
| Settings | Fires 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.*}}. |
| Sets | Task trigger variables. |
Task Updated
task_updated · When a task is modified.
| Settings | Fires 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.*}}. |
| Sets | Task trigger variables plus the changed values. |
Task Completed
task_completed · When a task is completed.
| Settings | Fires 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.*}}. |
| Sets | Task trigger variables, outcome and outcome_notes. |
Task Rejected
task_rejected · When a task is rejected from the queue.
| Settings | Fires 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.*}}. |
| Sets | Task trigger variables. |
Workflow Error
workflow_error · When any workflow fails with an error.
| Settings | error_scope chooses any workflow or specific workflow_ids. Use it to build one central error handler that notifies, logs or retries. |
| Sets | error_workflow_id, error_workflow_name, error_run_id, error_message, error_node, error_timestamp. |
{
"error_scope": "specific",
"workflow_ids": [
"<workflow-id>"
]
}Workflow SLA
workflow_sla · When a workflow SLA is nearing or breached.
| Settings | workflow_scope / workflow_ids choose the workflows; event_types picks warning, breach or both. |
| Sets | The run, workflow, SLA label, due time and SLA status. |
Policy Review
retention_policy_review · When a retention policy review becomes due.
| Settings | policy_scope / policy_ids choose which retention policies start a review run. |
| Sets | Policy 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.
| Settings | policy_scope / policy_ids choose the policies; action_types filters purge, archive or other actions. |
| Sets | Policy, action type and affected asset. |
Data Table Event
data_table_event · When a data table row is created, updated, or deleted.
| Settings | table_id picks the data table (any table when empty) and event_types the row events (created, updated, deleted; all when empty). |
| Sets | data_event_type, data_table_id, data_table_name, row_id, row (the row values) and one variable per column. |
{
"table_id": "<table-id>",
"event_types": [
"created",
"updated"
]
}Middleware
middleware_received · Receive a webhook and return a workflow response synchronously.
| Settings | Receives 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. |
| Sets | The request body (_raw and mapped fields); the final variables become the response. |
Schedule
schedule · Run on a schedule.
| Settings | schedule_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. |
| Sets | scheduled_at and the workflow's variables. |
{
"schedule_mode": "daily",
"time_of_day": "06:30",
"timezone": "Europe/London"
}Webhook
webhook_received · Triggered by an incoming webhook.
| Settings | Create 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.
| Node | Type | What it does |
|---|---|---|
| Branch by Condition | condition | If/else if/else branching |
| Branch by Value | switch_case | Multi-way branch on a value |
| Loop For Each | loop | Iterate over a collection |
| Loop N Times | loop_n_times | Repeat N times |
| Pause for Duration | delay | Wait a fixed amount of time |
| Pause Until Date | pause_until | Wait until a specific date/time |
| End Workflow | end_workflow | Stop execution immediately |
| Go To Activity | goto_activity | Jump to another activity on the canvas |
| Parallel / Sequential | parallel | Run branches in parallel or sequentially |
Branch by Condition
condition · If/else if/else branching.
| Settings | branches 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. |
| Validation | No condition defined |
{
"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.
| Settings | field is the value to test, cases the values (one outgoing edge each), has_default adds a fallback path. |
| Validation | Value field required; No cases defined |
{
"field": "{{region}}",
"cases": [
{
"value": "EU"
},
{
"value": "US"
}
],
"has_default": true
}Loop For Each
loop · Iterate over a collection.
| Settings | items 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. |
| Validation | Items collection required |
| Sets | {{item}} and {{index}} inside the body. |
{
"items": "{{vendors}}",
"item_var": "vendor"
}Loop N Times
loop_n_times · Repeat N times.
| Settings | count repetitions with index_var (default i). |
| Validation | Count required |
| Sets | {{i}} inside the body. |
{
"count": 3
}Pause for Duration
delay · Wait a fixed amount of time.
| Settings | duration 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. |
| Validation | Duration required |
| Sets | delay_ms, resume_at. |
{
"duration": 2,
"unit": "hours"
}Pause Until Date
pause_until · Wait until a specific date/time.
| Settings | date is an ISO date/time or expression. The run pauses and resumes from the queue at that time. |
| Validation | Date required |
{
"date": "{{=ADD_DAYS(NOW(), 1)}}"
}End Workflow
end_workflow · Stop execution immediately.
| Settings | Stops 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.
| Settings | target_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). |
| Validation | Target activity required |
{
"target_node_id": "<node-id>",
"target_node_label": "Manager approval"
}Parallel / Sequential
parallel · Run branches in parallel or sequentially.
| Settings | branches (two or more) and mode: parallel runs every branch at once, sequential one after another. The run continues after all branches finish. |
| Validation | At least 2 branches required |
{
"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.
| Node | Type | What it does |
|---|---|---|
| Update Task | update_task | Modify task fields |
| Data | update_data_table | Query, insert, update, or delete data store rows |
| Retention Policies | retention_policies | Create, assign, and inspect retention policies and their assets |
| Call API / Reference | call_reference | Execute an API reference |
| Custom Activity | custom_activity | Run uploaded custom workflow code with typed inputs and outputs |
| Create Subtask | create_subtask | Add a subtask |
| Auto Action | auto_action | Set status, outcome, acceptance |
| HTTP Request | http_request | Make HTTP call |
| Log | log | Write audit log |
| Send Email | send_email | Send an email via Resend |
| Call Sub Workflow | call_sub_workflow | Execute another workflow as a sub-process |
| Decision Table | decision_table | Evaluate a business rule / decision table and return outputs |
| User Task | user_task | Assign a task to a person and wait for action |
| Placeholder | placeholder | Empty action — swap out later |
| Server Event | server_event | Emit or listen for a server event |
| Run Agent | run_agent | Execute an AI agent with tools and instructions |
| Add User to Role | add_user_to_role | Assign a governance role to a user |
| Remove from Role | remove_user_from_role | Remove a governance role from a user |
Update Task
update_task · Modify task fields.
| Settings | field (one of the workflow-updatable task fields such as status, priority, due_date, assignee_id, title) and value. |
| Validation | Field required |
{
"field": "priority",
"value": "high"
}Data
update_data_table · Query, insert, update, or delete data store rows.
| Settings | table_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). |
| Validation | No table selected |
{
"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.
| Settings | operation: 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). |
| Sets | policies, policy, assets, counts. |
Call API / Reference
call_reference · Execute an API reference.
| Settings | reference_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. |
| Validation | No reference selected |
| Sets | response, 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. |
{
"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.
| Settings | custom_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. |
| Validation | No custom activity selected |
| Sets | The step's declared outputs, prefixed with the node's output prefix. |
Create Subtask
create_subtask · Add a subtask.
| Settings | title, optional assignee and parent_task_id (defaults to the workflow's task). |
| Validation | Title required |
{
"title": "Collect W-9 from {{vendor.name}}",
"assignee": "{{requester_id}}"
}Auto Action
auto_action · Set status, outcome, acceptance.
| Settings | Set 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. |
| Validation | No action configured |
{
"status": "completed",
"outcome": "Auto-approved"
}HTTP Request
http_request · Make HTTP call.
| Settings | method, 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. |
| Validation | URL required |
| Sets | response (or output_var) and <prefix>_status (the HTTP status code), plus file / file_url for binary responses. |
{
"method": "POST",
"url": "https://hooks.example.com/notify",
"body": "{\"invoice\":\"{{invoice_number}}\"}"
}Log
log · Write audit log.
| Settings | message (expressions allowed) is written to the run log and the event stream as workflow.step.log. |
| Validation | Message required |
{
"message": "Vendor {{vendor.id}} risk {{risk}}"
}Send Email
send_email · Send an email via Resend.
| Settings | to (comma-separated, expressions allowed), subject and body, or an email_template_id; optional from and reply_to. Needs RESEND_API_KEY on the server. |
| Validation | Recipient required; Subject required |
{
"to": "{{requester_email}}",
"email_template_id": "<template-id>"
}Call Sub Workflow
call_sub_workflow · Execute another workflow as a sub-process.
| Settings | sub_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. |
| Validation | Sub-workflow required |
| Sets | status, results (the child's variables) and error. |
{
"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.
| Settings | decision_table_id and input_mappings (one per table input). Rules are evaluated in order; the first enabled match wins. |
| Validation | Business rule required |
| Sets | matched, rule_id, rule_label and outputs (each output column), also prefixed with the node's output prefix. |
{
"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.
| Settings | task_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. |
| Validation | Task title required; Assignee required |
| Sets | While 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. |
{
"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.
| Settings | A no-op stand-in while you sketch a flow; note explains what goes here. |
{
"note": "Post to ERP once the API is ready"
}Server Event
server_event · Emit or listen for a server event.
| Settings | event_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. |
| Validation | Event name required |
| Sets | event_id, event_name. |
{
"event_name": "invoice.approved"
}Run Agent
run_agent · Execute an AI agent with tools and instructions.
| Settings | agent_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. |
| Validation | Agent is required; Prompt / message required |
| Sets | The agent's structured output in output_variable. |
{
"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.
| Settings | user_id and role_id or role_name. Audited as a permission change. |
| Validation | User required; Role required |
| Sets | success, role_id, role_name, audited. |
Remove from Role
remove_user_from_role · Remove a governance role from a user.
| Settings | user_id and role_id or role_name. Audited as a permission change. |
| Validation | User required; Role required |
| Sets | success, role_id, role_name, audited. |
Data, files and documents
Transform values, JSON, dates, text, files and Office documents inside the run.
| Node | Type | What it does |
|---|---|---|
| Set Title | set_title | Set the title for this workflow instance |
| Set SLA | set_sla | Set the SLA deadline and warning threshold for this workflow run |
| Set Variable | set_variable | Store a value |
| Calculate Value | math | Math expression |
| Modify String | modify_string | Transform text |
| Create Text | text_template | Build text from template |
| Format Date | format_date | Format date to string |
| Date Math | date_math | Add time or find interval |
| Regex | regex | Apply a regular expression |
| Build JSON Object | json_build_object | Create or update a JSON object from key/value pairs |
| Build JSON Array | json_build_array | Create a new JSON array or push items into an existing one |
| Add to JSON Array | json_add_to_array | Add an object to an existing JSON array variable |
| Get JSON Value | json_get_value | Extract a value from a JSON object or array by path |
| File to Base64 | file_to_base64 | Read file from URL/storage → base64 |
| Base64 to File | base64_to_file | Save base64 data as file in storage |
| Download File | download_file | Download from URL to storage |
| Read File Content | read_file | Read file content as text |
| CSV | read_csv | Read or write CSV files |
| Excel | read_excel | Read or write Excel files |
| Word Document | doc_word | Find/replace, tables, lists, images in Word docs |
| Excel Spreadsheet | doc_excel | Update cells, find/replace, insert data in Excel |
| PowerPoint Slides | doc_powerpoint | Find/replace, tables, lists, images in PowerPoint |
| Check Permission | check_permission | Check if a user has a specific permission |
Set Title
set_title · Set the title for this workflow instance.
| Settings | title sets the run's display title (shown in run lists, reports and the task tracker). Expressions allowed. |
{
"title": "Invoice {{invoice_number}} — {{vendor.name}}"
}Set SLA
set_sla · Set the SLA deadline and warning threshold for this workflow run.
| Settings | mode 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. |
| Validation | SLA amount required |
{
"sla_label": "Invoice approval",
"mode": "relative",
"amount": 3,
"unit": "days",
"warning_amount": 1,
"warning_unit": "days"
}Set Variable
set_variable · Store a value.
| Settings | name and expression. The value is resolved with the full expression syntax, so it can be a literal, {{variable}} or {{=FUNCTION()}}. |
| Validation | Variable name required |
{
"name": "needs_cfo",
"expression": "{{=IF(amount > 50000, true, false)}}"
}Calculate Value
math · Math expression.
| Settings | expression is evaluated as arithmetic over variables (+ - * / %, parentheses); output_var (default result). |
| Validation | Expression required |
| Sets | The number in output_var. |
{
"expression": "{{subtotal}} * 1.2",
"output_var": "total"
}Modify String
modify_string · Transform text.
| Settings | input 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. |
| Validation | Operation required |
| Sets | output_var. |
{
"input": "{{vendor.name}}",
"operation": "slug",
"output_var": "vendor_slug"
}Create Text
text_template · Build text from template.
| Settings | template with {{variables}} and inline functions; output_var (default text). |
| Validation | Template required |
{
"template": "Invoice {{invoice_number}} for {{=FORMAT_NUMBER(amount, 2)}} {{currency}}",
"output_var": "summary"
}Format Date
format_date · Format date to string.
| Settings | date (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). |
| Validation | Date value required |
{
"date": "{{due_date}}",
"format": "custom",
"custom_format": "DD/MM/YYYY"
}Date Math
date_math · Add time or find interval.
| Settings | operation add / subtract (amount, unit minutes … years) or interval between date and date2 (returns ms, seconds, minutes, hours, days); output_var. |
| Validation | Date value required |
{
"date": "{{received_at}}",
"operation": "add",
"amount": 30,
"unit": "days",
"output_var": "pay_by"
}Regex
regex · Apply a regular expression.
| Settings | input, pattern, flags (default g) and operation: match, test, replace (replace_with) or split. Patterns are checked for catastrophic backtracking before they run. |
| Validation | Pattern required |
{
"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.
| Settings | fields (key/value pairs, values may be expressions); source_var merges into an existing object; output_var (default json_object). |
| Validation | At least one field required |
{
"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.
| Settings | items builds a new array, or source_var pushes into an existing one; output_var. |
{
"items": [
"{{a}}",
"{{b}}"
],
"output_var": "pair"
}Add to JSON Array
json_add_to_array · Add an object to an existing JSON array variable.
| Settings | array_var is the array variable to append to; fields builds the object to push (or value). |
| Validation | Array variable required |
{
"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.
| Settings | source object or array and a dotted path (items.0.price); output_var (default json_value). |
| Validation | Source required |
{
"source": "{{response}}",
"path": "data.vendor.risk",
"output_var": "risk"
}File to Base64
file_to_base64 · Read file from URL/storage → base64.
| Settings | file_url (task file, storage path or URL); output_var. |
| Validation | File URL required |
{
"file_url": "{{task.files.0.url}}",
"output_var": "pdf_base64"
}Base64 to File
base64_to_file · Save base64 data as file in storage.
| Settings | base64_data, file_name, content_type; saves to storage; output_var receives the file URL. |
| Validation | Base64 data required; File name required |
{
"base64_data": "{{pdf_base64}}",
"file_name": "invoice.pdf"
}Download File
download_file · Download from URL to storage.
| Settings | url and file_name; downloads into storage; output_var. |
| Validation | URL required |
{
"url": "{{response.document_url}}",
"file_name": "statement.pdf"
}Read File Content
read_file · Read file content as text.
| Settings | file_url and encoding; reads text content into output_var. |
| Validation | File URL required |
{
"file_url": "{{file_url}}"
}CSV
read_csv · Read or write CSV files.
| Settings | mode read (file_url, delimiter, has_headers) into output_var, or write (data_var, file_name) to produce a CSV file. |
| Validation | File URL required |
| Sets | Rows, or file / file_url when writing. |
{
"mode": "read",
"file_url": "{{file_url}}",
"has_headers": true,
"output_var": "rows"
}Excel
read_excel · Read or write Excel files.
| Settings | mode read (file_url, sheet_name, has_headers) or write (data_var, file_name). |
| Validation | File URL required |
| Sets | Rows, or file / file_url when writing. |
{
"mode": "write",
"data_var": "rows",
"file_name": "payments.xlsx"
}Word Document
doc_word · Find/replace, tables, lists, images in Word docs.
| Settings | Template 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. |
| Validation | Template source required |
{
"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.
| Settings | Template source as for Word; update cells, find/replace or insert rows; output_var. |
| Validation | Template source required |
{
"template_url": "{{template_url}}",
"mode": "find_replace",
"replacements": [
{
"find": "{{TOTAL}}",
"replace": "{{total}}"
}
]
}PowerPoint Slides
doc_powerpoint · Find/replace, tables, lists, images in PowerPoint.
| Settings | Template source as for Word; find/replace, tables, lists and images in slides; output_var. |
| Validation | Template source required |
{
"template_url": "{{template_url}}",
"mode": "find_replace",
"replacements": [
{
"find": "{{QUARTER}}",
"replace": "Q3"
}
]
}Check Permission
check_permission · Check if a user has a specific permission.
| Settings | user_id and permission (a key from the permissions table). Branch on the result. |
| Validation | User required; Permission required |
| Sets | has_permission, permissions. |
{
"user_id": "{{task.assignee_id}}",
"permission": "tasks.complete"
}Collections
Count, pick, filter, sort, deduplicate and join lists.
| Node | Type | What it does |
|---|---|---|
| Count Items | collection_count | Count items in a list |
| Get Item | collection_get | Get item by index or key |
| Filter Collection | collection_filter | Filter items by condition |
| Sort Collection | collection_sort | Sort items in a list |
| Remove Duplicates | collection_unique | Deduplicate a list |
| Join to Text | collection_join | Join list items into a string |
Count Items
collection_count · Count items in a list.
| Settings | collection; output_var (default count). |
| Validation | Collection required |
{
"collection": "{{lines}}",
"output_var": "line_count"
}Get Item
collection_get · Get item by index or key.
| Settings | collection and by: index (index), last, or key (key_field + key); output_var. |
| Validation | Collection required |
{
"collection": "{{vendors}}",
"by": "key",
"key_field": "id",
"key": "{{vendor_id}}",
"output_var": "vendor"
}Filter Collection
collection_filter · Filter items by condition.
| Settings | collection, item field, operator and value; output_var. |
| Validation | Collection required |
{
"collection": "{{lines}}",
"field": "amount",
"operator": "greater_than",
"value": "0",
"output_var": "billable"
}Sort Collection
collection_sort · Sort items in a list.
| Settings | collection, field and direction (asc/desc); output_var. |
| Validation | Collection required |
{
"collection": "{{lines}}",
"field": "amount",
"direction": "desc"
}Remove Duplicates
collection_unique · Deduplicate a list.
| Settings | collection and optional field to deduplicate on; output_var. |
| Validation | Collection required |
{
"collection": "{{emails}}"
}Join to Text
collection_join · Join list items into a string.
| Settings | collection, separator and optional field to join; output_var. |
| Validation | Collection required |
{
"collection": "{{lines}}",
"field": "sku",
"separator": ", "
}Canvas tools
Organise the canvas or bind live data.
| Node | Type | What it does |
|---|---|---|
| Section | section_group | Group activities into a collapsible section |
| Live Reference | live_reference | Fetch fresh data on demand when variables are referenced |
Section
section_group · Group activities into a collapsible section.
| Settings | A 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.
| Settings | reference_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. |
| Validation | No reference selected |
{
"reference_id": "<reference-id>",
"reference_name": "Get exchange rate",
"binding_name": "fx"
}