Background jobs are one of those areas every solo SaaS founder eventually hits and almost no one wants to spend a week on. You ship the product, then realize the welcome email needs to send a minute after signup, the AI image generation takes 90 seconds and can’t block the request, the daily-digest cron fires at 8am, and an OpenAI call occasionally fails so you need retries. Suddenly you’re looking at Redis, BullMQ, a worker process, a deployment story, and a way to actually see what’s running. Trigger.dev is one of the platforms trying to make that whole pile go away.

Methodology. This is a research-based overview. We have not personally built production apps with Trigger.dev; this article synthesizes the company’s documentation at trigger.dev/docs, public pricing at trigger.dev/pricing, the Trigger.dev v3 announcement, and third-party user reports from public discussions. Last reviewed: May 7, 2026.

What Trigger.dev actually is

Trigger.dev is an open-source background-job platform built specifically for TypeScript. The current generation, v3, shipped in 2024 and is a substantial rewrite of the original product — the v2 model relied on long-lived integrations and webhook delivery, while v3 centers on a simpler primitive: tasks, which are TypeScript functions you push to Trigger.dev’s runtime and invoke from anywhere in your app. The runtime takes care of executing them, retrying them, scheduling them, and showing you what happened.

The pitch is: write your background job as a regular TypeScript function, and Trigger.dev handles the rest of the queue infrastructure. No Redis, no worker process, no separate dashboard. Trigger.dev runs as a hosted Cloud product or as a self-hosted deployment, and the codebase is open source under a permissive license.

Core capabilities

Five primitives do most of the work:

  • Durable runs. When a task starts, its execution state is checkpointed. If the runtime crashes mid-task or hits a transient error, the run resumes from where it left off rather than starting over — critical for long-running AI jobs where restarting means burning a fresh $0.50 of inference cost.
  • Schedules. Cron syntax, declared inline with the task: cron: "0 8 * * *" for an 8am daily run. No separate scheduler service, no Vercel Cron route file.
  • Queues with concurrency limits. Each task can declare a queue and a concurrency cap. If you’re calling an LLM that rate-limits at 10 requests per second, set the queue concurrency to 10 and the runtime fans tasks out at exactly that rate.
  • Batch tasks. Trigger many instances of a task at once with a single call, then wait for all of them or stream their results. Useful for fan-out patterns like “regenerate thumbnails for all 4,000 images.”
  • Retries with exponential backoff. Configurable per task. Default policy retries failed runs with increasing delay; the task code can also throw a special “non-retryable” error to opt out for permanent failures.

Each of these maps onto something you’d otherwise build by gluing BullMQ, Bee-Queue, or a custom Postgres-as-a-queue setup together. The integration is the value, not any single feature in isolation.

Defining a task

A task in Trigger.dev v3 is a TypeScript file that exports a task definition. The shape, per the docs:

import { task } from "@trigger.dev/sdk/v3";

export const sendWelcomeEmail = task({
  id: "send-welcome",
  run: async (payload: { userId: string }) => {
    const user = await db.users.findById(payload.userId);
    await resend.emails.send({
      to: user.email,
      from: "hi@yoursaas.com",
      subject: "Welcome",
      html: renderWelcomeTemplate(user),
    });
    return { sent: true };
  },
});

Three things are worth noticing. First, the task is just a function. There’s no special class, no decorator, no separate worker file. Second, the id is the stable name Trigger.dev uses to address the task — you can rename the file and the variable, but changing the id detaches it from its run history. Third, the payload is fully typed, and the SDK uses that type to give you compile-time safety when you trigger the task elsewhere in the codebase.

Triggering looks like this from a Next.js server action, a webhook handler, or another task:

await sendWelcomeEmail.trigger({ userId: user.id });

That call doesn’t execute the function in your app process. It enqueues the task with the Trigger.dev runtime, which executes it on its own infrastructure. Your server action returns immediately; the user gets a response in milliseconds; the email goes out asynchronously. The same pattern works for AI generation jobs that take 90 seconds, batch report generation that fans out across thousands of records, or webhook processing that needs reliable retries.

