Webhook infrastructure
Webhooks your customers can rely on.
Relay queues, signs, retries and logs every webhook you send. Your team stops maintaining delivery code, and your customers stop asking where their events went.
50,000 events a month free. No card needed.
| Time | Event | Endpoint | Status | ms |
|---|---|---|---|---|
| 14:02:11 | invoice.paid | api.northwind.dev | 200 | 142 |
| 14:02:10 | customer.updated | hooks.tallyfox.io | 200 | 88 |
| 14:02:08 | order.created | erp.kestrelfab.in | 503 · retry 1 | 2003 |
| 14:02:07 | invoice.paid | api.northwind.dev | 200 | 131 |
| 14:02:05 | subscription.renewed | bill.lumenhq.com | 200 | 97 |
| 14:02:04 | user.deleted | hooks.tallyfox.io | 200 | 76 |
| 14:02:02 | refund.issued | api.northwind.dev | 200 | 155 |
How it works
One API call in. Guaranteed delivery out.
-
01
You send the event
One
POSTto Relay with the event type and payload. It’s accepted in under 20 ms, so your request path stays fast. -
02
Relay signs and queues it
Every message gets an HMAC-SHA256 signature and an idempotency key, and is fanned out to each subscribed endpoint.
-
03
Delivery, with retries
Failed attempts retry with exponential backoff for up to 72 hours. Endpoints that keep failing are paused, and you’re told.
-
04
Your customers can see it
An embeddable portal lets each customer manage endpoints, read their delivery log and replay events, without a support ticket.
Quickstart
Five lines to your first delivery.
Install the SDK, create an application for each of your customers, and send. Relay handles everything after send().
- SDKs for Python, Node.js, Go, Ruby and PHP
- OpenAPI spec for everything else
- Test mode with a request inspector
# pip install relay-hooks
from relay import Relay
relay = Relay("rk_live_••••••••")
relay.message.send(
app_id="customer_8812",
event_type="invoice.paid",
payload={"invoice": "INV-2026-00418", "amount": 129.00},
)
// npm install @relay-hooks/node
import { Relay } from "@relay-hooks/node";
const relay = new Relay(process.env.RELAY_KEY);
await relay.message.send({
appId: "customer_8812",
eventType: "invoice.paid",
payload: { invoice: "INV-2026-00418", amount: 129.0 },
});
curl https://api.relay.example/v1/app/customer_8812/msg \
-H "Authorization: Bearer $RELAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_type": "invoice.paid",
"payload": { "invoice": "INV-2026-00418", "amount": 129.0 }
}'
Features
The parts you’d otherwise build, test and get paged for.
| Capability | Built in-house | With Relay |
|---|---|---|
| Retries with backoff | A queue, a worker and a schedule to tune | Included up to 72 hours, configurable per endpoint |
| Payload signing | Secrets to rotate, docs to write | Included HMAC-SHA256 with zero-downtime rotation |
| Customer-facing logs | Usually never gets built | Included embeddable portal, your branding |
| Replay failed events | A script someone runs by hand | Included one click, or by API |
| Static outbound IPs | NAT gateways to run | Included on Team and above |
| Rate limiting per endpoint | Easy to forget until a customer goes down | Included set by you or by them |
Pricing
Pay for events, not seats.
-
Hobby
$0/month
For side projects and trying Relay out.
- 50,000 events / month
- 3 days of logs
- Community support
-
Most teams start here
Team
$49/month
For products with paying customers.
- 1 million events / month
- 30 days of logs
- Customer portal and static IPs
- Email support, next business day
-
Scale
$249/month
For high volume and compliance needs.
- 10 million events / month
- 90 days of logs
- SSO, audit log, SOC 2 report
- Shared Slack channel
Over your plan? Extra events are $0.40 per 10,000. Nothing is ever dropped for being over a limit.