Webhooks for your AI agents

Build AI agents on top of the services your customers already use, like Stripe, Supabase, Shopify, GitHub, Slack, ElevenLabs, and many more .

Get started now
Powering billions of runs at companies like:

Webhooks: how your customer's services talk to your AI agents

Webhooks are how the world's most popular services send updates.
On Trigger.dev you can receive webhooks and do three things:

Start an agent

A GitHub pull request, a Stripe payment or a Slack message starts a new run.

Resume an agent

A run paused for a payment or an approval picks up when the webhook arrives.

Message an agent

An event lands in the right agent's conversation, so it acts with full context.

Example: a Slack refund agent

Let's see what happens when a user asks a Slack agent to refund one of their customers.

support
Thread# support
J
Jordan9:41 AM
@Refund agent can you cancel Sam Ortiz’s subscription and refund the last six months?
No replies yet
Webhook endpoint

Receive the Slack request, verify it, and start the agent.

Refund agentReady
  1. Look up customer

    Find the customer and their recent payments.

    pending
  2. Request approval

    Send Approve and Deny buttons to the Slack thread.

    pending
  3. Wait for approval

    Save the run and wait. Resume when the decision arrives.

    pending
  4. Move to the free plan

    Update the subscription once the refund is approved.

    pending
  5. Refund six months

    Return six payments to the original payment method.

    pending
  6. Reply in Slack

    Confirm the outcome in the same Slack thread.

    pending
A Slack message asks the agent to cancel a subscription and issue a refund.

Connect to services your customers use

Svix

webhooks.svix() verifies any service that signs with Svix, using the svix-id, svix-timestamp, svix-signature headers. Clerk, Resend and Brex use it.

Standard Webhooks

webhooks.standardWebhooks() verifies any service that signs with Standard Webhooks, using the webhook-id, webhook-timestamp, webhook-signature headers. OpenAI, Replicate, Recall.ai and Composio use it.

Native integrations for Linear and Slack

At Trigger.dev we use Slack and Linear all day so we built custom packages to make it even easier to build agents on top of Linear and Slack.

Slack agents

@trigger.dev/slack
Slack → your agent
  • Messages and @mentions in a DM or channel thread
  • Approve and Deny button clicks
  • Files shared in the thread
Your agent → Slack
  • Each tool call as a step in a plan, ticked off as it finishes
  • The reply, streamed as the model writes it
  • Approval buttons, and Block Kit messages

Handled for you

Verifies Slack's signing secret, answers its URL handshake, and acknowledges each event right away. Slack's stop button stops the turn.

Linear agents

@trigger.dev/linear
Linear → your agent
  • A @mention in an issue
  • An issue assigned to the agent
  • Follow-up prompts and approval choices
Your agent → Linear
  • Thoughts and actions as the agent works
  • A plan, and an approval card when it needs a decision
  • A response when it's done, all in Linear's agent session UI

Handled for you

Verification, the 5-second acknowledgement, the first activity Linear expects within 10 seconds, and dedup of Linear's retries.

You could build…

Code review agent

Review every pull request as it opens: read the diff, leave comments, and re-review when new commits land.

Bug-fixing agent

A new Sentry issue starts an agent that finds the cause, writes a fix and opens a pull request.

Coding agent in Linear

Assign an issue to the agent. It posts its plan in the issue, writes the code, and links the pull request when it's done.

AI SRE

A PagerDuty alert wakes an agent that pulls the logs, finds the deploy that caused it, and posts a summary.

AI SDR

When a lead fills in a form, research the company and draft the outreach for a rep to approve.

Meeting prep agent

When someone books a call, research them and their company and send you a brief before the meeting.

Voice agent follow-ups

When an ElevenLabs voice call ends, read the transcript, update the customer's record and send the follow-up.

Support triage agent

Tag each new Intercom conversation, draft a reply from your docs, and route the hard ones to the right team.

Customer success agent

Reply to customers on WhatsApp, look up their account, and hand off to a human when it's unsure.

Onboarding agent

When someone signs up in Clerk, research their company, set up their workspace and draft a personal welcome email.

Billing ops agent

Handle refunds, failed payments and plan changes from Stripe events, with a human approving each refund.

Fraud review agent

Check every new Shopify order for fraud, hold the risky ones, and ask a human to release or cancel them.

Route webhooks to the right agents

GitHub · PR opened

A pull request sends one webhook.

Webhook endpoint

Verify, deduplicate, and start all four subscribers.

  • Code review agent

    waiting

    Reviews the diff

  • Triage agent

    waiting

    Labels the PR and picks reviewers

  • Security scan agent

    waiting

    Checks for secrets and risky dependencies

  • Preview deploy

    waiting

    Deploys a preview of the branch