Observability

Most homegrown background-job setups die not because the queue fails but because nobody can tell what’s happening when it does. Trigger.dev’s built-in dashboard is a meaningful chunk of the value proposition:

  • Run timelines. Every task invocation gets a run page showing the payload, the execution timeline, every log line in order, and the final return value or error.
  • Retry history. When a task fails and retries, you see each attempt as a separate row with its error and timestamp. No grepping logs to reconstruct the sequence.
  • Real-time logs. logger.info() calls inside a task stream into the dashboard live, so you can watch a long-running job progress.
  • Search and filter. Find runs by task id, status, time range, or payload contents.

Compared to a self-hosted BullMQ + Bull Board setup, the polish gap is large. Compared to “tail the Vercel logs and hope,” the gap is even larger. Observability is the thing founders most often skip when they roll their own queues, and Trigger.dev makes it the default rather than a bolt-on.

Pricing tiers

Trigger.dev publishes four plans on trigger.dev/pricing:

Free
$0/month
  • 50 runs per day included
  • 5 concurrent runs at a time
  • Full feature set: durable runs, schedules, queues, retries, dashboard
  • 7-day log retention
  • Community Discord support
  • Generous enough to validate a side project before paying anything
Pro
$50/month base + usage
  • Substantially higher run and concurrency limits
  • Per-unit overage rates published on the pricing page
  • Multiple environments (staging + production)
  • Priority support
  • Designed for revenue-generating SaaS at low-to-mid scale
Enterprise
Custom
  • Everything in Pro
  • SOC 2, SLA, dedicated support
  • Custom data residency and contractual terms
  • Negotiated commit pricing

Self-hosting is free and fully open source. The trade-off is that you’re running the infrastructure: a Postgres database, a Redis instance, the Trigger.dev backend services, and however many worker containers your workload needs. For solo founders the math usually works out to “Cloud is cheaper than the time spent self-hosting,” but the option is real and not hobbled. Always reconcile current numbers against the public pricing page; cap structures shift periodically.

The self-host vs Cloud tradeoff

Three considerations matter when deciding between hosted Trigger.dev and a self-hosted deployment:

  • Cost at scale. Below a few thousand runs per day, Cloud is cheaper than the cost of a Postgres instance plus Redis plus a worker host. Past tens of thousands of runs per day, self-hosting starts to win, especially if you already operate Kubernetes.
  • Compliance. If your customers require that no payload data leaves your infrastructure, self-hosting is the only path. The Cloud version is a managed third-party processor.
  • Operational maturity. Self-hosting Trigger.dev means owning a stateful queue system. If you’ve never operated Postgres replication or recovered a corrupted Redis, the operational tax is real. Cloud removes that entirely.

Most solo founders should start on Cloud and revisit the question only if they hit a clear cost or compliance trigger. Premature self-hosting is one of the easier ways to burn a weekend per month on infra you didn’t need to own.

When Trigger.dev fits

Three product shapes where Trigger.dev is genuinely the right pick:

  • Long-running AI generation jobs. A 60-second image generation, a 3-minute video render, a multi-step LLM agent. Durable runs, retries, and observability are the features that make these jobs stop being a source of pages and customer complaints.
  • Multi-step workflows. “On signup, send the welcome email, generate the onboarding embedding, queue a Day-3 follow-up, and call the Stripe webhook to record the trial.” Each step is a task; the orchestration is one parent task that triggers the others. We walk through this pattern in our how to build a SaaS with Claude guide.
  • Anything that needs durable execution and observability. If a failure costs money (a wasted LLM call) or trust (a missing customer email), the dashboard plus retry semantics earn their keep within the first incident.

The common thread: jobs with logic, jobs with cost, and jobs you can’t afford to silently drop. The deeper your background work goes, the more value the platform extracts.

When Trigger.dev doesn’t fit

