> ## Documentation Index
> Fetch the complete documentation index at: https://docs.persistence.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow nodes

> Nodes you can add to an event-to-call workflow.

Open **Add node** on an event-to-call [workflow](/deploy/workflows). Each item in the menu matches the dashboard label.

| Node | Menu description |
| - | - |
| **Action** | Start a call with an agent. |
| **Data** | Fetch data from an API. |
| **Mapper** | Map data to reusable variables. |
| **Condition** | Branch based on your conditions. |
| **Delay** | Wait for a duration or a scheduled time. |
| **Iterator** | Repeat steps for each item in a list. |
| **End** | End an iteration, workflow, or series. |

The graph also has a **Start** node. You do not add it from the menu.

## Start

**Begin this workflow.** Choose the trigger, optional **Meta (optional)** JSON available when the run starts, and the failure webhook if you need one.

## Action

**Start a call using your selected agent and phone number or pool.**

Configure:

* **Call name**
* **Agent**
* **Dial from**: **Phone number** or **Number pool**, plus a pool strategy when you use a pool
* **Dynamic variables** passed into the agent
* **Call hours**, skip rules, **Give up waiting for the call after (minutes)**, and **Retry settings**
* **Transition** states such as **Fulfilled** and **Not fulfilled** for the next step

A skipped call sets `call.skipped = true`. A retry that did not redial after a refresh sets `call.retry_skipped = true`.

## Data

**Fetch data to use in the next steps.**

The step sends GET to your endpoint when it runs. Enter a valid HTTP URL. Use [secrets](/accounts/secrets) for credentials.

**Response data path** can be empty to use the entire response. Use list matching to pick one item, for example `data[id=record_id]` where `record_id` is a mapped variable.

Enable **Continue with empty data if nothing matches** when a missing record should not fail the run. Map fields in a **Mapper** node after this step.

You can also **Fetch from CRM** when a CRM account is connected. Choose the account and a supported record type.

## Mapper

Map source fields onto names later steps can use. Use unique names (letters, numbers, and underscores) and a source for every mapping. Inside an iterator, refer to the current row as `item` and `iterator.index`.

## Condition

Route to **Fulfilled** or **Not fulfilled**.

Combine rules with **Any** or **All**. Operators include equals, contains, exists, numeric comparisons, **Contains any of**, and **Contains none of**.

**Fulfilled** and **Not fulfilled** must connect to different nodes.

## Delay

**Wait for a duration or until a scheduled time.**

| Mode | What to enter |
| - | - |
| Duration | Seconds, minutes, hours, or days |
| **Date and time** | A timestamp, or **Set dynamically** with a variable |
| Spoken times | Add a time filter on the variable, with a timezone such as Asia/Kolkata |

If the time cannot be read, choose **Fail the run** or **Continue without waiting** (`wait_skipped = true`).

## Iterator

**Run the nodes inside once for each item in a list.**

Set **List to iterate** to a list variable such as `meta.leads`. Iterators can only sit at the workflow level, not nested inside another iterator. Add at least one node inside. Deleting an iterator also removes the nodes inside it.

**End** inside a loop can **End this iteration** without stopping the rest of the list.

## End

**End this workflow** or **End this and all later workflows** in the series.

Connect every branch that should stop. Do not leave **Action** nodes with **Not connected** transitions.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.