The Standard Webhooks specification describes webhooks as a kind of reverse API: instead of a client calling a service, the service calls the client to report an event. That reversal creates most of the difficulty. The sender cannot know whether the receiver is up, slow, or has changed its code. The receiver cannot control when events arrive or how many times.
Hookdeck's guide to webhooks at scale lists what follows from that: webhooks are usually delivered at-least-once, so you will get duplicates and out-of-order events, and with webhooks you face all the problems of an event-driven system without controlling the producer.
Every design decision below answers one of these facts.
| Fact | Consequence |
|---|---|
| Networks fail and receivers go down | Senders must retry |
| Senders retry | Receivers get duplicates and must be idempotent |
| Retries and parallel delivery reorder events | Receivers cannot assume order |
| Webhook URLs are public | Receivers must verify who sent each request |
| Events arrive in bursts | Receivers must acknowledge fast and queue the work |



