Skip to content
catchook

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_urlWhere deliveries are POSTed. HTTPS
retry_max_attemptsHow many times to try before giving up. Max 10
retry_backoffHow the delay grows between attempts
rate_limitCeiling on deliveries to this destination
forward_original_signatureAlso send the provider’s original signature header
catchook_secretSigns every delivery here. Rotatable, unique per destination
pausedQueue 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.