Batch Operations
Batch nodes process multiple items efficiently in a single step. Instead of using a For Each loop (which processes one item at a time), batch nodes handle arrays in bulk with configurable concurrency and error handling.
Batch vs. For Each
| Feature | For Each | Batch |
|---|---|---|
| Processing | One item at a time, sequential | Multiple items in parallel |
| Speed | Slower (1 by 1) | Faster (configurable concurrency) |
| Error handling | Stops on first error (by default) | Continue despite errors, report at end |
| Use when | Each item needs complex multi-node processing | Each item needs a single operation |
| Sub-nodes | Can contain multiple nodes | Single operation per batch |
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Input array | FX formula | Yes | The array to process, e.g., {{find_all.records}} |
| Operation | Select | Yes | What to do with each item (see operations below) |
| Concurrency | Number | No | How many items to process simultaneously. Default: 5. Max: 50. |
| On error | Select | No | Stop all (default), Skip and continue, or Retry then skip |
| Retry attempts | Number | No | Number of retries per failed item (when "Retry then skip" is selected). Default: 3. |
Operations
Batch HTTP Request
Send the same HTTP request for each item in the array:
| Field | Description |
|---|---|
| Method | GET, POST, PUT, PATCH, DELETE |
| URL | URL template with variables: https://api.example.com/users/{{item.id}} |
| Body | JSON body template with variables |
| Headers | Static or variable headers |
Batch Create Record
Create multiple database rows at once:
| Field | Description |
|---|---|
| Connection | Database connection |
| Table | Target table |
| Field mapping | Map input array fields to table columns |
Batch Update Record
Update multiple rows based on a matching key:
| Field | Description |
|---|---|
| Match on | Which field to match (e.g., email or id) |
| Fields to update | Which columns to update with new values |
Batch Delete Record
Delete rows matching each item:
| Field | Description |
|---|---|
| Match on | Which field identifies the row to delete |
Output variables
{{batch.results}} → array of results (one per input item)
{{batch.succeeded}} → count of successful items
{{batch.failed}} → count of failed items
{{batch.errors}} → array of error details for failed items
{{batch.total}} → total items processed
Error handling modes
Stop all
Stops processing immediately when any item fails. Items already processed stay processed; there's no rollback.
Skip and continue
Skip the failed item and continue with the rest. Failed items are reported in {{batch.errors}} at the end.
Retry then skip
Retry failed items up to N times with exponential backoff. If all retries fail, skip and continue.
Common patterns
Bulk API sync
Find All (contacts updated today) → Batch HTTP Request →
POST to CRM API for each contact (concurrency: 10) →
If-Else (any failures?) → Send Email (report failed syncs)
Bulk enrichment
CSV Import → Filter (rows without company data) →
Batch HTTP Request (enrichment API, concurrency: 5) →
Batch Update Record (write enrichment data back)
Data cleanup
Manual Trigger → Find All (inactive users, older than 1 year) →
Batch Delete Record (concurrency: 20) →
Log (deleted {{batch.succeeded}} inactive users)
Performance tips
| Tip | Why |
|---|---|
| Start with low concurrency | Set concurrency to 5 during testing, increase after confirming it works |
| Respect API rate limits | If the target API allows 50 req/sec, set concurrency to 40 (leave headroom) |
| Use batch over For Each | For simple single-operation processing, batch is faster |
| Keep For Each for complex chains | When each item needs 3-4 different operations, For Each gives more control |
Batch operations with high concurrency can overwhelm external APIs. Always check the target API's rate limits before setting concurrency above 10. Getting rate-limited (429 errors) wastes credits and time.
Batch Create and Batch Update record operations are atomic per-item, not per-batch. If 3 out of 100 items fail, the other 97 are already saved. There's no batch-level rollback.