HookGet Start free

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.
msg_01J8ZQ3F9VBAQ4E1S0TZY6P8YV order.created · 2 units
#TimeStatus CodeLatencyWhy
1 09:41:02 failed 503 1,204 ms Service Unavailable
2 09:41:07 failed 503 980 ms retried after 5s
3 09:41:37 failed timeout 15,000 ms retried after 30s
4 09:46:37 delivered 200 142 ms retried after 5m

Same webhook-id on every attempt, so the consumer can deduplicate.

Every attempt against one destination: what was sent, what came back, how long it took, and how long we waited before trying again. This is the answer to “did you send it?” without a database query.

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.

BeforeAfter
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
if customer.region == "eu" around the send A filter on the endpoint: {"data.region": "eu"}
"We'll add signatures later" Standard Webhooks on every delivery, with rotation

A migration that cannot surprise you

  1. Publish to HookGet in addition to your existing delivery, for one tenant.
  2. Compare: same events, same order, same destinations reached.
  3. Point that tenant's consumers at the new signature (or none, if you never signed).
  4. Stop your own delivery for that tenant. Keep the code for a week.
  5. 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.

Start delivering webhooks today

Dual-publish one tenant this afternoon. If the two timelines disagree, you have learned something either way.

Create a free account See pricing

10,000 deliveries a month free, no credit card. The free tier blocks rather than bills, so trying the product cannot produce an invoice — which is not true of every free tier in this category.