FormWork FormWork

Step Types

Actions you can perform in workflows.

Steps are the building blocks of workflows. Each step type performs a specific action.

Calculation

Evaluate formulas and expressions to compute values.

Configuration

FieldDescription
FormulaThe calculation expression
Output NameName for the result

Formula Syntax

Calculations use an Excel-like formula syntax:

SUM(item_prices)
IF(quantity > 10, price * 0.9, price)
CONCATENATE(first_name, " ", last_name)

Using References

Insert data using references:

{{ entry.answers.quantity }} * {{ entry.answers.price }}

Available Functions

FunctionDescription
SUM(range)Add values
AVG(range)Average values
MIN(range)Minimum value
MAX(range)Maximum value
COUNT(range)Count items
IF(cond, true, false)Conditional
ROUND(num, decimals)Round number
CONCAT(...)Join strings
NOW()Current datetime
TODAY()Current date

Output

The calculation result is available to subsequent steps via:

workflow:step_id.outputs.result

Condition

Branch the workflow based on conditions.

Configuration

FieldDescription
ConditionLogic expression to evaluate

Condition Structure

Same as conditional logic for fields:

{
  "type": "all",
  "groups": [
    {
      "type": "any",
      "rules": [
        { "field": "status", "operator": "eq", "value": "approved" }
      ]
    }
  ]
}

Output Paths

  • True: Condition evaluated to true
  • False: Condition evaluated to false

Connect different steps to each path for branching logic.

Update Value

Modify entry answer values.

Configuration

FieldDescription
FieldWhich field to update
ValueNew value (can use references)

Value Sources

Static value:

"Processed"

Reference to another field:

{{ entry.answers.calculated_total }}

Previous step output:

{{ workflow:calc_step.outputs.result }}

Multiple Updates

Add multiple field updates in one step:

- field: status → "complete"
- field: processed_at → NOW()
- field: total → {{ workflow:calc.outputs.result }}

Email

Send email notifications.

Configuration

FieldDescription
ToRecipient email(s)
SubjectEmail subject line
BodyEmail content (HTML supported)
From NameSender display name

Dynamic Content

Use templates in all fields:

To: {{ entry.answers.email }}
Subject: Your order #{{ entry.id }} is confirmed
Body: Dear {{ entry.answers.name }}, ...

Multiple Recipients

Separate with commas or use an array reference:

{{ entry.answers.email }}, [email protected]

API Request

Make HTTP requests to external services.

Configuration

FieldDescription
URLRequest URL
MethodGET, POST, PUT, DELETE
HeadersRequest headers
BodyRequest body (for POST/PUT)

Request Body

Use JSON with templates:

{
  "name": "{{ entry.answers.name }}",
  "email": "{{ entry.answers.email }}",
  "order_total": {{ workflow:calc.outputs.total }}
}

Response Handling

Response is available in outputs:

  • outputs.status - HTTP status code
  • outputs.body - Response body (parsed if JSON)
  • outputs.headers - Response headers

Error Handling

Connect to the error path for failed requests:

  • Network errors
  • Non-2xx status codes
  • Timeout

Create Entry

Create a new entry in another form.

Configuration

FieldDescription
Target FormForm to create entry in
Field MappingMap values to target fields

Field Mapping

target_field: source_value_or_reference
- name: {{ entry.answers.customer_name }}
- source_form: "order_form"
- source_entry: {{ entry.id }}

Output

Created entry information:

  • outputs.entry_id - New entry ID
  • outputs.entry_key - New entry key

Delete Entry

Delete an entry from a form.

Configuration

FieldDescription
Target FormForm containing the entry
Entry ReferenceWhich entry to delete

Entry Reference

entry:{{ entry.answers.linked_entry_id }}

Or using data table lookup:

data_table:orders[order_id={{ entry.answers.order }}].entry_id

For Each

Iterate over a collection of items.

Configuration

FieldDescription
CollectionArray to iterate
Item VariableName for current item

Collections

Iterate over:

  • Repeater field instances
  • Data table rows
  • Array field values (multiselect)
  • Calculation results

Nested Steps

Steps inside For Each run for each item:

For Each: items in order_items

  Calculate: item_total = quantity * price

  Update: item.total = item_total

Outputs

Access iteration data:

  • Current index
  • Current item
  • Accumulated results

Step Connections

Sequential Flow

Step A → Step B → Step C

Each step waits for the previous to complete.

Parallel Paths

Step A → Step B
      → Step C

Both B and C run after A (order not guaranteed).

Conditional Branching

Condition
  ├─ True → Step A → Step B
  └─ False → Step C

Only one path executes based on condition.