Concepts
Destinations
Where an endpoint's events get delivered, and the retry and rate-limit policy each one carries.
A destination is one place events go. An endpoint with no destinations still receives and records webhooks — it just delivers them nowhere, which is a legitimate way to start watching a provider before you have a handler.
Each destination carries its own configuration, so one endpoint can feed a production API that must never be throttled and an internal audit service that should be.
Configuration
| Field | |
|---|---|
receiver_url | Where deliveries are POSTed. HTTPS |
retry_max_attempts | How many times to try before giving up. Max 10 |
retry_backoff | How the delay grows between attempts |
rate_limit | Ceiling on deliveries to this destination |
forward_original_signature | Also send the provider’s original signature header |
catchook_secret | Signs every delivery here. Rotatable, unique per destination |
paused | Queue jobs are dropped rather than sent |
Retries
A delivery is retried when the receiver returns a non-2xx status, the
connection fails, or the request times out. Between attempts the delay grows
according to retry_backoff.
After retry_max_attempts, the delivery stops and is marked dead. It is
not retried again automatically, and it stays queryable for 14 days — long
enough to fix the receiver and replay it.
Retrying is per destination. One destination being down does not delay, block, or fail the others.
Rate limiting
Each destination has its own counter. A delivery that would exceed it is retried later rather than dropped — the rate limit slows delivery down, it does not lose events.
This is what makes fan-out to a fragile internal service safe: it receives at whatever rate it can handle while your primary destination receives at full speed.
Pausing
A paused destination has its queue jobs dropped, not held. Events still arrive, are still verified, and are still recorded — they are simply not delivered here.
To catch up afterwards, replay the window you missed:
catchook replay --last 50 --to-destinations
Like endpoint pausing, this takes up to 60 seconds to take effect.
forward_original_signature
With this set, the provider’s own signature header is forwarded alongside Catchook’s. Useful when your handler already verifies against the provider’s secret and you would rather not change that code — the request it receives is byte-for-byte what the provider sent, with a signature that still validates.