Two scenarios where Trigger.dev is overkill:

  • A hyper-simple daily-digest cron. If your only background work is “hit this URL once a day at 8am,” Vercel Cron is fine. It’s in the platform you already use, costs nothing extra, and doesn’t require a second SDK. The setup is documented in our Vercel Cron walkthrough.
  • Very high QPS event processing. If you’re ingesting tens of thousands of events per second — ad-tech-style throughput — Trigger.dev is built for run-shaped workloads, not stream processing. Inngest may scale better in that range, and a dedicated stream system (Kafka, Redpanda, or a managed alternative) is often the right answer.

Most solo SaaS founders are comfortably between these two extremes. The middle is where Trigger.dev shines.

Trigger.dev vs Inngest vs Vercel Cron vs BullMQ

Trigger.dev vs Inngest

Inngest is the closest competitor — both are TypeScript-native background-job platforms with hosted and self-host options. Inngest emphasizes event-driven workflows and step functions; Trigger.dev emphasizes the durable-run primitive with queues and schedules layered on top. For event-fanout patterns and very high throughput, Inngest’s model often feels more natural. For long-running tasks with cost-sensitive retries (LLM jobs, video pipelines), Trigger.dev’s checkpoint model is a closer match. Both have generous free tiers; the right pick is shaped more by your workload than by raw feature count.

Trigger.dev vs Vercel Cron

Vercel Cron is the lightweight option. It’s a built-in feature of Vercel that calls a route in your Next.js app on a cron schedule. There’s no separate SDK, no separate dashboard, no concurrency control, no retries beyond what your route does itself, and no observability beyond the Vercel logs. For a daily-digest cron or a weekly cleanup job, that’s genuinely enough. The moment your job needs retries, durable execution, or any concurrency story, Vercel Cron stops scaling and Trigger.dev becomes the right pick. We compare hosting platforms more broadly in Vercel vs Railway.

Trigger.dev vs BullMQ

BullMQ is the “build it yourself” baseline. You provision Redis, write your worker process, deploy that worker somewhere, and add Bull Board for the dashboard. BullMQ is mature, free, and fully under your control. It’s also a project of its own — the operational tax of running stateful Redis with replication and the engineering tax of building observability that approaches what Trigger.dev ships out of the box are both real. For a solo founder optimizing for shipped features per week, the trade often goes against rolling your own.

The solo-founder reality check

Trigger.dev is the right pick when at least one of the following is true: your background work has more than five lines of logic, retries matter for cost or correctness reasons, or you need to be able to see what’s actually running in production. If none of those apply — if your background work is one route fired by Vercel Cron once a day — the platform is overkill and there’s no shame in the simpler tool.

The free tier is generous enough to validate fit without paying anything: 50 runs a day and 5 concurrent runs covers a real side project or pre-revenue beta. If the SDK and the dashboard feel right at that scale, the upgrade path to Hobby and Pro is gradual and the prices are in line with the rest of the modern dev-tool stack we cover in our best SaaS tools for developers roundup.

For AI-first SaaS specifically — the kind of product covered in our AI chatbot SaaS guide — the durable-run primitive is hard to give up once you’ve seen it work. LLM calls are slow, occasionally flaky, and expensive enough that “just retry the whole thing” is the wrong default. Trigger.dev’s checkpoint model treats this as the central case, not an edge.

The verdict

Trigger.dev v3 is the strongest TypeScript-native background-job platform on the market for solo founders who’ve outgrown Vercel Cron but don’t want to babysit Redis. The free tier is generous, the dashboard is a real feature rather than an afterthought, the durable-run model maps cleanly onto AI-shaped workloads, and the open-source license keeps the lock-in story honest.

The honest caveats: you’re adopting another SDK and another dashboard, the run meter is something to model against your actual workload, and at the simplest end of the spectrum a single Vercel Cron route is still a perfectly reasonable answer. For anything past that floor, Trigger.dev deserves a serious look.

Related reading

Get one SaaS build breakdown every week

The stack, prompts, pricing, and mistakes to avoid — for solo founders building with AI.