Trigger.dev is the best developer experience I've seen for long TypeScript jobs: write a task, trigger it from your backend, and get retries, a page per run with its logs, free pauses and live progress in the UI without building any of it. A run has no time limit, and a task that waits on a person is saved and costs nothing until it resumes. It's open source and can be self-hosted.
I skip it for my clients for two reasons. The code and the data leave their AWS account for machines in a region nobody publishes, and everything it does for a long job, Fargate and durable functions already do inside AWS, at about a sixth of the compute price. What it really saves is the plumbing: the retries, the dashboard and the progress channel you'd otherwise build. For a startup that isn't on AWS, that's worth paying for. The full comparison, priced on four jobs, is in Longer than 15 minutes.
Use it when
- A team not on AWS, or not wanting to build the plumbing, with TypeScript jobs started from an app: a report button, a video render, a 40-minute agent run.
- The job mostly waits on its own pauses (a person's approval, a callback, subtasks): the run is saved and costs nothing while it waits.
- The app must show the job's progress live: its Realtime API and React hooks stream status, metadata and even an LLM's output to the browser.
Don't use it when
- The data must stay in the client's AWS account or in Australia: tasks run on Trigger.dev's machines, and no region is published.
- Scheduled, CPU-heavy jobs: a Fargate task does the same for about a sixth of the price.
- More than 8 vCPU or 16 GB: Fargate goes to 16 vCPU, 120 GB and 200 GB of disk.
Pricing
Hobby $10 and Pro $50 a month, each including that much usage. Compute per second while a task runs: 1 vCPU / 2 GB $0.306 an hour, 2 vCPU / 4 GB $0.612, up to 8 vCPU / 16 GB at $2.448. Plus $0.25 per 10,000 runs. Waits are not billed. Pro includes 200 concurrent runs, then $10 per 50.
Gotchas, with fixes
Gotcha: Only its own waits are free. An ordinary await on an LLM or an API is still billed by the second.
Fix: Use wait.for, waitpoints and triggerAndWait for the long pauses, and price the rest as compute.
Gotcha: Its machines need a route to your database, which usually means opening it to the internet.
Fix: Use AWS PrivateLink (Pro), or keep jobs that touch private data inside AWS.
Provisioning
No provider · No Terraform provider
Deployed with its CLI (trigger deploy). No Pulumi or Terraform provider.
Use instead
Fargate scheduled tasks for long jobs, and Lambda durable functions for waits and retries, inside the client's AWS account.
Alternatives
- Fargate scheduled tasks Long jobs inside AWS, at about a sixth of the price.
- Lambda durable functions Pauses, waits and per-step retries inside AWS.
- Inngest Orchestration over code that runs on your own hosting.
Decision guides
Where it fits
- A job that runs for hours: Don't.
Does the job well, but on its own machines outside the client's AWS account, with no region published, at about six times Fargate's price.
Instead: Fargate scheduled tasks or Lambda durable functions
Sources
Last reviewed by Nicolas Dao