Expected: After send('my-topic', payload) succeeds, the push-mode consumer registered via experimentalTriggers in vercel.json should be invoked by Vercel’s queue infrastructure.
Actual: send() succeeds and messages appear in the Queues dashboard (Queued count increments), but the consumer handler is never invoked:
console.logat the top ofhandleCallbacknever fires — zero entries in Runtime Logs over 7+ days, across Preview and Production- Observability → Queues shows 0 Received, 0 Deleted, no Consumer Group for every topic in this project
- 3 different topics tried in this project — identical behavior on all three
- A separate test project I own (flat repo, Next.js 15, same SDK usage) works end-to-end, so I don’t think
handleCallback/vercel.jsonare wrong on my side
Consumer route (apps/client/app/api/queues/my-topic/route.ts):
import { handleCallback } from '@vercel/queue';
export const maxDuration = 60;
export const POST = handleCallback(async (message, metadata) => {
console.log('[Queue] Processing', metadata.messageId);
// … real work
});
Trigger config (apps/client/vercel.json):
{
"functions": {
"app/api/queues/my-topic/route.ts": {
"maxDuration": 60,
"experimentalTriggers": [{ "type": "queue/v2beta", "topic": "my-topic" }]
}
}
}
Producer (called from a normal route handler):
import { send } from '@vercel/queue';
const result = await send('my-topic', { hello: 'world' });
// result.messageId is a valid string — message is accepted
Steps:
- Deploy the above. Build succeeds. Route shows up in the build output.
- Hit any endpoint that calls
send()— Queues dashboard shows Queued count going up. - Wait any amount of time. Consumer
console.lognever appears. Received stays 0. No Consumer Group entry.
Things I’ve tried that did not fix it:
- Bootstrapping a stub consumer on production first, then testing from preview
- Creating a brand-new topic with a fresh name
- Bumping
@vercel/queue0.1.4 → 0.1.6 (latest) - Disabling Deployment Protection on preview (consumer URL goes from 401 → reachable)
- Disabling Attack Challenge Mode (was serving bot-challenge HTML to consumer URL)
- Adding a custom Allow rule for
/api/queues/* - Also placing
vercel.jsonat the monorepo root with paths qualified asapps/client/app/api/queues/…
- Framework: Next.js 16.1.4 with
cacheComponents: true(experimental) @vercel/queue: ^0.1.6- Structure: TurboRepo monorepo, Vercel Root Directory =
apps/client vercel.jsonlocation:apps/client/vercel.json"type": "queue/v2beta"inexperimentalTriggers(matches the quickstart docs)- Node 22.x
- Affected topics include queues used by an existing daily cron → the cron has been firing for a week with zero consumer invocations, so it’s not a recent regression in my code — looks like it’s been like this since the Next.js 16 upgrade.
Happy to share project ID / deployment IDs over DM if someone from the Queues team can verify whether the subscriptions were actually registered for this project.
Thanks!