Upstash Workflow JS
UpstashOfficialCreated by Upstash
- Skill
- Tool integration
- Cloud and DevOps
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Upstash Workflow SDK enables developers to create reliable, multi-step workflows within serverless environments. By leveraging QStash, it allows functions to survive timeouts, retries, and restarts, effectively managing long-running processes that span minutes or days without keeping the underlying function execution active. It supports complex orchestration patterns, including step-by-step execution, external API calls, event waiting, human-in-the-loop approvals, and sophisticated flow control.
What it does
- Exposes serverless endpoints for durable workflow execution.
- Manages multi-step processes that persist across function restarts and timeouts.
- Provides tools for flow control, including concurrency, rate limiting, and parallelism.
- Supports advanced patterns like cross-workflow invocation and waiting for external events.
- Enables local development and testing via the QStash dev server.
- Facilitates human-in-the-loop workflows and real-time updates.
When to use it
- When building long-running tasks that exceed standard serverless function execution limits.
- When implementing saga or orchestration patterns in a distributed system.
- When you need reliable background jobs with built-in checkpointing and retries.
- When building AI agents or orchestrators that require stateful, multi-step execution.
- When integrating human approval steps into automated backend processes.
Advantages
- Eliminates the need to hold serverless functions open for long durations.
- Built-in support for retries, failure callbacks, and dead-letter queues.
- Seamless integration with popular serverless platforms like Vercel and Cloudflare Workers.
- Simplifies complex state management for asynchronous operations.
Usage examples
- “How do I define a basic two-step workflow using the Upstash SDK?”
- The agent provides a code snippet using the serve() function and context.run() to define sequential steps that persist across execution.
- “How can I trigger a workflow from my existing backend code?”
- The agent demonstrates initializing the Workflow Client with a QStash token and using the trigger() method to initiate the workflow URL.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/upstash/upstash-workflow-js/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip upstash-workflow-js.zip -d .agents/skills
Documentation by Upstash
Upstash Workflow SDK
Bundled docs and source
Before writing or debugging SDK code, check node_modules/@upstash/workflow/docs/ for bundled docs and node_modules/@upstash/workflow/src/ for readable TypeScript source. Read and search the relevant files when present; otherwise use the references in this skill.
Quick Start
The Upstash Workflow SDK lets you expose serverless workflow endpoints and run them reliably using QStash under the hood.
Install:
npm install @upstash/workflowDefine a simple workflow endpoint:
import { serve } from "@upstash/workflow";
export const { POST } = serve(async (context) => {
await context.run("step-1", () => console.log("step 1"));
await context.run("step-2", () => console.log("step 2"));
});Trigger it from your backend:
import { Client } from "@upstash/workflow";
const client = new Client({ token: process.env.QSTASH_TOKEN! });
await client.trigger({ url: "https://your-app.com/api/workflow" });Other Skill Files
These files contain the full documentation. Use them for details, patterns, and advanced behavior.
basics:
basics/serve – How to expose workflow endpoints.
basics/context – Full API for workflow
context(steps, waits, webhooks, events, invoke, etc.).basics/client – Using the Workflow client to trigger, cancel, inspect, and notify runs.
features:
features/invoke – Cross‑workflow invocation.
features/reliability – Retries, failure callbacks, and DLQ.
features/flow-control – Rate limits, concurrency, and parallelism.
features/wait-for-event – Notify and wait-for-event patterns.
features/webhooks – Webhook creation and consumption.
how to:
how-to/local-dev – Local QStash dev server (auto via
QSTASH_DEV=true) and tunneling.how-to/realtime – Realtime and human‑in‑the‑loop workflows.
how-to/migrations – Migrating workflows safely.
how-to/middleware – Adding middleware to workflows.
other files:
rest-api – Low-level REST endpoints for interacting with QStash/Workflow.
troubleshooting – Common debugging and environment issues.
agents – Using Workflow with agents, orchestrators, and automation patterns.
Files
- ATTRIBUTION.mdAdded by AutoGineer892 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.4 KiB
- agents.md6.7 KiB
- basics/client.md4.1 KiB
- basics/context.md5.1 KiB
- basics/serve.md2.4 KiB
- features/flow-control.md3.9 KiB
- features/invoke.md2.6 KiB
- features/retries-failures-reliability.md6.3 KiB
- features/wait-for-event.md2.8 KiB
- features/webhooks.md2.5 KiB
- how-to/local-dev.md5.0 KiB
- how-to/middleware.md4.7 KiB
- how-to/migrations.md4.8 KiB
- how-to/realtime.md4.8 KiB
- rest-api.md6.6 KiB
- troubleshooting.md4.8 KiB
features/flow-control.md
Flow Control
Flow Control defines how many workflow steps may run or start within a given time, ensuring predictable load and preventing overload of internal or third‑party systems. It applies per flow control key, allowing steps across different workflow runs to share the same limits.
This skill documents:
parallelism
rate and period
monitoring
common behaviors and pitfalls
Core Concepts
Flow Control Key
A string identifier grouping related workflow steps under shared limits. All steps triggered with the same key share the same concurrency and rate budget.
const client = new Client({ token: "<QSTASH_TOKEN>" });
await client.trigger({
url: "https://<YOUR_ENDPOINT>",
flowControl: {
key: "user-onboarding", // Groups steps under this key
parallelism: 5, // max concurrent steps
rate: 20, // max starts per period
period: "1m", // time window
},
});Parallelism
Controls how many steps may run concurrently. Works like a token bucket: each running step consumes one token; when it finishes, the token is released.
If tokens are available → step starts immediately.
If no tokens → step enters the waitlist.
Token handoff is not FIFO; later steps may start earlier.
Example Behavior
parallelism = 3→ at most 3 steps run at the same time.Step 4 waits until one of the first 3 completes.
Parallelism affects execution concurrency, not rate‑of‑start per time window.
Rate & Period
Controls how many steps may START within a defined time window.
flowControl: {
key: "billing-jobs",
rate: 2, // allow 2 starts
period: "10s", // every 10 seconds
parallelism: 1, // can be combined
}Behavior:
First
ratesteps in each period start immediately.Additional steps wait until the next window.
Execution duration does not count toward the period; only start time matters.
This is rate limiting, not concurrency control.
Combining Rate + Parallelism
Both limits apply independently. A step must satisfy both to run.
Example:
rate = 3 per minuteparallelism = 7
Even if concurrency slots are free, steps may be delayed by the rate window. Even if rate window is open, steps may be delayed by concurrency.
This enables predictable load patterns.
Monitoring
Flow control queues and waitlists are visible from:
Console → FlowControl tab (waitlist size per key)
REST API:
List all keys
Get details for one key
Useful for diagnosing bottlenecks, long queues, or misconfigured limits.
Important Behaviors & Pitfalls
Limits are stored on each step
If you deploy new limits, previously published steps keep their original configuration.
No per‑step config (mostly)
All steps inherit the workflow‑run’s flowControl block. Exceptions:
context.call– may define a separate key to isolate API throttling.context.invoke– spawns a new workflow run with its own flowControl.
To isolate heavy or sensitive steps, move them into a separate workflow and invoke them.
Waitlist order is not guaranteed
A later step may receive a token before an earlier one. Do not rely on ordering.
Queueing is automatic
Exceeding limits never rejects steps. Everything is eventually executed.
Full Example
Demonstrates defining all parameters together and how they interact.
import { Client } from "@upstash/workflow";
const client = new Client({ token: "<QSTASH_TOKEN>" });
await client.trigger({
url: "https://<YOUR_WORKFLOW_ENDPOINT>/process",
flowControl: {
key: "media-processing", // Shared grouping key
parallelism: 4, // Max 4 at the same time
rate: 10, // Max 10 starts
period: "60s", // in 60 seconds
},
});This configuration:
ensures no more than 4 processing tasks run concurrently
ensures no more than 10 tasks start per minute
queues everything automatically beyond those limits
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
What our scanner noticed· Medium risk
- Possible data-exfiltration endpoints
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Upstash
- Publisher
- Upstash (Official)
- Source
- upstash/skills · skills/upstash-workflow-js · commit 9f9e3e5
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Upstash.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download upstash-workflow-js.zip