π¬ WebhookHub is a lightweight, self-hosted service for receiving, logging, and forwarding webhooks.
Use it to debug, inspect, replay, and route incoming webhooks during development or in production. No third-party services, no cloud lock-in β just full control.
When working with external services (Stripe, GitHub, Telegram, Shopify, etc.), developers often face the same pain points:
- β Where did the webhook go? Why didnβt my service receive it?
- π How do I replay a webhook for debugging or recovery?
- π How do I inspect payloads and headers easily?
- π‘ How can I fan-out one webhook to multiple services?
WebhookHub provides a simple, developer-friendly solution to these problems.
- β
Receive webhooks at
/hook/:source - β Log full payloads, headers, timestamps
- β Replay any webhook via Web UI
- β Forwarding rules per source (fan-out, routing)
- β Optional incoming/outgoing HMAC signing (Stripe-style header format)
- β Web dashboard with filters, pagination
- β Secure login (admin account)
- β Postgres + GORM backend
- β Dockerized and ready to deploy
- Accept and log webhooks
- View logs with filters and pagination
- Replay webhooks on demand
- Add/edit/delete forwarding rules
- Delete individual webhook logs
- Admin auth (session cookie + bcrypt)
- PostgreSQL + GORM backend
- Docker + compose setup
- HMAC signature verification (e.g., Stripe-style)
- Delivery status tracking + metrics
- Dead-letter queue
- Configurable retry/backoff policy
- Dead-letter queue management UI
- Advanced search and filters
- Retention / cleanup policies
- Export and bulk redelivery tools
- Telegram integration
- OpenAPI schema
- Plugin system for custom processors
| Component | Technology |
|---|---|
| Language | Go |
| Database | PostgreSQL (via GORM) |
| UI | HTML + HTMX |
| Auth | SecureCookie + bcrypt |
| Container | Docker + Compose |
git clone https://github.com/Paramoshka/WebhookHub.git
cd webhookhub
docker-compose up -d --buildWebhookHub uses a 32-byte secret key to sign session cookies.
You must set this in your .env file as SESSION_KEY.
To generate a secure random key:
openssl rand -hex 32Retention cleanup is optional and disabled by default. Configure via .env:
# Retention cleanup
RETENTION_ENABLED=false
RETENTION_DAYS=30
RETENTION_INTERVAL=24h
RETENTION_BATCH_SIZE=300When enabled, expired webhooks are removed in batches every interval by received_at.
/dashboard includes advanced filters in the UI and the same parameters are available via:
GET /partials/webhooks
Query params:
source: exact match on webhook source.status: exact match on status (pending,retrying,success,failed,dead_lettered).q: full-text search acrosssource, payload, headers, last error, and DLQ reason.from: lower bound forreceived_at(supportsRFC3339,RFC3339Nano,2006-01-02T15:04,2006-01-02).to: upper bound forreceived_at(supports the same formats asfrom; date-only values are interpreted as end-of-day).sort: one ofid_desc(default),received_desc,received_asc,id_asc.page: page number (default1), 10 items per page.
Example:
curl "http://localhost:8080/partials/webhooks?source=stripe&status=failed&q=payment&from=2026-07-01&to=2026-07-11T23:59&sort=received_desc&page=2"This project is licensed under AGPL-3.0 for self-hosted and open-source use.
Commercial SaaS deployment or integration into paid platforms requires a separate license. Contact [ivan.parfenov.42a@gmail.com] for details.
