Webhooks seem simple until they fail. Missed events, duplicate deliveries, no retry logic, impossible debugging. Hookdeck sits between webhook senders and your app, handling all the infrastructure you would otherwise build yourself.
What Is Hookdeck?
Hookdeck is a webhook infrastructure platform. It receives webhooks on your behalf, queues them, retries failures, deduplicates events, and delivers them to your endpoint reliably. Think of it as a managed message queue specifically designed for webhooks.
The Free API
Hookdeck offers a generous free tier:
- Free plan: 100,000 events per month
- Automatic retries: Configurable retry policies
- Event queuing: Buffer events when your server is down
- Deduplication: Filter duplicate webhook deliveries
- Transformations: Modify payloads with JavaScript
- CLI: Local development tunnel for webhooks
- Dashboard: Visual debugging and event inspector
- Rate limiting: Control delivery rate to your endpoints
Quick Start
Install the CLI:
npm install -g hookdeck-cli
hookdeck login
Forward webhooks to localhost:
# Forward Stripe webhooks to your local server
hookdeck listen 3000 stripe-source
Set up a connection via API:
# Create a source (where webhooks come from)
curl -X POST https://api.hookdeck.com/2024-01-01/sources \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"name": "stripe"}'
# Create a destination (your endpoint)
curl -X POST https://api.hookdeck.com/2024-01-01/destinations \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"name": "my-api", "url": "https://api.myapp.com/webhooks/stripe"}'
# Create a connection with retry policy
curl -X POST https://api.hookdeck.com/2024-01-01/connections \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"name": "stripe-to-api",
"source_id": "src_xxx",
"destination_id": "des_xxx",
"rules": [
{"type": "retry", "strategy": "exponential", "count": 5},
{"type": "filter", "body": {"type": {"$in": ["payment_intent.succeeded", "customer.created"]}}}
]
}'
Add transformations:
// Transform webhook payload before delivery
addHandler('transform', (request, context) => {
const body = request.body;
return {
...request,
body: {
event_type: body.type,
customer_email: body.data.object.customer_email,
amount: body.data.object.amount / 100,
currency: body.data.object.currency,
timestamp: new Date().toISOString(),
}
};
});
Why Teams Choose Hookdeck
A payment platform processed Stripe webhooks directly. During a Black Friday spike, their server went down for 20 minutes. They lost 3,000 webhook events — payment confirmations, subscription updates, refund notifications. Customers got charged but never received their products. After adding Hookdeck, events are queued during downtime and delivered when the server recovers. They have not lost a single webhook since.
Who Is This For?
- Teams receiving webhooks from payment providers (Stripe, PayPal)
- Developers tired of building retry and queuing logic for webhooks
- SaaS platforms that need reliable event delivery
- Anyone debugging webhook issues with no visibility into what was sent
Start Using Hookdeck
Hookdeck turns unreliable webhook delivery into a managed, observable system. Retries, queuing, filtering, and debugging — all handled.
Need help with webhook infrastructure or event-driven architecture? I build custom integration solutions — reach out to discuss your project.
Found this useful? I publish daily deep-dives into developer tools and APIs. Follow for more.
Top comments (0)