FormWork documentation
References & Data
Use entry, form, data table, workflow, and iteration data.
References identify data that FormWork should resolve at runtime. Use them in workflow mappings, calculations, conditions, templates, dynamic options, and other reference-aware settings.
Syntax
The general shape is:
<source>:<identifier>.<path>[<filter>]
Runtime sources are entry, form, data_table, workflow, and iteration.
Always prefer the reference picker. It inserts stable IDs, limits choices to the current context, and shows only reachable step outputs.
Current Entry
entry:current.id
entry:current.status
entry:current.created_at
entry:current.answers.email
entry:current.metafields.review_status
Answers use flat, path-addressed keys. A repeater stores its instance keys as a list and its child answers at paths such as:
entry:current.answers.line_items[item_1].qty
entry:current.answers.line_items[{iteration:for_each_line.key}].qty
You can also resolve a known entry ID:
entry:<entry-id>.answers.email
Entries from Another Form
Form references expose the form’s entries:
form:<form-id>.entries
form:<form-id>.entries[status=complete]
form:<form-id>.entries[answers.email:[email protected]][0].answers.email
form:<form-id>.entries[metafields.owner_id={entry:current.answers.owner_id}]
Use [0] before a field path when you need a single entry from a filtered collection.
Data Table Rows
Data tables use row and cell terminology:
data_table:<table-id>.rows
data_table:<table-id>.rows[cells.enabled=true]
data_table:<table-id>.rows[cells.sku=ABC][0].cells.price
data_table:<table-id>.rows[id={entry:current.answers.product}][0].cells.name
Filter a cell with cells.<column-id>. Select a cell from a row with .cells.<column-id>.
Previous Workflow Outputs
Only outputs from the current workflow run are supported:
workflow:current.steps.<step-id>.outputs.<output-id>
Examples:
workflow:current.steps.calculate_total.outputs.total
workflow:current.steps.create_order.outputs.created_id
workflow:current.steps.update_customer.outputs.updated
workflow:current.steps.generate_quote.outputs.file_id
workflow:current.steps.send_confirmation.outputs.job_id
workflow:current.steps.lookup_customer.outputs.status_code
workflow:current.steps.lookup_customer.outputs.parsed_body.id
Calculation output IDs are the IDs configured inside the Calculation step; there is no universal result output for calculations.
Common step outputs include:
| Step | Outputs |
|---|---|
| Condition | result |
| Calculation | One output per configured calculation ID |
| Create Entry or Row | created_id |
| Update Entry/Row | updated, updated_field_cnt, and usually updated_entry_id |
| Delete Entry or Row | deleted |
| Generate PDF | generated, file_id, filename, mime_type, size_bytes, access_level, download_url |
| Send Email | sent, delivery_status, job_id, to, subject |
| Extension Action | status_code, body, raw_body, headers, and parsed_body when JSON can be parsed |
The picker exposes outputs for Calculation, Create, Update, Delete, Generate PDF, and Extension Action steps. Condition and Send Email record the outputs above in workflow runs, but those outputs are not currently available in the picker.
Current For Each Iteration
Inside a loop body, use the For Each step’s ID:
iteration:<for-each-step-id>.index
iteration:<for-each-step-id>.key
iteration:<for-each-step-id>.item
iteration:<for-each-step-id>.item.price
iteration:<for-each-step-id>.steps.<body-step-id>.outputs.<output-id>
index is zero-based. key is the current item ID or repeater instance key. See For Each Loops for the execution rules.
Filters
| Form | Example |
|---|---|
| Equality | [cells.status=active] |
| Explicit operator | [cells.price:gte=10] |
| Multiple criteria | [cells.active=true&cells.price:lt=100] |
| Empty or not empty | [cells.code:empty], [cells.code:notempty] |
| Static index or key | [0], [item_1] |
| Dynamic key | [{iteration:loop.key}] |
Supported criteria operators are eq, neq, gt, gte, lt, lte, in, notin, contains, empty, and notempty.
A nested reference inside a filter uses single braces and must resolve to one scalar value:
data_table:<table-id>.rows[cells.owner_id={entry:current.answers.owner_id}]
Use References in Templates
Put the complete reference inside double braces:
Hello {{entry:current.answers.first_name}},
Your total is {{workflow:current.steps.calculate_total.outputs.total|floatformat:2}}.
Template formatters include upper, lower, default, pluck, join, length, floatformat, yesno, and date. The reference picker can help build formatter chains in template fields.
Troubleshooting
- Use
entry:current, not a bareentry.answerspath. - Use
workflow:current.steps.<step-id>.outputs, notworkflow:<step-id>.outputs. - Put
.rowsimmediately after a data table ID and use.cellsfor column data. - Use
iteration:<loop-id>, notloop.current. - Add
[0]only when selecting the first item from a list. - Check the workflow run’s resolved inputs and step outputs when a value is missing.