Many inputs, one action
One row becomes one execution
Paced
Cap how many run at once, or how many start per interval
Controllable
Pause, resume, or cancel the whole batch
Tracked
See how many rows are pending, running, and done
Create a batch
1
Add the rows
Pick one of three sources.
The file needs a header row. Every row becomes one execution.
2
Map the columns
Tell the platform what each column feeds.
The platform maps a column automatically when its header matches an input name. The match ignores
case and treats whitespace as underscores. Change any mapping by hand.A mapping passes when it satisfies all of these:
- Every required workflow input has a column.
- No two columns feed the same field.
- At least one column is not skipped.
- Every metadata mapping has a name.
3
Preview the rows
The preview shows the first 10 rows and how each field resolves. A valid row is marked ready. An
invalid row shows the reason.Fix the spreadsheet and upload it again before you continue.
4
Configure the batch
A start time that has already passed starts the batch at once, in the
running status. A future
start time creates the batch as pending, and it starts itself when the time arrives.Pacing
Pacing has two modes. They limit different things, so pick the one that matches the constraint you actually have.Limit how many run at the same time
Bounds simultaneity. The first rows start straight away, up to the limit. Each time an execution finishes, the next one starts. The batch works through the sheet as fast as it can without exceeding the cap. Rows above the cap wait in theawaiting_capacity status until a slot frees.
Use this when the target site limits concurrent sessions. Use it also when you want the batch
finished as soon as it can be.
Limit how many start per interval
Bounds the rate. A fixed number of rows start every interval, whether or not the earlier ones have finished. The platform assigns each row a start time when it creates the batch:batchSize = 5 and batchInterval = 60:
Use this for a site that refuses to be hit faster than a set rate.
Batch statuses
Row statuses
Each row inside a batch carries its own status.
Every row has an execution behind it from the moment you create the batch. That execution holds the
queued status until the row’s turn arrives. It then moves to starting and runs like any other
execution. See Executions and statuses.
Run the batch
Manage batches from the Batch tab. Each card shows the name, the status, a progress bar of triggered rows against total rows, and the timestamps.Pause
Pause
Stops new rows from starting. Rows already running continue to the end. Use it to hold a batch
without losing its place.
Resume
Resume
Recalculates the schedule from the current time and continues with the remaining rows.
Cancel
Cancel
Stops the batch for good. Pending rows are cancelled and will not start. Rows already running
are not affected.
Track progress
Each batch counts its rows.
The card also shows elapsed duration and cycle time. Cycle time is wall-clock time per triggered
row. While a batch runs, the card projects a finish time at the current rate.
Cycle time measures throughput, not how long a single execution takes. It falls when you raise concurrency.
Find the executions
Batch runs are ordinary executions. List them with the executions endpoint.triggerSource=schedule
covers every execution the platform started for you, from a batch or from a schedule.
GET /executions?metadataKey=batch&metadataValue=march-invoices.
For a large batch, use webhooks instead of polling. Asteroid calls
you on every status change, and emits BATCH_STARTED and BATCH_COMPLETED for the batch itself.
Practices that pay off
Test with 5 rows first
Test with 5 rows first
Run a small batch before a large one. It proves the column mapping, the input
formatting, and the workflow’s behaviour on real data. Five runs is a cheap rehearsal.
Start conservative on pacing
Start conservative on pacing
Begin with a low limit and raise it. Too many concurrent executions overwhelm the target site,
or trigger its rate limiting. Every row then fails for the same reason.
Use a profile pool
Use a profile pool
A pool hands each row its own profile. That spreads the load across credentials, and stops two
runs sharing one browser state. See Agent profiles.
Map a metadata column
Map a metadata column
Map your own order ID or record ID to metadata. Every execution then carries it, and
GET /executions?metadataKey=…&metadataValue=… finds the run for any row.Next
Schedules
Repeat a batch on a cron schedule
Agent profiles
Profiles and pools for concurrent executions
Webhooks and Slack
Get told when a row finishes
Executions and statuses
What each execution does after it starts

