# Compared with alternatives

> Good Webhooks against Svix, Outpost, Convoy, and pg-boss plus fetch. What each does, what this library does not have, and when to pick which.

Source: https://good-webhooks.dev/docs/concepts/compared

Four other ways to send webhooks from an application, checked against their own documentation, repositories, and pricing pages on 27 October 2026. The [notes on the table](#notes-on-the-table) give the detail behind each cell, and the [sources](#sources) are listed at the end. Open an [issue](https://github.com/pplytas/good-webhooks/issues) if a claim is out of date.

| Option               | What it is               |
| -------------------- | ------------------------ |
| Svix                 | Hosted service           |
| Outpost              | Go event gateway         |
| Convoy               | Go webhook gateway       |
| pg-boss plus `fetch` | Job queue plus your code |

[Svix](https://www.svix.com) is a hosted webhook service with an open-source Rust server that covers part of it.

[Outpost](https://hookdeck.com/outpost) is a Go event-destinations gateway by Hookdeck, self-hosted or managed, that sends to webhooks and message queues.

[Convoy](https://getconvoy.io) is a Go webhook gateway with a dashboard, self-hosted or cloud, with paid features behind a license key.

[pg-boss](https://github.com/timgit/pg-boss) plus `fetch` is a PostgreSQL job queue for Node.js plus about 50 lines of your own that sign and send each request.

## What each does [#what-each-does]

| Feature      | Good Webhooks | Svix           | Outpost       | Convoy        | pg-boss     |
| ------------ | ------------- | -------------- | ------------- | ------------- | ----------- |
| Outbox       | Yes           | No             | No            | No            | Yes         |
| Signing spec | Standard      | `svix-*` names | Optional      | Own           | Build it    |
| Retries      | 8 over 28 h   | 8 over 28 h    | 10 over 8.5 h | Configurable  | 2, no delay |
| Auto-pause   | Yes           | Yes            | Optional      | Optional      | No          |
| Replay       | Yes           | Yes            | Per event     | Yes           | `retry()`   |
| Headers      | Yes           | Yes            | Yes           | Per event     | Build it    |
| Rate limits  | No            | Yes            | No            | Yes           | No          |
| Dashboard    | No            | Hosted only    | Portal        | Yes           | Jobs only   |
| Pull API     | No            | Enterprise     | No            | No            | No          |
| Transforms   | No            | Hosted only    | No            | Paid          | Build it    |
| Storage      | PostgreSQL    | PostgreSQL     | Redis, DB, MQ | PG and Redis  | PostgreSQL  |
| Hosting      | Library       | Cloud or self  | Cloud or self | Cloud or self | Library     |
| License      | MIT           | MIT            | Apache 2.0    | ELv2          | MIT         |
| Price        | Free          | Free tier      | Free to run   | Free to run   | Free        |

### Notes on the table [#notes-on-the-table]

- **Outbox in your own transaction**
  - Good Webhooks: yes, `publish()` joins your transaction.
  - Svix: no, you call its HTTP API and keep your own outbox.
  - Outpost: no, you call its HTTP API or write to a queue.
  - Convoy: no, you call its HTTP API or a broker.
  - pg-boss plus `fetch`: yes, `send()` takes your transaction.
- **Signing standard**
  - Good Webhooks: Standard Webhooks with HMAC-SHA256.
  - Svix: Standard Webhooks under `svix-*` names, `webhook-*` on paid plans or by a server switch.
  - Outpost: its own `x-outpost-signature` by default, Standard Webhooks as an option.
  - Convoy: its own `X-Convoy-Signature`, not Standard Webhooks.
  - pg-boss plus `fetch`: none, you sign each request yourself.
- **Retries and `Retry-After`**
  - Good Webhooks: eight attempts over about 28 hours, and `Retry-After` on `429` and `503`.
  - Svix: the same eight-step schedule, with `Retry-After` found only in the open-source code.
  - Outpost: ten retries, exponential from 30 seconds (about 8.5 hours), and `Retry-After` not found.
  - Convoy: linear or exponential backoff per project, and `Retry-After` not found.
  - pg-boss plus `fetch`: two retries with no delay by default, and `Retry-After` is yours to parse.
- **Pause on failing endpoints**
  - Good Webhooks: automatic after five days of failures or a `410`, resume by API.
  - Svix: automatic after five days of failures, re-enable by API or in the dashboard.
  - Outpost: off by default; when on, after 100 consecutive failures.
  - Convoy: dead endpoints when `disable_endpoint` is on, plus a circuit breaker on paid plans.
  - pg-boss plus `fetch`: none, exhausted jobs go to a dead letter queue if you set one.
- **Replay**
  - Good Webhooks: one delivery or one page of an endpoint's deliveries, same event ID and body.
  - Svix: one message, recover failed from a date, or replay missing.
  - Outpost: one event to one destination per call.
  - Convoy: one delivery or a filtered batch, plus a force retry for successes.
  - pg-boss plus `fetch`: `retry()` on a failed job, and each retry overwrites the last attempt.
- **Per-endpoint headers**
  - Good Webhooks: yes.
  - Svix: yes.
  - Outpost: yes, off in the portal by default.
  - Convoy: per event, plus one API-key header per endpoint.
  - pg-boss plus `fetch`: you build it.
- **Rate limiting to receivers**
  - Good Webhooks: no, only a per-endpoint `maxInFlight` cap.
  - Svix: yes, a messages-per-second `throttleRate` per endpoint.
  - Outpost: no, excluded by design.
  - Convoy: yes, `rate_limit` per endpoint.
  - pg-boss plus `fetch`: no, only group concurrency and throttled sends.
- **Dashboard or portal**
  - Good Webhooks: neither.
  - Svix: both on the hosted service, neither in the open-source server.
  - Outpost: a receiver portal ships in the open-source repository.
  - Convoy: a dashboard in the community edition, and Portal Links on paid plans.
  - pg-boss plus `fetch`: a job dashboard package, no receiver portal.
- **Receiver pull API**
  - Good Webhooks: no.
  - Svix: polling endpoints on the Enterprise plan.
  - Outpost: no.
  - Convoy: no.
  - pg-boss plus `fetch`: no.
- **Transformations**
  - Good Webhooks: no.
  - Svix: JavaScript on the hosted service.
  - Outpost: no, only through the separate Hookdeck Event Gateway.
  - Convoy: JavaScript on paid plans.
  - pg-boss plus `fetch`: whatever your handler does.
- **Storage**
  - Good Webhooks: your PostgreSQL.
  - Svix: PostgreSQL plus optional Redis when self-hosted, not documented when hosted.
  - Outpost: Redis, PostgreSQL or ClickHouse, and a message queue.
  - Convoy: PostgreSQL 15 or later, plus Redis 6 or later unless you use its experimental paid PostgreSQL queue.
  - pg-boss plus `fetch`: your PostgreSQL.
- **Hosting model**
  - Good Webhooks: a library in your app plus a worker you run.
  - Svix: hosted service, self-hosted Rust server, or on-prem on Enterprise.
  - Outpost: self-hosted Go service, or managed by Hookdeck.
  - Convoy: self-hosted Go service, Convoy Cloud, or on-prem on Enterprise.
  - pg-boss plus `fetch`: a library in your app plus a worker you run.
- **License**
  - Good Webhooks: MIT.
  - Svix: MIT for the server and SDKs.
  - Outpost: Apache 2.0.
  - Convoy: Elastic License 2.0, which is source-available.
  - pg-boss plus `fetch`: MIT.
- **Price**
  - Good Webhooks: free.
  - Svix: free to 50k messages a month, then from $20 or $490 a month plus $0.0001 per message.
  - Outpost: free to self-host, managed from $10 per million events after 50k free.
  - Convoy: free to self-host with 1 user and 2 projects, then $999 a month, or $99 or $499 cloud.
  - pg-boss plus `fetch`: free.

General notes:

- The pg-boss column means pg-boss plus `fetch`.
- The default Good Webhooks retry schedule is the one Svix publishes.
- Svix's open-source server caps a `Retry-After` wait at twice the scheduled delay, and the hosted service documents neither `Retry-After` nor `410`.
- Endpoint management with the [Better Auth plugin](https://good-webhooks.dev/docs/better-auth.md) lives in your Better Auth database, whatever its engine, and delivery stays on PostgreSQL.
- Good Webhooks encrypts per-endpoint headers at rest and reserves `webhook-*`, `content-type`, and `user-agent`.
- "Not found" in a note means the feature appears in neither the documentation nor the source on the check date.

## What Good Webhooks does not have [#what-good-webhooks-does-not-have]

- **A dashboard.** Svix's hosted service and Convoy ship one, and here you build admin pages on [`deliveries.list()`](https://good-webhooks.dev/docs/operations/retries-and-replay.md#inspect-deliveries).
- **A receiver portal.** Svix's hosted service, Outpost, and Convoy's paid plans give endpoint owners a UI, and here the [Better Auth routes](https://good-webhooks.dev/docs/better-auth.md) give signed-in users endpoint management without a UI.
- **Transformations.** Svix runs JavaScript per endpoint and Convoy on broker sources, and here the validated payload is sent as is.
- **mTLS to receivers.** Svix and Convoy offer it on Enterprise plans.
- **Rate limiting to receivers.** Svix and Convoy accept a per-endpoint rate, and here each endpoint has only a [`maxInFlight`](https://good-webhooks.dev/docs/reference/delivery.md#deliverysettings) cap of 2 by default.
- **Storage other than PostgreSQL.** Delivery needs PostgreSQL 16, 17, or 18, and nothing else is supported.
- **A hosted service.** Svix, Outpost, and Convoy each run one.
- **Ordering guarantees.** Svix sells FIFO endpoints on Enterprise and pg-boss has a strict FIFO policy per key, and here delivery is [at least once with no order](https://good-webhooks.dev/docs/concepts/delivery-guarantees.md), so receivers compare versions.
- **Senders in other languages.** The sender is TypeScript on Node.js 24 or later, while receivers in any language verify with any Standard Webhooks library.

The [roadmap](https://github.com/pplytas/good-webhooks/blob/main/docs/roadmap.md) marks the dashboard, portal, transformations, mTLS, other delivery databases, and a hosted service as not planned, and a per-endpoint rate limit as a candidate after 0.6.0.

## When to pick which [#when-to-pick-which]

- **Svix** when you want a hosted service with a receiver portal, an SLA, and SDKs in nine languages, and you accept a per-message bill and an outbox of your own for atomicity.
  - Its open-source server is the choice when you want that API on your own PostgreSQL without the portal.
- **Outpost or Convoy** when several services in different languages publish events, or you need queue destinations (Outpost) or broker ingestion with a dashboard (Convoy), and you can run a Go service with Redis and more.
  - Convoy is Elastic License 2.0, and its community edition allows 1 user and 2 projects.
- **pg-boss plus `fetch`** when you send to a few endpoints you control, nobody registers their own, and the last attempt is all the history you need.
  - The 50 lines grow with the Standard Webhooks checklist: SSRF checks, `410`, `Retry-After`, secret rotation, attempt history, and replay by event ID.
- **Good Webhooks** when a TypeScript app on PostgreSQL lets users or organizations register endpoints, you want each event committed with your data and no new service, and you can run a worker and build any UI yourself.

## Sources [#sources]

All checked on 27 October 2026.

- Svix: [retries](https://docs.svix.com/retries), [signature verification](https://docs.svix.com/receiving/verifying-payloads/how-manual), [throttling](https://docs.svix.com/throttling), [custom headers](https://docs.svix.com/receiving/additional-authentication), [App Portal in open source](https://docs.svix.com/app-portal/oss), [polling endpoints](https://docs.svix.com/receiving/using-app-portal/polling-endpoints), [FIFO endpoints](https://docs.svix.com/advanced-destinations/fifo-endpoints), [transformations](https://docs.svix.com/transformations), [reliability guide](https://www.svix.com/resources/guides/webhook-reliability/), [pricing](https://www.svix.com/pricing/), [server README](https://github.com/svix/svix-webhooks/blob/main/README.md), [license](https://github.com/svix/svix-webhooks/blob/main/LICENSE), and [releases](https://github.com/svix/svix-webhooks/releases) (server 1.103.0, 26 October 2026).
- Outpost: [overview](https://hookdeck.com/docs/outpost), [publishing](https://hookdeck.com/docs/outpost/publishing/events), [webhook destination](https://hookdeck.com/docs/outpost/destinations/webhook), [event delivery](https://hookdeck.com/docs/outpost/features/event-delivery), [operator events](https://hookdeck.com/docs/outpost/features/operator-events), [tenant portal](https://hookdeck.com/docs/outpost/features/tenant-user-portal), [architecture](https://hookdeck.com/docs/outpost/self-hosting/architecture), [deployment](https://hookdeck.com/docs/outpost/self-hosting/deployment), [pricing](https://hookdeck.com/outpost/pricing), [license](https://github.com/hookdeck/outpost/blob/main/LICENSE), and [releases](https://github.com/hookdeck/outpost/releases) (1.7.0, 23 October 2026).
- Convoy: [sources](https://getconvoy.io/docs/product-manual/sources), [signatures](https://getconvoy.io/docs/product-manual/signatures), [retries](https://getconvoy.io/docs/webhook-guides/webhook-retries), [circuit breaker](https://getconvoy.io/docs/product-manual/circuit-breaker), [dead endpoints](https://getconvoy.io/docs/glossary/dead-endpoints), [endpoints](https://getconvoy.io/docs/product-manual/endpoints), [portal links](https://getconvoy.io/docs/product-manual/portal-links), [functions](https://getconvoy.io/docs/product-manual/functions), [architecture](https://getconvoy.io/docs/deployment/architecture), [paid features](https://getconvoy.io/docs/business-and-enterprise/paid-features), [pricing](https://getconvoy.io/pricing), [license](https://github.com/frain-dev/convoy/blob/main/LICENSE), and [releases](https://github.com/frain-dev/convoy/releases) (26.9.2, 20 October 2026).
- pg-boss: [README](https://github.com/timgit/pg-boss/blob/master/README.md), [adapters and transactions](https://github.com/timgit/pg-boss/blob/master/docs/api/adapters.md), [jobs](https://github.com/timgit/pg-boss/blob/master/docs/api/jobs.md), [queues](https://github.com/timgit/pg-boss/blob/master/docs/api/queues.md), [dashboard](https://github.com/timgit/pg-boss/blob/master/docs/dashboard.md), [license](https://github.com/timgit/pg-boss/blob/master/LICENSE), and the [npm registry](https://www.npmjs.com/package/pg-boss) (12.38.0, 13 October 2026).
- Standard Webhooks: [the specification](https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md) for the sender checklist.
- Good Webhooks: [delivery guarantees](https://good-webhooks.dev/docs/concepts/delivery-guarantees.md), [retries and replay](https://good-webhooks.dev/docs/operations/retries-and-replay.md), [security model](https://good-webhooks.dev/docs/concepts/security.md), and the [changelog](https://github.com/pplytas/good-webhooks/blob/main/CHANGELOG.md) for 0.6.0 and the 0.7.0 plan.
