# Step Types

Canonical: https://useformwork.com/docs/workflows/step-types

Choose and configure the actions in a workflow.

Steps perform the work after a trigger fires. Available outputs appear in the reference picker for later reachable steps, and each step records its output in the workflow run.

This page helps you choose a step. Open [Step Settings](/docs/workflows/step-settings) when you need every configuration control.

## Send Email

Queue an email to respondents, admins, or external recipients. Configure recipients, subject, content, and optional generated-file attachments. Content can be inline or come from a reusable template.

Recorded outputs include `sent`, `delivery_status`, `job_id`, `to`, and `subject`. `delivery_status` is `queued` when the workflow step completes; final delivery may happen later. These email outputs are visible in the run log but are not currently available in the reference picker.

Example downstream reference:

```text
workflow:current.steps.send_confirmation.outputs.job_id
```

## Generate PDF

Render inline or reusable template content as a PDF and save it as an entry file. A later Send Email step can attach the returned file ID.

Outputs are `generated`, `file_id`, `filename`, `mime_type`, `size_bytes`, `access_level`, and `download_url`.

```text
workflow:current.steps.generate_quote.outputs.file_id
```

## Condition

Evaluate rules and follow either **True** or **False**. Use a Condition to guard actions, route categories, or check a prior result.

Its `result` output is the evaluated boolean. It appears in the run log but is not currently available in the reference picker:

```text
workflow:current.steps.check_total.outputs.result
```

## Calculation

Define one or more formula outputs for totals, discounts, scores, and dates. Each calculation has its own ID, and that ID becomes the output name.

If the step `calculate_quote` contains a calculation with ID `total`, use:

```text
workflow:current.steps.calculate_quote.outputs.total
```

There is no automatic `result` output for the whole Calculation step.

## Create Entry or Row

Create an entry in another form or a row in a data table. Select the form or table as the source and map values into its fields or cells.

The step returns `created_id`:

```text
workflow:current.steps.create_order.outputs.created_id
```

## Update Entry/Row

Update an existing entry, answer, metafield, data table row, or cell selected by a reference. Map one or more values into the selected target.

Outputs are `updated`, `updated_field_cnt`, and, when an entry was resolved, `updated_entry_id`.

```text
workflow:current.steps.update_customer.outputs.updated_entry_id
```

If the current entry is updated, subsequent steps use the refreshed current-entry data.

## Delete Entry or Row

Delete the entry or data table row selected by a reference. The step returns `deleted` when successful.

The record disappears from active lists and references, and the current interface has no restore action. Prefer a status such as **Cancelled** or **Archived** when the record may be needed for history or audit.

## For Each Loop

Evaluate a list and run **Loop Body** once per item, then continue through **After Loop**. Inside the body, use `iteration:<for-each-step-id>` for the current item, key, index, and body-step outputs.

The loop does not expose a collected array of body outputs after it completes. See [For Each Loops](/docs/workflows/for-each) for scoping and persistence patterns.

## Extension Action

Call an action supplied by a built-in extension or [API Connector](/docs/extensions/api-connectors). Choose an enabled environment and an action, then map values into its request.

For HTTP actions, common outputs include:

```text
workflow:current.steps.lookup_customer.outputs.status_code
workflow:current.steps.lookup_customer.outputs.headers
workflow:current.steps.lookup_customer.outputs.raw_body
workflow:current.steps.lookup_customer.outputs.parsed_body.id
```

A completed 2xx response follows **Next**. A completed non-2xx response follows **Error**. Configuration, reference, and connection failures fail the workflow run instead of taking the **Error** path.

## Choose a Step

| Goal | Step |
|------|------|
| Queue a message | Send Email |
| Create a file | Generate PDF |
| Split execution by rules | Condition |
| Produce calculated values | Calculation |
| Add a record | Create Entry or Row |
| Change a record | Update Entry/Row |
| Remove a record | Delete Entry or Row |
| Repeat work for a list | For Each Loop |
| Call a built-in service or external API | Extension Action |

## Good Practices

- Give every step a descriptive, stable ID; output references include it.
- Use the reference picker so a step sees only valid upstream outputs.
- Store results on an entry when they must outlive the current workflow run.
- Check a step's input, output, path, and error in **Workflow Runs** before retrying it.
- Use a test environment for external actions before switching to Live.

Next: [configure every step option](/docs/workflows/step-settings).