LLM call > 20s → Stripe marks failure, retries → handler runs twice → duplicate fulfillment.
/v1/webhook_endpoints · status: failed
Your handler takes 45s for an LLM call. Stripe gives up at 20s and retries. Your customers get double-fulfilled, and your CFO sees the chargebacks.
AnyHook sits between the sender and your handler. Queues, retries, dedupes, logs everything, without touching your handler code.
evt_3Pk2X3b1Lcx
Request timed out. Retrying in 5 min (1 / 3).
$ stripe webhooks update we_1234
--url in.anyhook.net/u/app
✓ Endpoint updated
✓ Delivering to AnyHookevt_3Pk2X3b1Lcx
attempt 1 · idempotent · 47.2s handler
// before
await llm.run(evt); /* 45s */
// after
return Response.json({ ok: true });duplicates prevented
127
LLM call > 20s → Stripe marks failure, retries → handler runs twice → duplicate fulfillment.
/v1/webhook_endpoints · status: failed
Bot must reply in 3s. AI agent takes 30s → Slack drops the event entirely. User sees nothing.
Answer later and it counts as a failure: 8 retries over 4 hours, then repeated failures delete the subscription. Orders stop arriving.
Production webhook traffic. Cheaper than 2 weeks of building retries yourself.
You never have to take our word for a delivery. The signature verification library and MCP server are Apache 2.0: github.com/gba3124/anyhook-mcp. The relay service itself is not open source.
Sign up with email or Google. AnyHook gives you an inbound URL like https://in.anyhook.net/you/app. No credit card needed for the free tier.
Open Stripe Dashboard → Webhooks → edit the endpoint → paste the AnyHook URL. Same change works for GitHub, Shopify, Slack, Discord, Paddle. Your handler code stays untouched.
AnyHook returns 200 to the sender in about 1s, queues the event, and forwards to your handler with retries + idempotency. Failed events sit in the dashboard with a one-click Replay button.
Good fit
Not a fit
If you've got eng bandwidth to install an SDK and rewrite handlers as durable functions, Inngest is great. AnyHook is for teams who want it solved without changing their handler shape, change one webhook URL, keep your existing code.
Yes. 10,000 events / month (capped at 1,000 / day), 1 app, no credit card. We keep it big enough that hobby projects ship, but tight enough that production traffic upgrades naturally. No tricks, no expiry.
GitHub, Shopify, Slack, Discord, Paddle, Linear, Clerk, same URL swap pattern works for all of them. Signature verification is auto-detected from the incoming headers.
Partly, and it is worth being precise about which parts. The signature verification library and the MCP server are Apache 2.0 at github.com/gba3124/anyhook-mcp, so you can check every delivery we sign without trusting us and without a dependency on us. The relay service that receives, stores and retries is not open source, and there is no self-host build today.
We store it encrypted at rest (AES-256-GCM). It is replayable for your plan's window (3 / 30 / 90 days); after that Free events are deleted and paid plans keep a read-only encrypted archive (1 year on Pro, 7 years on Scale). The key never leaves our infra. You can also enable zero-retention mode where we never persist the body.
On Free, events past the monthly quota are held in your log, not delivered, and replay once you upgrade; past the daily cap the edge returns an error and the sender's own retries take over. Nothing is silently dropped. Upgrading to Pro lifts the limit immediately; Pro overage is $0.15 / 1K events, with an optional spending cap in the dashboard if you'd rather block than pay.
Sign up free, get your inbound URL, swap it in Stripe. AnyHook absorbs the retries, your handler keeps running exactly the way it does today.