# References & Data

Canonical: https://useformwork.com/docs/workflows/references

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:

```text
<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

```text
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:

```text
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:

```text
entry:<entry-id>.answers.email
```

## Entries from Another Form

Form references expose the form's entries:

```text
form:<form-id>.entries
form:<form-id>.entries[status=complete]
form:<form-id>.entries[answers.email:contains=@example.com][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:

```text
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:

```text
workflow:current.steps.<step-id>.outputs.<output-id>
```

Examples:

```text
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:

```text
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](/docs/workflows/for-each) 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:

```text
data_table:<table-id>.rows[cells.owner_id={entry:current.answers.owner_id}]
```

## Use References in Templates

Put the complete reference inside double braces:

```text
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 bare `entry.answers` path.
- Use `workflow:current.steps.<step-id>.outputs`, not `workflow:<step-id>.outputs`.
- Put `.rows` immediately after a data table ID and use `.cells` for column data.
- Use `iteration:<loop-id>`, not `loop.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.