Loop
The Loop node takes an array from a previous step and runs a connected node once for every item in it.
It:
Processes each item individually
Retries failed items
Collects all results when finished
Think of it as a “for each” step:
One item in
Run the node
Repeat until done
Use a Loop node whenever you need to process a list item-by-item.
Examples:
Send a personalized email for each order
Create a Notion page for every database row
Update a Gorgias ticket for each customer
Run any action across a dynamic array
Loop works similarly to an Error Handler — it drives a single node repeatedly.
Add the Loop node where iteration should begin
Connect the node you want to run into the Loop’s body input
Connect the Loop output to the next step in your flow
Inside the body node, you can access:
{{loopResult.item}} → current item
{{loopResult.index}} → current index (0-based)
{{loopResult.total}} → total number of items
Replace loopResult with your Step name.
Step name (required)
Name used to reference this step’s output
Must start with a letter or underscore
Array to loop over (required)
A Handlebars expression pointing to an array
Example:{{shopifyOrders.data.orders}}
Max items (optional, default: 100)
Limits how many items are processed
Range: 1–1000
Extra items are ignored
Retries per item (optional, default: 2)
Number of retry attempts per failed item
Range: 0–3
Retry delay strategy (optional, default: Exponential)
Controls retry timing:
No delay → retry immediately
Linear → 1s, 2s, 3s…
Exponential → 1s, 2s, 4s…
Base delay (optional, default: 1000ms)
Starting delay used by the retry strategy
On each iteration, the body node has access to:
{{loopResult.item}} → current item
{{loopResult.index}} → position in array
{{loopResult.total}} → total number of items
Replace loopResult with your Step name.
After the loop completes, results are stored under your Step name.
Available fields:
{{loopResult.items}} → array of all item results
{{loopResult.count}} → total items processed
{{loopResult.successCount}} → successful items
{{loopResult.errorCount}} → failed items
{{loopResult.isEmpty}} → true if input array was empty
Each entry in {{loopResult.items}} contains:
index → original position
item → original item value
status → "success" or "error"
attempts → number of attempts made
On success:
result → output from the body node
On failure:
error.message → error message
Failures are not fatal
If an item fails after all retries:
It is skipped
The loop continues
The failure is recorded
Non-retriable errors
Errors like missing required fields:
Skip retries immediately
Are treated as final failures
Empty arrays
Use {{loopResult.isEmpty}} before relying on results
Max items cap
Applied before execution:
If array = 500 items
Max items = 100
Only first 100 are processed
Remaining items are discarded, not queued
Navigate