Quickstart
This guide shows how to send your first queue message and process it with the Vercel Queues SDK.
Help me set up Vercel Queues in this project. First, make sure the Vercel CLI is installed (`npm i -g vercel`). If I'm using Claude Code or Cursor, install the Vercel Plugin (`npx plugins add vercel/vercel-plugin`). For other agents, install Vercel Skills (`npx skills add vercel-labs/agent-skills`). Detect whether this is a JavaScript/TypeScript or Python project. Then: 1. Install @vercel/queue for JavaScript/TypeScript or vercel-queue for Python. 2. Run `vercel link` and `vercel env pull` to get OIDC credentials. 3. Create a producer that sends messages to an 'orders' topic using send. 4. For JavaScript/TypeScript, create a consumer route using handleCallback and configure its queue trigger in vercel.json. For Python, create a function decorated with @subscribe and declare its dotted Python module path, such as queues.orders, as the entrypoint in [[tool.vercel.subscribers]] in pyproject.toml. 5. Test locally with `vercel dev`.
In this quickstart:
- Your API route acts as a producer. It sends work to a queue topic.
- The topic (
orders) stores messages durably until a consumer processes them. - A consumer processes the message. Vercel invokes it automatically in push mode.
- A Vercel account
- Vercel CLI installed (
npm i -g vercel) - Node.js 22+ for Node.js apps, or Python 3.12+ for Python apps
Install the SDK so your app can send messages and receive push callbacks.
Terminalpnpm i @vercel/queueTerminalyarn add @vercel/queueTerminalnpm i @vercel/queueTerminalbun add @vercel/queueTerminaluv add vercelTerminalpip install vercelThe SDK authenticates via OIDC. Link your project if you haven't already, then pull environment variables so the SDK can authenticate during local development:
Terminalvercel link vercel env pullThis creates a
.env.localfile containing the OIDC tokens the SDK needs to connect to Vercel Queues from your machine. Without it, local SDK calls can't authenticate. When you deploy to Vercel, authentication is automatic and no environment setup is needed.Import
senddirectly and call it from any server-side context: a route handler, a Server Action, a Workflow step, or an error handler.app/cart/checkout/route.tsimport { send } from '@vercel/queue'; export async function POST(request: Request) { const order = await request.json(); const { messageId } = await send('orders', order); return Response.json({ messageId }); }- app/api/queues/fulfill-order/route.ts
import { handleCallback } from '@vercel/queue'; export const POST = handleCallback(async (order, metadata) => { // await chargePayment(order); // await sendConfirmationEmail(order); console.log('Fulfilling order', metadata.messageId, order); }); For JavaScript and TypeScript, add a consumer trigger to
vercel.json. For Python, setentrypointinpyproject.tomlto the subscriber's Python module import path. For example, usequeues.ordersfor the module atqueues/orders.py. The Python build imports the module, reads the@subscribeconfiguration, and generates the queue-triggered function.Both configurations make the consumer private. The consumer has no public URL, and only Vercel's queue infrastructure can invoke it.
vercel.json{ "functions": { "app/api/queues/fulfill-order/route.ts": { "experimentalTriggers": [{ "type": "queue/v2beta", "topic": "orders" }] } } }
The top-level send and callback helpers use an auto-configured default client. The region is detected from the VERCEL_REGION environment variable, which Vercel sets on every deployment. If the region can't be detected, the Node.js SDK falls back to iad1. In Python, pass region or set VERCEL_REGION when you run outside Vercel. Python send() chooses the serializer from the payload type, including Pydantic models through model_dump_json().
To target a specific region when sending, pass the region option:
await send('orders', payload, { region: 'sfo1' });If your handler crashes after charging payment but before sending the email, Vercel redelivers the message so the email still goes out. If the email call fails, the message comes back and your handler runs again. Make each step idempotent (for example, pass an idempotency key to your payment provider) so retries are safe.
This works locally with vercel dev so you can test without deploying. Next.js projects can also use next dev.
- Installed the SDK: Added the Vercel Queues package for your language.
- Created a producer: Published messages to the
orderstopic. - Configured a consumer: Registered a private push consumer to process messages.
Was this helpful?