Vercel Queues for Sume job webhooks: dedupe on job_id

Vercel Queues delivers at least once and bills keyed sends at 2x. To relay Sume webhooks through it, use job_id as the key and ack fast on the 10s limit.

4 min readSume
All posts

If you put Vercel Queues behind a Sume webhook receiver, make the receiver store the event, enqueue it, and return 2xx quickly, and use the Sume job_id as the idempotency key on both sides. Vercel says delivery is at-least-once, so your consumer must tolerate duplicates; Sume's webhook docs give the same advice about job_id.

Vercel facts are from its Queues concepts and pricing pages, read 2026-09-30. Sume facts are from Webhooks. Neither page gives a total price for your workload, so this post covers behavior, not a bill.

What does Sume require from the receiver?

Return any 2xx after durably storing the event, and use job_id as your idempotency key. Sume tries up to 10 times, with a fixed delay between attempts (30s by default), and each attempt times out after 10s. A slow endpoint burns that budget and gets retried. So the HTTP handler should only verify, publish to the queue, and answer; do the real work in the consumer.

What does Vercel Queues add?

Retention is configurable per message from 60 seconds to 7 days, default 24 hours. You can include an idempotency key when publishing so Vercel deduplicates, and the dedupe window lasts for the message's lifetime (up to its TTL). The pricing page says sends with an idempotency key are billed at 2x units for that operation.

Both sides of the relay, from the Vercel and Sume docs read 2026-09-30
ConcernVercel QueuesSume webhooks
Delivery guaranteeAt-least-onceUp to 10 attempts
Dedupe keyOptional key on publish, billed 2xjob_id on your side
Time limitLease and visibility timeout (default 60s)10s per attempt
Default retention24 hoursNot applicable

Is a queue enough to never lose a result?

No. The Sume docs call delivery an optimization, never the only recovery path: ten refused attempts leave a failed delivery and a job that still reached its terminal state. Keep status_url polling available for events that never arrive. A 24-hour default queue retention is also a limit if your consumer is down longer. See also Cloudflare Workers Queues for video webhooks.

Should I pay for keyed sends?

Only if you want Vercel to drop duplicates before they reach the consumer. Since your consumer must be idempotent anyway, a database unique constraint on job_id gives the same protection without the 2x operation. Which you choose is a cost judgment for your own volume.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume