---
name: Workflow Released
slug: upstash-workflow-released
type: feed
source_url: https://github.com/orgs/upstash/discussions/categories/w-released
organization: Upstash
organization_slug: upstash
total_releases: 7
latest_date: 2026-03-31
last_updated: 2026-04-19
tracking_since: 2025-11-05
canonical: https://releases.sh/upstash/upstash-workflow-released
organization_url: https://releases.sh/upstash
---

<Summary type="rolling" window-days="90" release-count="2">
Workflow shipped v1.0.0 with breaking changes focused on improving developer experience and reducing bundle size, then added sensitive data redaction across logs and API responses. The redaction feature lets developers specify which request bodies and headers to mask when triggering workflows, addressing data safety in multi-tenant setups where customer information may leak into logs.
</Summary>

<Summary type="monthly" period="March 2026" release-count="1">
Workflow added sensitive data redaction to console and API logs, letting developers mark request bodies and specific headers as redacted when triggering workflows. This prevents accidental exposure of secrets and customer data in dashboards and API responses, making multi-tenant setups safer.
</Summary>

<Release date="March 31, 2026" published="2026-03-31T11:38:44.000Z" url="https://github.com/orgs/upstash/discussions/191">
## Sensitive Data Redaction On Console/API

Workflow logs may contain sensitive data in the body or headers. Users need a way to redact these fields so they are not visible in the dashboard or API responses, preventing accidental data leaks. This also enables safer use of Workflow in multi-tenant setups where customer data may be included in logs.

## API

Allow specifying fields to redact when triggering a workflow.

" });

const { workflowRunId } = await client.trigger({
  url: "https://my-app.com/api/workflow",
  body: { hello: "world" },
  redact: {
    body: true,
    header: ["Authorization"] // or `header: true` to redact all headers
  },
});">import { Client } from "@upstash/workflow";

const client = new Client({ token: "" });

const { workflowRunId } = await client.trigger({
  url: "https://my-app.com/api/workflow",
  body: { hello: "world" },
  redact: {
    body: true,
    header: ["Authorization"] // or `header: true` to redact all headers
  },
});

In this example, the log body and the "Authorization" header are redacted and will not appear in the UI or API responses. Instead, the UI will display `REDACTED:` so users can verify the value without revealing the original data.

Docs: [https://upstash.com/docs/workflow/howto/redact-fields](https://upstash.com/docs/workflow/howto/redact-fields)
</Release>

<Release version="1.0.0" date="January 20, 2026" published="2026-01-20T07:01:32.000Z" url="https://github.com/orgs/upstash/discussions/185">
## Workflow SDK Major Version Upgrade to 1.0.0

This major version of the TypeScript SDK is done with breaking changes to improve the developer experience, reduce bundle size, and simplify configuration. We have prepared a migration guide for existing users below:

[https://upstash.com/docs/workflow/howto/migrations](https://upstash.com/docs/workflow/howto/migrations)
</Release>

<Release date="December 9, 2025" published="2025-12-09T12:35:05.000Z" url="https://github.com/orgs/upstash/discussions/151">
## Wait for Webhook

We currently provide a wait–notify mechanism that allows a workflow run to pause on an event ID and resume when a notify call is received. This works well when developers control both sides of the communication and can send the notification directly.

However, when a workflow needs to wait for a notification from a third-party provider, developers must register a waiter for a specific event ID, expose a custom endpoint to receive the third-party webhook, and then manually call our notify API with the event ID to resume the workflow. This process adds overhead and can lead to race conditions.

To improve the developer experience for webhook-based integrations and eliminate race conditions, we're introducing a new **native webhook wait API**. This API allows a workflow run to pause execution until an auto-generated webhook URL receives a notification. The generated URL can be passed directly to third-party providers, which will automatically notify the corresponding workflow run.

Each webhook can receive multiple notifications and be awaited multiple times.

Below is an early draft of the API (subject to change before release):

 {

    // 👇 Create a webhook to recieve events
    const webhook = await context.createWebhook("fal-generation-webhook");

    await context.run("start-generation", async () => {
      const { request_id } = await fal.queue.submit("fal-ai/flux/dev", {
        input: {
          prompt: "a cat",
          seed: 6252023,
          image_size: "landscape_4_3",
          num_images: 4,
        },
        // 👇 Pass webhook.url to third-party service
        webhookUrl: webhook.url,
      });
      return request_id
    });

    // 👇 Wait for webhook to be called
    const result = await context.waitForWebhook("wait-until-generation-completes", webhook, "1d");

    await context.run("send-generation-to-user", async () => {
      // 👇 result.timeout OR result.request
      const req = result.request!;

      // 👇 Use the native Request object of the webhook call
      const data = await req.json();
      console.log("Generation completed:", data.status);
    });
  }
);
">import { serve } from "@upstash/workflow/nextjs";
import { fal } from "@fal-ai/client";

export const { POST } = serve(
  async (context) => {

    // 👇 Create a webhook to recieve events
    const webhook = await context.createWebhook("fal-generation-webhook");

    await context.run("start-generation", async () => {
      const { request_id } = await fal.queue.submit("fal-ai/flux/dev", {
        input: {
          prompt: "a cat",
          seed: 6252023,
          image_size: "landscape_4_3",
          num_images: 4,
        },
        // 👇 Pass webhook.url to third-party service
        webhookUrl: webhook.url,
      });
      return request_id
    });

    // 👇 Wait for webhook to be called
    const result = await context.waitForWebhook("wait-until-generation-completes", webhook, "1d");

    await context.run("send-generation-to-user", async () => {
      // 👇 result.timeout OR result.request
      const req = result.request!;

      // 👇 Use the native Request object of the webhook call
      const data = await req.json();
      console.log("Generation completed:", data.status);
    });
  }
);
</Release>

<Release date="November 11, 2025" published="2025-11-11T10:12:46.000Z" url="https://github.com/orgs/upstash/discussions/172">
## Request Builder History

Remember last X triggers from the console so that it can be run again easily.

This is aimed for development purposes.
</Release>

<Release date="November 6, 2025" published="2025-11-06T12:12:40.000Z" url="https://github.com/orgs/upstash/discussions/169">
## Flow Control UI

Add ability to list the flow-controls on the console together with their waitListSizes.

Make it searchable.
</Release>

<Release date="November 5, 2025" published="2025-11-05T19:43:58.000Z" url="https://github.com/orgs/upstash/discussions/175">
## Workflow Restart/Resume

Add ability to restart or resume a workflow from the DLQ.

- Restart  : Ignore already completed steps and start the workflow from the beginning with the original body and headers.

- Resume: Keep the completed steps and try to run the workflow starting from that point on.

See [https://upstash.com/docs/workflow/features/dlq#recovery-actions](https://upstash.com/docs/workflow/features/dlq#recovery-actions)
</Release>

<Release date="November 5, 2025" published="2025-11-05T19:34:57.000Z" url="https://github.com/orgs/upstash/discussions/174">
## Local Development Environment UI

Workflow requires a publicly available API to send messages to. During development when applications are not yet deployed, developers typically need to expose their local API by creating a public tunnel. While local tunneling works seamlessly, it requires code changes between development and production environments and increase friction for developers. To simplify the development process, Upstash provides QStash CLI, which allows you to run a development server locally for testing and development.

With this work, the same UI that is given on the console.upstash.com can be used with local server(QStash CLI)

See [https://upstash.com/docs/workflow/howto/local-development/development-server](https://upstash.com/docs/workflow/howto/local-development/development-server)
</Release>
