For Developers — Instant Webhook Debugging Without Tunnels
Stop juggling ngrok, localtunnel, and port-forwarding. Hookly gives you a permanent public endpoint that forwards events straight to your localhost — in one click.
Create a Debug Endpoint Read the API DocsThe Problem
Local webhooks are a setup nightmare
Every time you need to verify a Stripe checkout event, a GitHub push notification, or a Shopify order update, you spin up a tunnel, copy a random URL, paste it into a third-party dashboard, and pray the connection doesn't drop mid-test. Then you tear it down and repeat the cycle for the next integration.
Tunnels time out and reconnect with new addresses
ngrok free tier rotates your hostname every session. You update the webhook URL in the provider's dashboard, wait for propagation, and lose 5–10 minutes per integration just on configuration.
Payloads vanish between your server and the tunnel
When a tunnel drops, Stripe silently retries three times over 30 minutes. You never see the payload, your local handler never fires, and you spend an hour wondering why the integration "doesn't work."
No request history, no replay, no signature verification
Tunnel tools give you a raw HTTP stream. You still need to write middleware to log headers, verify HMAC signatures, and reconstruct the event payload — before your application code even runs.
The Solution
One endpoint. Zero tunneling. Full visibility.
Hookly provisions a persistent HTTPS endpoint — like debug-7x3k9q.hookly.app — that you paste into any webhook source. Hookly captures every request, verifies the signature, stores the payload, and forwards it in real time to localhost:3000 via a WebSocket bridge. No tunnel daemon. No CLI. No reconfiguration.
Permanent endpoint, never rotates
Your debug URL lives forever. Set it once in your Stripe developer dashboard, your GitHub repo settings, or your Zendesk admin panel — and it works across every session, every day, every sprint.
Live payload inspector with signature verification
Hookly decodes and validates HMAC-SHA256 signatures from Stripe, GitHub, Shopify, Slack, and 40+ providers out of the box. You see the raw body, the verified headers, and a color-coded diff against your last event — side by side.
Replay any event with two clicks
Found a bug in your customer.subscription.updated handler? Replay the exact payload, headers, and timestamp from Hookly's request log. Your local server receives it as if the provider just sent it.
WebSocket bridge to localhost — no tunnel daemon
Drop a single hookly-bridge npm package into your Express, Fastify, or NestJS app. It opens a secure WebSocket to Hookly, and every captured webhook arrives on your configured route in under 80ms. No ngrok process, no port forwarding, no firewall changes.
Request history with filtering and export
Every webhook is logged for 30 days. Filter by event type, status code, or timestamp. Export as JSON or cURL. Share a read-only link with your team so the frontend engineer can see exactly what your backend received.
Webhook templates for 40+ providers
Select "Stripe" from the template dropdown and Hookly auto-configures signature verification, event type parsing, and retry headers. Switch to "GitHub" and it adapts to X-Hub-Signature-256 and JSON payload format automatically.
Real Example
Debugging a Stripe invoice.payment_failed event in 90 seconds
Here's a typical workflow for a backend engineer at a SaaS company — no tunnel, no CLI, no waiting.
Step 1 — Create a debug endpoint
Log into Hookly, click "New Endpoint," and select the Stripe template. Hookly generates debug-7x3k9q.hookly.app/stripe and shows you the expected signing secret format. Copy the endpoint URL.
Step 2 — Register in Stripe
Go to your Stripe Dashboard → Developers → Webhooks → Add Endpoint. Paste the Hookly URL, select invoice.payment_failed and customer.subscription.deleted. Stripe saves it instantly — no propagation delay because the endpoint is always live.
Step 3 — Trigger a test event
In Stripe's test mode, create a customer with a failing card (tok_visa_fail), attach a subscription, and let the automatic retry fail. Stripe sends the invoice.payment_failed event to your Hookly endpoint within 2 seconds.
Step 4 — Inspect and replay
Open Hookly's request log. You see the full payload: invoice ID in_1N4xKpJ8vZ2mQ, amount 2900 cents, failure code card_declined, and three retry timestamps. Click "Replay to Localhost." Your Express app receives the event on POST /webhooks/stripe with the original headers intact. You set a breakpoint, step through your handler, and confirm the dunning email is queued correctly.
Step 5 — Share with the team
Click "Share Log" and send the read-only link to your Slack #engineering channel. The frontend engineer sees the exact payload structure and can update the billing UI without guessing at field names. The whole debug cycle took 90 seconds — not 20 minutes of tunnel setup and failed retries.