Skip to content

Triggering Tasks

Trigger Functions Reference

From your backend

FunctionDescription
tasks.trigger()Triggers a task, returns a handle
tasks.batchTrigger()Triggers a single task multiple times in a batch
batch.trigger()Trigger multiple different tasks in a batch

From inside another task

FunctionDescription
yourTask.trigger()Fire and forget — no result wait
yourTask.batchTrigger()Trigger same task multiple times, no wait
yourTask.triggerAndWait()Trigger and wait for result
yourTask.batchTriggerAndWait()Trigger multiple times, wait for all
batch.triggerAndWait()Batch trigger different tasks, wait for all
batch.triggerByTask()Batch trigger by passing task instances
batch.triggerByTaskAndWait()Batch trigger by task instances, wait

Triggering from Your Backend

Set TRIGGER_SECRET_KEY environment variable first. Use type-only imports for type safety:

ts
import { tasks } from "@trigger.dev/sdk";
import type { emailSequence } from "~/trigger/emails";

export async function POST(request: Request) {
  const data = await request.json();
  const handle = await tasks.trigger<typeof emailSequence>("email-sequence", {
    to: data.email,
    name: data.name,
  });
  return Response.json(handle);
}

triggerAndWait()

Trigger a task and wait for the result (use inside another task):

ts
export const parentTask = task({
  id: "parent-task",
  run: async (payload: string) => {
    const result = await childTask.triggerAndWait("some-data");
    if (result.ok) {
      console.log("Result", result.output);
    } else {
      console.error("Error", result.error);
    }
  },
});

Use .unwrap() to get output directly or throw on failure:

ts
const output = await childTask.triggerAndWait("some-data").unwrap();

Trigger Options

delay

ts
await myTask.trigger({ some: "data" }, { delay: "1h" });
await myTask.trigger({ some: "data" }, { delay: "30m" });
await myTask.trigger({ some: "data" }, { delay: "88s" });
await myTask.trigger({ some: "data" }, { delay: new Date("2025-01-01T00:00:00Z") });

ttl (Time to Live)

Auto-expire the run if it hasn't started within the TTL:

ts
await myTask.trigger({ some: "data" }, { ttl: "1h" });

idempotencyKey

Prevent duplicate runs:

ts
const idempotencyKey = await idempotencyKeys.create("my-task-key");
await childTask.trigger(payload, { idempotencyKey });

debounce

Collapse multiple rapid triggers into one:

ts
await myTask.trigger({ some: "data" }, {
  debounce: {
    key: "user-123",
    delay: "5s",
    mode: "trailing", // or "leading"
    maxDelay: "60s",
  }
});

queue

Override concurrency at trigger time:

ts
const handle = await generatePullRequest.trigger(data, {
  queue: { name: "main-branch", concurrencyLimit: 10 },
});

concurrencyKey

Create per-user (or per-entity) queues:

ts
const handle = await task.trigger(data, {
  queue: { name: "free-users", concurrencyLimit: 1 },
  concurrencyKey: data.userId,
});

maxAttempts

Override the retry count for this specific run:

ts
await myTask.trigger({ some: "data" }, { maxAttempts: 3 });

region

ts
await yourTask.trigger(payload, { region: "eu-central-1" });

machine

Override machine preset for this run:

ts
await yourTask.trigger(payload, { machine: "large-1x" });

version

Pin to a specific deployment version:

ts
await yourTask.trigger(payload, { version: "20250228.1" });

Streaming Batch Triggering

For large batches, pass an AsyncIterable or ReadableStream (SDK 4.3.1+):

ts
async function* generateItems() {
  for (const userId of payload.userIds) {
    yield { payload: { userId } };
  }
}
const batchHandle = await myOtherTask.batchTrigger(generateItems());

Large Payloads

  • Hard limit: 10MB
  • > 512KB: Auto-uploaded to S3-compatible object store, URL stored in payload
  • Task output limit: 100MB
  • Larger payloads: Upload to your own storage and pass a presigned URL

Built from official Trigger.dev documentation