Public Beta — Free to start

Stop losing webhooks.
Start relaying them.

One URL receives all your webhooks. JQ rules route them anywhere — public endpoints, staging, or localhost via built-in tunnels. No ngrok. No lost events. No code changes.

Stripe
GitHub
WhatsApp
Shopify
Twilio
Relayers
Production API
Staging Server
localhost:3000
0M+
Events routed
0%
Uptime
<0ms
p95 latency
Open Source CLI
The problem

Webhooks are broken

Every developer who works with webhooks hits the same walls.Sound familiar?

critical
01

The Tunnel Treadmill

Free ngrok URLs expire every 2 hours. Reconfigure, restart, pray nothing was lost.

ERR tunnel session expired
    reconnecting in 2h...
high
02

Integration Spaghetti

Stripe to production. GitHub to staging. Separate endpoints, separate configs, separate headaches.

WARN 6 endpoints out of sync
     manual config required
critical
03

The Debugging Black Hole

A webhook failed 3 hours ago. Was it your code? The payload? The data is gone forever.

GET /logs/evt_3hrsago
    404 payload not retained

Four steps. Zero hassle.

From webhook received to payload delivered — in milliseconds.

1
Step 1

Receive

Point any webhook provider at a single Relayers URL.

POST https://api.relayers.app/v1/webhooks/my-stripe
2
Step 2

Route

JQ rules match on payload, headers, or source.

.headers["x-github-event"] == "push"
3
Step 3

Transform

Reshape payloads with JQ before delivery.

{event: .type, amount: .data.object.amount / 100}
4
Step 4

Deliver

To any URL or localhost via built-in tunnels.

wr tunnel --port 3000

See it in action

A complete webhook management dashboard — built for developers who need visibility and control.

Endpoint Configuration

Create endpoints with custom slugs, assign routing rules, and manage destinations all from one dashboard.

app.relayers.app/endpoints/stripe-prod
Stripe Production
/stripe-prod
active
3
Rules
1,247
Events today
99.8%
Success rate

Event Inspector

Full request/response inspection with live streaming. Filter by status, search payloads, and replay failed events.

app.relayers.app/events
ID
Type
Status
Time
evt_1a2b3c
invoice.paid
delivered
2s ago
evt_4d5e6f
push
delivered
15s ago
evt_7g8h9i
charge.failed
retrying
1m ago
evt_0j1k2l
message.received
delivered
3m ago

Delivery Timeline

Trace every delivery attempt with precise timing, status codes, and response bodies. Debug failures instantly.

app.relayers.app/events/evt_1a2b3c
Attempt 1500
120ms14:32:01
Attempt 2500
145ms14:32:31
Attempt 3200
89ms14:33:31

Transformation Editor

Write JQ expressions to reshape payloads on the fly. Live preview shows input and output side by side.

app.relayers.app/transformations/simplify-stripe
JQ Expression
{event: .type, amount: .data.object.amount / 100, currency: .data.object.currency}
Input
{"type": "charge.succeeded", "data": {"object": {"amount": 2500, "currency": "usd"}}}
Output
{"event": "charge.succeeded", "amount": 25, "currency": "usd"}

Tunnel Dashboard

Monitor connected localhost tunnels in real time. See hostname, port, connection status, and last heartbeat.

app.relayers.app/devices
Hostname
Port
Status
Heartbeat
kled-macbook
:3000
connected
2s ago
ci-runner-01
:8080
connected
5s ago

Built for real-world webhook routing

See how teams use Relayers to simplify their webhook integrations.

Route WhatsApp Business API webhooks by message type. Text messages go to your chat handler, media to a processor, and everything gets logged.

Routing Rule (JQ)

jq
.messages[0].type == "text"

Destinations

Text Handler
localhost:3000/whatsapp/text
tunnel
Media Processor
https://media.example.com/process
Audit Log
https://logs.example.com/whatsapp

Transform payloads, not your codebase

Reshape any webhook payload with JQ expressions before delivery. Your services receive exactly the data they need.

Incoming Payload
{
  "type": "charge.succeeded",
  "data": {
    "object": {
      "id": "ch_1abc",
      "amount": 4999,
      "currency": "usd",
      "customer": "cus_xyz",
      "status": "succeeded"
    }
  }
}
JQ Rule
{
  event: .type,
  charge_id: .data.object.id,
  amount: (.data.object.amount / 100),
  currency: .data.object.currency,
  customer: .data.object.customer
}
Transformed Output
{
  "event": "charge.succeeded",
  "charge_id": "ch_1abc",
  "amount": 49.99,
  "currency": "usd",
  "customer": "cus_xyz"
}

Enterprise-grade, from day one

Security and reliability built into every layer — not bolted on later.

Signature Verification

Validates HMAC-SHA256, SHA1, and SHA512 signatures on every incoming webhook. Tampered payloads are rejected before processing.

Automatic Retries

Exponential backoff with jitter, configurable per rule. Failed deliveries retry automatically — up to your configured limit.

Idempotency

Configurable dedup windows with unique idempotency keys. Duplicate webhooks are detected and discarded before delivery.

Rate Limiting

Per-endpoint rate limits protect your services. Burst traffic is queued, not dropped — nothing gets lost.

Why developers choose Relayers

The only webhook platform with built-in tunnels, JQ routing, and transformations — at a price that makes sense.

FeatureRelayersHookdeckSvixConvoy
Receive + Route + DeliverSend only
Built-in localhost tunnelsCLI add-on
JQ routing rules
Payload transformationsJS only
Self-hostable
Starting priceFree$39/mo$490/mo$99/mo

Built-in tunnels

Deliver to localhost via WebSocket — no ngrok, no CLI add-ons, no expiring URLs.

JQ everywhere

Route, filter, and transform with JQ — the language DevOps already knows.

Multi-tenant ready

Team workspaces with scoped API keys and RBAC, built in from day one.

Ready to stop losing webhooks?

Set up your first endpoint in under 2 minutes. No credit card. Free tier included.