Quickstart
This guide shows how to send your first queue message and process it with the @vercel/queue SDK.
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 second route acts as a consumer. Vercel invokes it automatically in push mode.
- A Vercel account
- Vercel CLI installed (
npm i -g vercel) - Node.js 22+
Install
@vercel/queueso your app can send messages and receive push callbacks.Terminalpnpm i @vercel/queueThe 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 calls tosendandhandleCallbackcan't authenticate. When you deploy to Vercel, authentication is automatic and no environment setup is needed.Import
senddirectly from@vercel/queueand 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); }); Add a consumer trigger to wire your route to a topic. This makes the route private: it 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 handleCallback 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 (for example, during local development), it falls back to iad1.
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 next dev or vercel dev so you can test without deploying.
- Installed the SDK: Added
@vercel/queueto your project. - Created a producer: Published messages to the
orderstopic. - Configured a consumer: Registered a push trigger and handler to process messages.
Was this helpful?