Features
Parallel Steps
Upstash Workflow supports executing multiple steps in parallel.
Since each step returns a Promise, you can execute multiple steps concurrently by using Promise.all().
This behavior works out of the box. No additional configuration is required.
app/api/workflow/route.ts
import { serve } from "@upstash/workflow/nextjs";import { checkInventory, brewCoffee, printReceipt } from "@/utils";export const { POST } = serve(async (context) => { // 👇 Execute steps in parallel const [coffeeBeansAvailable, cupsAvailable, milkAvailable] = await Promise.all([ context.run("check-coffee-beans", () => checkInventory("coffee-beans")), context.run("check-cups", () => checkInventory("cups")), context.run("check-milk", () => checkInventory("milk")), ]);});The results of the parallel steps are available as usual once awaited.
The dashboard visualizes parallel execution as shown below:

You can also await different step types together. For example, you can run a context.call() and a context.run() in parallel.
Whether executing sequentially or in parallel, you should always
await all promises in a workflow.
Leaving promises unawaited may cause unexpected behavior.