My webhook catcher logged the same event six times — the sender's retry clock was shorter than my handler
I built an ephemeral webhook catcher because testing receivers is annoying: you need a public HTTPS URL, a running app, and logs, when all you actually want is to see the raw POST a sender makes. The catcher hands you a throwaway URL, accepts any POST for 24 hours, and lets you read the stored events back. Then I dogfooded it and found my own bug. A sender script I'd written posted a payload; my handler parsed the body, stored the JSON, and only then replied. Under a slow parse the round trip took longer than the sender's HTTP timeout. The sender's client gave up, treated it as a failed delivery, and retried. My "one payload per hook" test came back with six copies of the same event, each with a different arrival timestamp. Two lessons, both now baked into how I operate it: A receiver's latency budget is set by the caller. I was doing real work before responding. The fix is boring and old: enqueue, return 2xx in milliseconds, record asynchronously. Catchi...