runs — last 60 seconds
live
queue
state
took
emails
done
412 ms
webhooks
retry 2
1.9 s
exports
running
6.4 s
emails
done
388 ms
billing
dead letter
—
webhooks
done
2.2 s
queue depth 1,284
oldest 3.1 s
runs a month
enqueue, p95
uptime, last 90 days
regions
Running in production at
Northwind Freight
Kettle & Co
Blume Health
Ardwick Radio
Vesper Labs
Parcelgrid
Two Rivers Post
Halden Foods
Queues
Durable, ordered per key, and idempotent on the id you give them.
gantry.enqueue(“emails”, { to })
Workers
Long polling, graceful shutdown, and a concurrency limit per queue.
gantry worker --concurrency 32
Schedules
Cron with a timezone, and a window so a missed run still fires.
every(“0 6 * * 1-5”, tz)
Dead letter
Five attempts, then parked with the payload and the last error.
gantry dlq replay --queue billing
enqueue
14 ms
Your request writes the job and returns.
lease
40 ms
A worker takes it with a lock and a deadline.
attempt
412 ms
Your handler runs. Logs and timing are kept.
retry
if it fails
Failure backs off: 1 s, 4 s, 16 s, 1 m, 5 m.
done
Result stored for 30 days. Or parked in dead letter.
Every attempt keeps the error, the response code and the wait before the next try. No guessing from a log line that scrolled past. Backoff is 1 s, 4 s, 16 s, 1 m, 5 m, and you can set your own per queue.
Idempotency key per job, so a double enqueue is one run
Payload kept with the failure for 30 days
Replay from the dashboard or the CLI
The 3 a.m. page stopped
“We were retrying in a cron that ran every five minutes and nobody knew which jobs were stuck. Now the queue depth is on the wall and the dead letter is empty by lunch.”
Platform lead, logistics, 40 engineers
Deploys stopped losing work
“Workers finish what they leased before they exit. We deploy eleven times a day and the last dropped job was in March.”
Staff engineer, health, 120 engineers
The bill got smaller
“We were paying per connection on the old queue. Per run turned out to be a third of it, and the free tier covers staging.”
CTO, marketplace, 12 engineers
A good fit
You send email, build exports or call an API that is slower than your request
You deploy more than once a day and something is always mid-flight
You have a cron that checks whether the other cron ran
Somebody on the team can name the job that silently fails
Not a good fit
You need a workflow engine with branching, fan-out and human approval steps
Your jobs run for hours and need checkpointing inside the run
You are happy with one cron and a lock, which is a real answer
You cannot run a worker anywhere, including a container in your own cloud
14 ms
1.2 s
40 ms
310 ms
820 ms
190 ms
8 ms
Marks from your code
job.mark(“fetch invoice”) is one line and shows up as a span.
Kept for your window
7, 30 or 90 days by plan, and exported as JSON lines whenever you want.
Shipped out
Send the same spans to Datadog or any OTLP endpoint, one config block.
ams
fra
lhr
cdg
arn
waw
mad
mil
dub
zrh
iad
ord
dfw
sea
sjc
lax
yyz
yul
gru
scl
bog
mex
nrt
hnd
icn
sin
hkg
bom
del
syd
mel
akl
jnb
cpt
dxb
bah
tlv
ist
Postgres
Redis
SQS
Kafka
Datadog
Sentry
Slack
PagerDuty
Vercel
Fly.io
Railway
GitHub Actions
01
Dual write for a week
Enqueue to both your queue and Gantry. Nothing consumes from Gantry yet, so the only risk is a bigger bill for a week.
02
Move one queue
Pick the noisiest one, point its worker at Gantry, and watch both dashboards. Most teams pick the one that wakes them up.
03
Move the rest, delete the glue
The retry loop, the lock table and the cron that checks the cron all go. That is usually the part people enjoy.
If you are coming from Sidekiq, Celery, BullMQ or SQS, the migration guide has the mapping for the names you already use.
01
Install
terminal
npm i @gantry/node
One dependency. The CLI comes with it.
02
Enqueue
app/signup.ts
await gantry.enqueue(“emails”, {
to: user.email,
template: “welcome”
})
Returns in 14 ms. Your request is done.
03
Run a worker
terminal
gantry worker emails \
--concurrency 32
Locally or in your cluster. Same binary.
Team
per month, 5M runs
Unlimited queues
30 day history and replay
Schedules with a timezone
Email support, one business day
Start free
Scale
per 10k runs above 5M
Dedicated cluster on request
90 day history
SSO and audit log
Shared channel, 4 hour response
Talk to us
Parcelgrid
Logistics, 40 engineers
Cron jobs that overlapped and double-charged carriers
duplicate carrier bookings
“We had known about the overlap for a year and had a ticket for it. Moving it took an afternoon because we did not have to write the locking ourselves.”
Sanne de Groot, platform lead
Blume Health
Health, 120 engineers
Work lost on every deploy, found by the support inbox
jobs dropped since March
“The number that matters is zero, and it has been zero for six months. Before that it was maybe four a week and we only knew about the loud ones.”
Ezra Kaplan, staff engineer
Kettle & Co
Marketplace, 12 engineers
A queue bill that grew with connections, not with work
on the queue line of the bill
“I expected the migration to be the hard part. It was two days, mostly renaming things. The bill was the easy part.”
Marta Lindqvist, CTO
Payloads encrypted at rest
AES-256, keys rotated every 90 days. You can bring your own key on Scale.
Retention you choose
7, 30 or 90 days. Deleted means deleted, including from backups within 35 days.
Four subprocessors
Named on the security page with what each one sees. No advertising, ever.
SOC 2 Type II
Report from May 2026, available under NDA. Pen test twice a year.