Moving off your own webhooks table
Most webhook systems are a table and a background job. That version works — this page is about the point where it stops being the cheapest option.
In short
- The pitch is not "replace your provider" — it is "get what you never built".
- Publishing replaces one function call in your code; consumers gain signatures and replay.
- Keep your table for a while and dual-publish; the comparison is the proof.
- If delivery is your product, keep building it. This page says so plainly.
The signs it is time
- Support asks "did we send it?" and the answer requires a database query.
- One slow customer endpoint delays deliveries for everyone.
- A failed delivery is discovered by the customer, not by you.
- Nobody wants to touch the retry logic because it is subtle and unowned.
- Secrets have never been rotated because there is no way to do it without dropping traffic.
What the change looks like in code
The function that used to enqueue a delivery becomes one HTTP call. Fan-out, retries, signing, the dead-letter queue and the log stop being yours.
| Before | After |
|---|---|
deliver_webhook(tenant, payload) |
POST https://api.hookget.com/v1/events with the tenant's key |
A webhooks table and a worker |
Nothing — the event log and the timeline replace both |
| Retry logic in your job runner | A schedule per endpoint, changeable without a deploy |
| "We'll add signatures later" | Standard Webhooks on every delivery, with rotation |
A migration that cannot surprise you
- Publish to HookGet in addition to your existing delivery, for one tenant.
- Compare: same events, same order, same destinations reached.
- Point that tenant's consumers at the new signature (or none, if you never signed).
- Stop your own delivery for that tenant. Keep the code for a week.
- Repeat, then delete the worker.
When to keep building it yourself. If webhook delivery is a differentiating part of your product, if you need delivery semantics nobody else offers, or if your volume makes per-delivery pricing worse than an engineer's time — keep it. That is a real answer and we would rather say it than sell around it.