The Vercel World is a fully-managed workflow backend for applications deployed on Vercel. It provides scalable storage, distributed queuing, and automatic authentication with zero configuration.
When you deploy to Vercel, workflows automatically use the Vercel World - no setup required.
Usage
Deploy your application to Vercel:
vercel deployThat's it. Vercel automatically:
- Selects the Vercel World backend
- Configures authentication using OIDC tokens
- Provisions storage and queuing infrastructure
- Isolates data per environment (production, preview, development)
Observability
Workflow observability is built into the Vercel dashboard on your project page. It respects your existing authentication and project permission settings.
The workflow CLI commands open a browser window deeplinked to the Vercel dashboard:
# List workflow runs (opens Vercel dashboard)
npx workflow inspect runs --backend vercel
# Launch the web UI (opens Vercel dashboard)
npx workflow web --backend vercelThe CLI automatically retrieves authentication from the Vercel CLI (vercel login) and infers project/team IDs from your local Vercel project linking.
To use the local observability UI instead of the Vercel dashboard:
npx workflow web --backend vercel --localUiTo override the automatic configuration:
npx workflow inspect runs \
--backend vercel \
--env production \
--project my-project \
--team my-team \
--authToken <your-token>Learn more in the Observability documentation.
Testing & Performance
E2E Tests
Spec compliance is tested against Next.js (Turbopack) built in production mode and started with `next start`. View CI run →
View comprehensive E2E test results against all frameworks/configurations
Benchmarks
Click on a benchmark to view performance history over the last 30 commits.
| Benchmark | Time | Min | Max | Samples | |
|---|---|---|---|---|---|
Promise.all with 10 concurrent steps | 2.77s | 2.20s | 3.72s | 7 | |
Promise.all with 25 concurrent steps | 2.87s | 2.34s | 3.78s | 7 | |
Promise.all with 50 concurrent steps | 2.96s | 2.62s | 3.50s | 7 | |
Promise.race with 10 concurrent steps | 2.23s | 2.09s | 2.92s | 8 | |
Promise.race with 25 concurrent steps | 4.11s | 2.35s | 10.66s | 6 | |
Promise.race with 50 concurrent steps | 2.87s | 2.61s | 3.06s | 7 | |
workflow with 1 step | 2.21s | 2.01s | 2.84s | 10 | |
workflow with 10 concurrent data payload steps (10KB) | 1.77s | 1.56s | 2.74s | 16 | |
workflow with 10 sequential data payload steps (10KB) | 11.89s | 9.94s | 13.63s | 5 | |
workflow with 10 sequential steps | 21.20s | 19.11s | 23.30s | 2 | |
workflow with 25 concurrent data payload steps (10KB) | 3.00s | 2.19s | 3.98s | 19 | |
workflow with 25 sequential data payload steps (10KB) | 32.82s | 31.41s | 35.35s | 3 | |
workflow with 25 sequential steps | 36.47s | 33.33s | 39.60s | 2 | |
workflow with 50 concurrent data payload steps (10KB) | 8.64s | 3.87s | 12.91s | 12 | |
workflow with 50 sequential data payload steps (10KB) | 88.63s | 85.23s | 92.03s | 2 | |
workflow with 50 sequential steps | 63.01s | 57.53s | 68.50s | 2 | |
workflow with no steps | 1.26s | 468ms | 4.96s | 10 |
Stream Benchmarks
| Benchmark | Time | TTFB | Slurp | Min | Max | Samples | |
|---|---|---|---|---|---|---|---|
| 10 parallel streams (1MB each) | 2.86s | 3.85s | — | 2.52s | 3.46s | 13 | |
| fan-out fan-in 10 streams (1MB each) | 4.08s | 5.41s | 0ms | 3.64s | 4.61s | 10 | |
| stream pipeline with 5 transform steps (1MB) | 4.31s | 5.91s | 578ms | 3.85s | 5.61s | 9 | |
| workflow with stream | 1.65s | 2.73s | 571ms | 1.53s | 1.79s | 10 |
Last updated: 3/27/2026, 6:59:55 PM · Commit: bfb1a60
Configuration
The Vercel World requires no configuration when deployed to Vercel. For advanced use cases, you can override settings programmatically via createVercelWorld().
WORKFLOW_VERCEL_ENV
The Vercel environment to use. Options: production, preview, development. Automatically detected.
WORKFLOW_VERCEL_AUTH_TOKEN
Authentication token for API requests. Automatically detected.
WORKFLOW_VERCEL_PROJECT
Vercel project ID for API requests. Automatically detected.
WORKFLOW_VERCEL_TEAM
Vercel team ID for API requests. Automatically detected.
WORKFLOW_VERCEL_BACKEND_URL
Custom base URL for the Vercel workflow API. Automatically detected.
Programmatic configuration
import { createVercelWorld } from "@workflow/world-vercel";
const world = createVercelWorld({
token: process.env.WORKFLOW_VERCEL_AUTH_TOKEN,
baseUrl: "https://api.vercel.com/v1/workflow",
projectConfig: {
projectId: "my-project",
teamId: "my-team",
environment: "production",
},
});Versioning
On Vercel, workflow runs are pegged to the deployment that started them. This means:
- Existing workflow runs continue executing on their original deployment, even as new code is deployed
- New workflow runs start on the latest deployment
- Code changes won't break in-flight workflows
This ensures long-running workflows complete reliably without being affected by subsequent deployments.
Security
Consumer function security
Workflow handler functions on Vercel are not accessible from the outside world. During the build step, the Workflow DevKit automatically configures each handler as a Vercel Queue consumer using experimentalTriggers in the function's .vc-config.json:
{
"experimentalTriggers": [
{
"type": "queue/v2beta",
"topic": "__wkf_step_*",
"consumer": "default",
"retryAfterSeconds": 5,
"initialDelaySeconds": 0
}
]
}Two internal queue topics are created per deployment:
| Handler | Topic pattern | Purpose |
|---|---|---|
| Step function | __wkf_step_* | Executes individual step functions with maxDuration: max |
| Workflow function | __wkf_workflow_* | Runs workflow orchestration logic with maxDuration: 60 |
With this configuration, both functions are completely air-gapped from the internet. They have no public URL and can only be invoked by Vercel's internal queue infrastructure. This means:
- You don't need to add authentication or authorization logic to workflow handlers
- Unauthorized requests can never reach the step or workflow functions
- Only messages delivered through Vercel Queues can trigger execution
- Handlers receive only a message ID that must be retrieved from Vercel's backend, making it impossible to craft custom payloads
The trigger configuration also controls retry behavior. Both handlers use retryAfterSeconds: 5 (compared to the default 60 seconds for regular queues) to keep workflow execution responsive.
| Option | Type | Default | Description |
|---|---|---|---|
type | string | — | Trigger type. Workflows use queue/v2beta |
topic | string | — | Topic name to consume. Supports wildcards (e.g., __wkf_step_*) |
consumer | string | — | Consumer group name |
retryAfterSeconds | number | 60s | Time before a failed message is retried |
initialDelaySeconds | number | 0s | Delay before the consumer starts processing after deploy |
This configuration is managed entirely by the Workflow DevKit build step. You never need to write this yourself — it's documented here for transparency. For custom framework integrations, see Framework Integrations — Security.
How It Works
The Vercel World uses Vercel's infrastructure for workflow execution:
- Storage - Workflow data is stored in Vercel's cloud with automatic replication and end-to-end encryption
- Queuing - Steps are distributed across serverless functions via Vercel Queues with automatic retries and consumer function security
- Authentication - OIDC tokens provide secure, automatic authentication
For more details, see the Vercel Workflow documentation.
Pricing and More
See the Vercel Workflow documentation for current pricing and to learn more.
For self-hosted deployments, use the Postgres World. For local development, use the Local World.
Limitations
- Single-region deployment - The backend infrastructure is currently deployed only in
iad1. Applications in other regions will route workflow requests toiad1, which may result in higher latency. For best performance, deploy your Vercel apps using Workflow toiad1. Global deployment is planned to colocate the backend closer to your applications.