Stripe wants enabled_events trimmed; Sume sends only terminal events
Stripe advises subscribing only to needed event types. Sume sends only terminal job and run events, with the URL set on each request. Here is the mapping.

Stripe's best practices say to configure each webhook endpoint to receive only the event types your integration needs, using enabled_events. Sume has no such list to trim. Its webhooks fire on terminal events only, and the URL is set on each request rather than registered once for your account.
Stripe's model: register once, then filter
On Stripe you create an event destination and choose the event types. Stripe warns that listening for extra events, or all events, puts undue strain on your server. It also allows up to 16 destinations per mode, so a team often splits endpoints by concern.
Sume's model: per call, terminal only
On Sume you pass a public HTTPS webhook_url on the request that starts the work. The events are job.completed, job.failed and job.canceled for jobs, and format.run.terminal, action.run.terminal and agent.run.terminal for runs. Every one is a terminal event. There are no progress events to subscribe to. For progress, poll status_url or read the events_url.
| Question | Stripe | Sume |
|---|---|---|
| Where the URL lives | Registered destination | On each request as webhook_url |
| Choosing events | enabled_events per destination | No list in the docs I read |
| Kinds of event | Many resource event types | Terminal events only |
| Canceled or skipped work | Depends on the event type | Canceled and skipped runs deliver no webhook |
What changes in a handler
Because the URL is per request, you can send different jobs to different handlers without any registration step. You can also send many jobs to one URL and tell them apart by job_id, which is the idempotency key in any case.
- Route on event, then on status. status OK or ERROR tells you the branch, and outcome (ok, degraded, error) refines it for runs.
- Do not wait for a progress event. There will not be one.
- A canceled or skipped run sends nothing, so a handler that waits for a callback on a canceled run will wait forever. Cancel from your side and mark it yourself.
- Return 204 or 200 for an event name you do not know, so a new event type does not turn into retries.
Porting tip
If you are moving a multi-event Stripe handler to Sume, start from the families you actually call. A team that only submits jobs needs one route for the three job events. A team that runs Formats needs one for format.run.terminal and should look at both status and outcome, since a degraded run still reports status OK.
Document the contract in your own code: which events you expect, which you ignore, and what you do with an unknown name. That makes a later change, such as a new terminal event type, a one-line decision instead of an incident. Return a 2xx for ignored events so the sender does not retry them.
Sources
Related posts
More in Developers
- Stripe resend keeps auto-retries; Sume redeliver uses no attempt
Stripe's manual resend does not cancel automatic retries and works 15 to 30 days. Sume redeliver sends a fresh signature after ten attempts and keeps the URL.
- Stripe says one restricted key per service: Sume scopes per job
Stripe recommends restricted keys, one per service. Sume keys have fixed scopes. Map each webhook operation to its scope and give the handler no more.
- Stripe replays a saved 500 for the same key; Sume releases it
Stripe saves the first result for a key, even a 500, and replays it. Sume replays a finished receipt, but a create that fails with 402 or 503 releases its key.
- Stripe thin events: fetch the object, vs a Sume webhook receipt
Stripe thin events are GA for v1 resources in Endive: you fetch the object. A Sume webhook carries the receipt; an oversized one points to result_url.
Written by Sume