Skip to main content
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:

The workflow executes three steps in parallel

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.