You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 4ae1b8b
Browse filesBrowse the repository at this point in the historyBrowse files
docs(webhooks): pricing and per-plan webhook limits (#5051)
Adds webhooks pricing and per-plan limits to the docs ahead of the
webhooks launch on Mon Oct 26 (TRI-14179).
## Pricing
Webhooks have no separate charge. The runs a delivery starts or resumes
are billed as normal compute (Eric in #project-webhooks, Oct 20).
Filtered deliveries start no run, and waiting runs are suspended, so
neither uses compute.
## Changes
- `docs/limits.mdx`: new sections for webhook waiters, processing
concurrency, delivery retention and subscribers per endpoint (values
from `enterprise/apps/billing/app/plans/v3.server.ts` and
`MAX_WEBHOOK_SUBSCRIBERS_PER_ENDPOINT`). The existing ingest-rate tables
and the `#webhook-ingest-rate-limits` anchor are unchanged.
- `docs/webhooks/overview.mdx`: new "Pricing and limits" section.
- `docs/webhooks/deliveries.mdx`: new "Retention" section.
- `docs/webhooks/waiters.mdx`: links the plan-dependent limits to the
new table.
- `docs/how-to-reduce-your-spend.mdx`: new tip, "Filter webhooks before
they start runs".
- `trigger-cost-savings` skill: one bullet on webhook filters, plus a
patch changeset for `@trigger.dev/sdk`.
`mint broken-links` passes.
## To confirm before merging
- [ ] "No separate charge" holds after the beta too, not only during it.
- [ ] The per-plan webhook limits are live on prod (the
`webhook-limits-backfill` has run).
Waiting saves you compute, but it doesn't always free up concurrency — see [Wait](/wait).
192
192
193
+
## Filter webhooks before they start runs
194
+
195
+
Give each [webhook](/webhooks/overview) subscriber a [filter](/webhooks/filters) so it only runs for the events it handles. A delivery that no subscriber's filter matches starts no run for any subscriber, so you aren't charged for it. Filters only apply to subscribers: a run [waiting](/webhooks/waiters) for a matching webhook still resumes and uses compute. Receiving webhooks has no separate charge.
196
+
193
197
## Use debounce to consolidate multiple triggers
194
198
195
199
When a task might be triggered multiple times in quick succession, use debounce to consolidate them into a single run. This is useful for document indexing, webhook aggregation, cache invalidation, and real-time sync scenarios.
Copy file name to clipboardExpand all lines: docs/limits.mdx
+41Lines changed: 41 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -178,6 +178,47 @@ All of an environment's endpoints also share a per-environment limit, counted in
178
178
| Pro | 3,000 every 10 sec |
179
179
| Enterprise | Set per organization |
180
180
181
+
## Webhook waiters
182
+
183
+
A [waiter](/webhooks/waiters) is a run paused until a matching webhook arrives. The per-endpoint limit is also the most waiting runs one delivery can resume.
184
+
185
+
| Pricing tier | Live waiters per environment | Live waiters per endpoint |
| Enterprise | Set per organization | Set per organization |
191
+
192
+
A waiter can wait for up to 90 days.
193
+
194
+
## Webhook processing concurrency
195
+
196
+
This limit controls how many webhook deliveries and waiter resumes are processed at once per environment. Additional deliveries wait their turn. It is not a limit on the runs those deliveries start, which use your normal [concurrency limits](#concurrency-limits).
197
+
198
+
| Pricing tier | Limit |
199
+
| :----------- | :----------------------- |
200
+
| Free | 5 concurrent deliveries |
201
+
| Hobby | 10 concurrent deliveries |
202
+
| Pro | 50 concurrent deliveries |
203
+
| Enterprise | Set per organization |
204
+
205
+
## Webhook delivery retention
206
+
207
+
How long [deliveries](/webhooks/deliveries) stay visible in the dashboard and the API.
208
+
209
+
| Pricing tier | Limit |
210
+
| :----------- | :--------------------------- |
211
+
| Free | 3 days |
212
+
| Hobby | 7 days |
213
+
| Pro | 30 days |
214
+
| Enterprise | 90, 180 or 365 days |
215
+
216
+
By default, deliveries are stored for at least 30 days, so upgrading your plan shows older deliveries that are still stored. An organization can ask us to store deliveries only for its retention period instead. Deliveries past that period are then deleted and can't be shown again after an upgrade.
217
+
218
+
## Webhook subscribers
219
+
220
+
An endpoint can have up to 25 subscribers (tasks, agent sessions and channels) on every plan.
Copy file name to clipboardExpand all lines: docs/webhooks/deliveries.mdx
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -70,6 +70,10 @@ The [MCP server](/mcp-introduction) has `list_webhook_deliveries` (filter by end
70
70
|[`GET /api/v1/webhooks/deliveries/{deliveryId}`](/management/webhooks/retrieve-delivery)| Reads a delivery, with a `targets` entry per subscriber and one for waiting runs. |
71
71
|[`POST /api/v1/webhooks/deliveries/{deliveryId}/replay`](/management/webhooks/replay-delivery)| Replays it, as above. The key needs permission to trigger every task the replay starts, and to write sessions if it reaches an agent's subscriber. |
72
72
73
+
## Retention
74
+
75
+
Deliveries stay visible for 3 days on Free, 7 days on Hobby, 30 days on Pro, and 90, 180 or 365 days on Enterprise. See [Limits](/limits#webhook-delivery-retention).
76
+
73
77
## Deduplication
74
78
75
79
Trigger.dev uses the endpoint and idempotency key to deduplicate incoming events. Delivery records and task runs have separate deduplication windows:
Copy file name to clipboardExpand all lines: docs/webhooks/overview.mdx
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -83,6 +83,14 @@ The CLI finds your endpoints and subscribers during `trigger dev` and deployment
83
83
84
84
A request must pass verification before anything else happens. Provider handshakes are answered directly and create no delivery. A verified request is checked for duplicates, recorded, and then routed: each subscriber's filter is checked, matching subscribers run, and waiting runs whose match fits the event are resumed. The delivery records a result per subscriber.
85
85
86
+
## Pricing and limits
87
+
88
+
Webhooks have no separate charge on Trigger.dev Cloud. Receiving, verifying, filtering and recording deliveries is included in every plan. The runs a delivery starts or resumes are billed like any other run: a per-run invocation cost plus compute time. See [pricing](https://trigger.dev/pricing).
89
+
90
+
A delivery that no subscriber's filter matches starts no run for any subscriber, so it costs nothing. A run already waiting for that webhook still resumes. A run [waiting](/webhooks/waiters) for a webhook is suspended, so it uses no compute until the webhook arrives.
91
+
92
+
Each plan sets limits on the ingest rate, waiting runs, processing concurrency and how long deliveries are kept. See [Limits](/limits#webhook-ingest-rate-limits).
93
+
86
94
## Connect it
87
95
88
96
Every endpoint can produce a setup prompt for an AI coding agent. It holds the URL, the events your subscribers filter on, and the steps for registering the endpoint and its signing secret with the provider. Copy it from the endpoints list or the endpoint's page, or read it with the MCP server's `get_webhook_endpoint_details` tool. See [Connect a provider](/webhooks/connect).
Copy file name to clipboardExpand all lines: docs/webhooks/waiters.mdx
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -178,13 +178,13 @@ if (!result.cancelled) {
178
178
179
179
| Limit | Default |
180
180
| --- | --- |
181
-
| Live waiters per endpoint | 10,000. This is also the most one delivery can resume. |
182
-
| Live waiters per environment | 1,000,000 on self-hosted installs. |
181
+
| Live waiters per endpoint |Depends on your plan on Trigger.dev Cloud, 10,000 on self-hosted installs. This is also the most one delivery can resume. |
182
+
| Live waiters per environment |Depends on your plan on Trigger.dev Cloud, 1,000,000 on self-hosted installs. |
183
183
| Distinct sets of `match` paths per endpoint | 25 |
184
184
| Paths per `match`| 5 |
185
185
| Tags per waiter | 10 |
186
186
| Timeout | 24 hours by default, 90 days at most |
187
187
188
-
On Trigger.dev Cloud the per-endpoint and per-environment limits depend on your plan. Self-hosted installs can change them with `WEBHOOK_WAITER_MAX_PER_ENDPOINT`, `WEBHOOK_WAITER_MAX_PER_ENVIRONMENT` and `WEBHOOK_WAITER_MAX_SHAPES`.
188
+
On Trigger.dev Cloud the per-endpoint and per-environment limits depend on your plan: see [Limits](/limits#webhook-waiters). Self-hosted installs can change them with `WEBHOOK_WAITER_MAX_PER_ENDPOINT`, `WEBHOOK_WAITER_MAX_PER_ENVIRONMENT` and `WEBHOOK_WAITER_MAX_SHAPES`.
189
189
190
190
A delivery that resumes waiters shows one **Waiting runs** row on its [delivery page](/webhooks/deliveries#where-a-delivery-went) with how many matched, resumed and failed. A delivery that arrives while runs are waiting but matches none of them, and no subscriber takes, is `UNMATCHED`.
Copy file name to clipboardExpand all lines: packages/trigger-sdk/skills/trigger-cost-savings/SKILL.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -105,6 +105,7 @@ Larger machines cost proportionally more per second of compute:
105
105
## Key principles
106
106
107
107
-**Waits > 5 seconds are free** — checkpointed, no compute charge.
108
+
-**Webhook filters skip runs** — a webhook delivery starts no run when no subscriber's filter matches, so it costs no compute (a run already waiting for that webhook still resumes). Receiving webhooks has no separate charge.
108
109
-**Start small, scale up** — the default `small-1x` is right for most tasks.
109
110
-**I/O-bound tasks don't need big machines** — API calls and DB queries wait on the network.
110
111
-**Debounce saves the most on high-frequency tasks** — it consolidates bursts into single runs.
0 commit comments