One webhook can start up to 25 different tasks or agents.

Wait for events, humans or other agents

  1. Asks for approval

    The agent asks in Slack: refund $240 for order #4821?

    Pending
  2. Waits for a human

    The run suspends until someone approves. No compute while it waits.

    ApproveDeny
    Pending
  3. Issues the refund

    Slack’s webhook resumes the run. Stripe refunds the payment.

    Pending
  4. Replies in the thread

    The agent confirms the refund in the original Slack thread.

    Pending
ComputePending

Wait for human response, for any length of time. Even if the user takes months to respond.

You only pay while it runs. Waiting is free.

Docs

Your webhooks will never be lost

Stored before it's processed

Processing webhooks in the request is risky: Trigger.dev stores every webhook first. Then responds to the provider. And only then processes asynchronously with retries.

Deduplicated retries

Trigger.dev matches retries on the provider's event ID where it sends one (Stripe's event id, GitHub's delivery header), so a retry doesn't start a second run.

Rate limits per endpoint

Each endpoint and each environment has a request limit. Over it, we tell the provider to try again later (429 with Retry-After), so the event is sent again rather than lost.

Provider

Stripe, GitHub, Slack…

Ready to send request

Verified

signature or secret checked

Deduplicated

seen it before? dropped

Recorded

durably queued

Trigger.dev only returns 200 OK once the delivery is durably stored.

Full observability over every webhook, every function and every tool call

Every delivery recorded

Headers, body and the result for every agent it was routed to, with links to the runs it started.

Docs

See why it was filtered

A filtered delivery shows the reason, so you can tell a skipped event from a broken one.

Docs

Every agent run traced

Every run has a full trace. With the AI SDK, you can trace each LLM call and tool call, with the model, tokens and cost.

Docs

Replay from your coding agent

Replay a delivery from the API or MCP server. Your coding agent can list, inspect and replay failed ones.

Docs

Secure and enterprise ready

Signature verification

Built-in sources for Stripe, GitHub, Shopify and dozens more check each provider's signature. Bad requests are rejected before a run starts.

Docs

Any auth scheme

For anything else, define a custom source with an HMAC, a shared secret (header, bearer token or basic auth), a URL secret, or a public key (Ed25519, ECDSA or RSA).

Docs

Replay protection

Sources can enforce a timestamp tolerance, so an old signed request can't be sent again to start a run.

Docs

Encrypted, rotatable secrets

Signing secrets and public keys are stored encrypted and never shown again after you save them. Rotate one from the dashboard, the API or the MCP server, with no code change.

Docs

We had a separate webhook service that checked signatures, filtered events and handed them to our Trigger tasks. With Trigger webhooks the events go straight to the tasks that already do the work, which means one less service to deploy, keep secrets for, and keep alive.

Pape Sow Traoré

Pape Sow Traoré

Classmoji

classmoji

I've been waiting for this feature! Previously, I had to route everything through Vercel, which felt unnecessary. Trigger.dev keeps my codebase much cleaner by avoiding endless endpoint switches for dozens of events.

Frequently asked questions

How much do webhooks cost?

There's no separate charge for receiving webhooks. The tasks and agents a webhook starts are billed like any other run, by compute time. See pricing for each plan.

Am I charged while a run waits for a webhook?

No. A waiting run is suspended and uses no compute. A run can wait up to 90 days for a webhook, and an agent can wait as long as it takes for a human to answer.

Am I charged for webhooks my filters skip?

No. As we ingest the webhook, we run this filter, and we don't run any compute if this filter says false. You can still see it in your dashboard and you could replay it.

What are the limits on each plan?

Each endpoint accepts 100 requests every 10 seconds on Free, 300 on Hobby and 1,000 on Pro, with custom limits on Enterprise. Over a limit, the endpoint answers 429 with Retry-After, so the provider sends the event again later. See the limits docs for waiters and per-environment limits. Delivery history is kept for 3 days on Free, 7 on Hobby and 30 on Pro, and 90 to 365 days on Enterprise.

What if my provider isn't on the list?

Define a custom source with an HMAC signature, a shared secret, a URL secret or a public key. Providers that sign with Svix or Standard Webhooks work with webhooks.svix() and webhooks.standardWebhooks(). See sources .

Can I self-host webhooks?

Yes. Webhooks are open source, part of the Apache 2.0 Trigger.dev project. You can self-host them or run them on Trigger.dev Cloud. View on GitHub .

Ready to connect your first provider?

Declare an endpoint, run trigger dev, and paste the URL into your provider.

Get started for free