# Loop Over Items - Workflow node | Docs - nodulz

Source: https://nodulz.com/docs/nodes/loop_over_items

Language: en

Run downstream nodes once for each input item, then continue on Done

## Usage and specifics

Use this node to run an action per item or batch. **Loop** carries repeated processing; **Done** continues once all items are processed.

With this manual payload:

```json
{
  "contacts": [
    { "email": "ada@example.test" },
    { "email": "lin@example.test" }
  ]
}
```

1. Set **Items to iterate** (`source`) to `input.contacts` and **Items per iteration** to `1`.
2. Connect **Loop** to [Edit fields](/docs/nodes/set), enable **Mapped fields only** and create `email` with `{{ nodes.loop1.item.email }}`. Replace `loop1` with the technical name offered by your mapping.
3. Connect **Done** to processing that should happen after all contacts. You may connect the last body node back to the loop; the engine manages iteration.

During each turn, loop output supplies `item`, `items`, zero-based `index`, `total` and `batchSize`. Here, `item` is the Ada contact followed by the Lin contact. `input.contacts` stays the original list: it is not the current item.

On **Done**, output contains collected results in `items` and their number in `count`. With the preparation node above, expect:

```json
{
  "items": [
    { "email": "ada@example.test" },
    { "email": "lin@example.test" }
  ],
  "count": 2
}
```

Results come from the output collected at the end of each turn, rather than automatically from the original items. With several items in a batch, `item` becomes a list; the last batch may contain only one item. If an action expects a single contact, keep `batchSize: 1`.

Technical type : `loop_over_items`. Runtime : `nodulz`.

## Credentials and prerequisites

This node defines no dedicated external credential. Remote sources or execution targets may still need their own access credentials.

See the [credentials guide](/docs/credentials) if a remote source or execution target requires access.

## Parameters

Names below are technical keys. Defaults are not a ready-to-run configuration: complete fields required by your operation. Paths containing [] describe list items; some fields depend on the selected mode.

| Parameter | Type | Default | Values / limits |
| --- | --- | --- | --- |
| `source` | `string` | `""` | - |
| `batchSize` | `number` | `1` | -; ≥ 1 |

## Configuration help

| Setting | Purpose and guidance |
| --- | --- |
| `source`<br>Items to loop over | Connect the Loop output to the nodes to run for each item. Optionally connect the last node back to this node (like n8n). When finished, execution continues on Done with all iteration outputs. |
| `batchSize`<br>Items per iteration | Number of items processed per loop iteration (1 = one at a time). |

## Initial configuration

Initial catalog configuration example, to adapt before running. Keep secrets in credentials.

```json
{
  "source": "",
  "batchSize": 1
}
```

## Verification

Run the complete workflow with both contacts and check that each appears once in the results. Then test an empty list: the body should not run and Done should remain reachable. Check the final output after the loop, where `item` is replaced by the result collection.

See also : [Expressions and data](/docs/expressions), [Executions](/docs/executions), [Node catalog](/docs/nodes).

## Explore further

- [Features - nodulz](https://nodulz.com/product/overview)
- [Node catalog - nodulz](https://nodulz.com/product/catalog)
- [MCP server - nodulz](https://nodulz.com/product/mcp)
- [Pricing - nodulz](https://nodulz.com/pricing)
- [Use cases and workflow automation - nodulz](https://nodulz.com/use-cases)
- [Choose what your workflows can do. - nodulz](https://nodulz.com/compare)
- [Documentation - nodulz](https://nodulz.com/docs)
