Webhook infrastructure for AI apps

Stop duplicate webhooks.

Webhooks timeout in seconds. Your AI agents need time to think.

We return HTTP 200 in 50ms, guaranteeing exactly-once execution.

The problem

Webhooks time out. Your service runs twice.

Without a relay, the sender retries the same event — your handler fires again.

AnyHook returns 200 OK in under 50ms. Your handler runs exactly once.

SENDER'S TIMEOUT WINDOW0 ms50 ms10 s~3 minwithoutTIMEOUThandler fires again→ duplicate actionsanyhook200 OKSender satisfiedDone
Webhook pain vs AnyHookDIRECT TO YOUR APIWITH ANYHOOKSENDERPOST →TIMEOUTAPIretry → service runs twice→ duplicate actions, corrupted stateSENDERPOST →20050ms · edgeAPIqueue → forward once→ delivered ✓
Senders only measure the first hop. We return 2xx at the edge — your handler can take as long as it needs.

One URL

Change one URL.

No SDK. No code changes. Point Stripe, GitHub, or Shopify at your AnyHook inbound URL — we queue, buffer, and forward.

Three steps. Thirty seconds. Async decoupling for your webhooks.

StripeGitHubShopifyPaddleDiscordANYHOOKverifyqueueforwardyour-api.com
1

Swap the URL

In Stripe, GitHub, or Shopify, replace your endpoint with your AnyHook inbound URL. Paste your provider's webhook signing secret so AnyHook can verify every request at the edge.

https://in.anyhook.net/{you}/{app}
2

We queue it instantly

AnyHook's edge verifies the signature, accepts the webhook in under 50ms, and drops it into a durable queue. The sender gets 200 — your backend processes at its own pace.

3

Your API receives it

Events flow from the queue to your endpoint on a controlled schedule. Full payload, headers, and delivery status — all visible in one dashboard.

Event log

See every event.

Inbound payload, each delivery attempt, and the response body — one screen before you hit Replay.

anyhook — event stream
live
timesourceevent typeappstatuslatency
7 events · Free plan retains 3 daysclick to inspect

Delivery pipeline

Clear traffic, full control.

Receive → normalize → log → deliver. Every webhook visible at each hop, from inbound to your API.

1/4Receive

Catch it fast.
Edge ack in under 50ms.

Cloudflare Workers at the edge accepts the webhook and returns 200 — all in under 50ms. The sender thinks you're instant. Your downstream can take as long as it needs.

receive
POST in.anyhook.net/acme/stripe
1. Accept incoming POST ✓
2. Queue event to pipeline ✓
3. Return 200 OK in 38ms ✓
→ Stripe: delivered.
Your agent hasn't started yet.

Security

Drop the SDKs. Check one header.

Stripe, GitHub, Shopify — every provider signs differently. Paste your provider's signing secret once, and AnyHook validates every request at the edge. You get one unified signature.

Original provider headers preserved. Your existing SDK verification still works — or just check one AnyHook header and skip the rest.

your-server.ts
// Every provider. One check.
const sig = req.headers['x-anyhook-signature'];
if (!verify(sig, body, process.env.ANYHOOK_SECRET))
return res.status(401);
// Trust the payload. It's already verified at edge.
// Original Stripe/GitHub headers still included.
20+ providers0 SDKs required

Supported Event Sources

Stripe
GitHub
Shopify
Discord
Sentry
Linear
Vercel
Paddle
Clerk
Lemon Squeezy
Intercom
HubSpot
Resend
WooCommerce
PayPal
Slack
Twilio
SendGrid
Svix
Others

Zero-config signature unification

Unified AnyHook-Signature

20+ providers, one HMAC. AnyHook verifies Stripe/GitHub/Shopify signatures at the edge, then re-signs every delivery with a fresh AnyHook-Signature. Verify once on your server, trust everything.

Retry-safe by design

Original provider signatures expire after ~5 minutes — retries fail verification on your server. AnyHook solves this: we verify once at the edge, then re-sign with a fresh timestamp on every retry. Your server never sees an expired signature.

Original headers preserved

Raw body forwarded byte-for-byte with original Stripe-Signature intact. Need to double-verify on first delivery? Your existing SDK still works — AnyHook-Signature is additive, not a replacement.

“We deleted 200 lines of signature verification code and replaced them with one header check. Shipped the same afternoon.”

Fail-safe

Your server goes down.
Nothing is lost.

Timeout? 500? Deploy gone wrong? AnyHook absorbs the impact, protects your quota, and holds every event until you're ready.

Exponential backoff

5xx or timeout? We retry on an increasing schedule — 5 min, 30 min, 2 hours, 12 hours. Client errors (400, 422, etc.) are marked failed immediately — no wasted retries.

Circuit breaker

20 consecutive failures → progressive pause (10 min → 30 min → 2 h → 24 h → deactivate). Inbound keeps receiving — only outbound pauses. Any single success resets everything.

Failure alert

When all retries are exhausted, you get an email with the event ID, destination, HTTP status, and a direct link to the event in your dashboard.

Batch replay

Server back up? One call to POST /replay-failed replays every failed event. Or inspect first with GET /undelivered. Replays don't count against your quota.

Who it's for

Built for builders.

Same webhook relay — three common situations teams land in first.

AI Agents

Stripe retried. Your agent ran twice.

30s timeout. 45s LLM. Duplicate order.

Stripe's limit is 30s. Your agent takes 45s. Stripe retries — your handler fires again. We catch the event in 50ms and hold it until your agent finishes. One delivery, guaranteed.

ai-agents.ts
1// Without AnyHook
2app.post("/webhook", async (req, res) => {
3 const result = await agent.run(req.body);
4 // ↑ 45s — Stripe already retried
5 // ↑ agent runs TWICE → duplicate charge
6 res.json({ ok: true });
7});
8// With AnyHook → 200 in 50ms at edge
9// Your agent runs once. No duplicates.
Solo Builders

Swap the URL. Ship tonight.

No SQS. No DLQ config. No SDK.

Point your Stripe webhook here instead of your server. We handle retries, logs, and replay. Developing locally? Set your destination to a tunnel URL — or capture real events in production and replay them to localhost anytime.

solo-builders.ts
1// Step 1: Stripe Dashboard → Webhooks
2// Change endpoint URL to:
3const url = "https://in.anyhook.net/you/app";
4// Local dev? Set destination to:
5"https://your-tunnel.ngrok.io/webhook"
6// Or replay any prod event to localhost
7// ✓ Retries + Logs + Replay included
Backend Devs

Don't build it. Outsource it.

$20/mo beats 2 weeks of your time.

Queue, worker, DLQ, dead-letter alerts, manual replay UI. You've done it before. It still silently drops under load. Outsource the commodity work.

backend-devs.ts
1// What you'd build yourself:
2Ingress → Auth → Kafka → Worker
3→ Fails → Redis Delay Queue → DLQ
4→ CloudWatch Alerting → Manual Replay
5→ 2 weeks eng time · $3k+/mo ongoing
6// What AnyHook replaces it with:
7One URL. $20/mo. Zero maintenance.
8Retries + logs + replay included.

Automation

APIs for AI agents.

Your agent can create relays, return inbound URLs, inspect delivery history, and replay failed events by API while AnyHook handles fast acknowledges underneath.

# Agent workflow: provision → observe → recover
# 1. Provision a relay
POST /api/v1/apps {
"name": "stripe-payments",
"destination_url": "https://api.acme.com/webhooks"
}
# 2. Check what didn't make it
GET /api/v1/apps/stripe-payments/events/undelivered
→ { "count": 3, "events": [...
{ "id": "evt_abc", "status": "failed" }, ...
] }
# 3. Replay all failed — one call
POST /api/v1/apps/stripe-payments/replay-failed
→ { "replayed": 3, "events": [
{ "original_id": "evt_abc", "new_id": "evt_xyz" }, ...
] }

Pricing

Simple pricing.

Start free. Upgrade when your traffic grows. No surprise bills on Free — metered overage on paid plans so we never silently drop your events.

Free
For testing and first integrations
$0/ month
Get started free
  • Events3,000 / month
  • Apps1
  • Retries3
  • Retention3 days
  • Timeout60s
  • Max payload512 KB
  • OverageQueues next cycle
  • 100 events / day cap
  • Email alerts
  • Ticket support
Most teams start here
Pro
For production webhook traffic
$20/ month
Start Pro
  • Events50,000 / month
  • Apps10
  • Retries5
  • Retention30 days
  • Timeout120s
  • Max payload2 MB
  • Overage$0.90 / 1k
  • No daily cap
  • API access
  • Signature mismatch logs
Scale
For high-volume pipelines
$90/ month
Start Scale
  • Events250,000 / month
  • Apps1,000
  • Retries10
  • Retention90 days
  • Timeout5 min
  • Max payload5 MB
  • Overage$0.90 / 1k
  • No daily cap
  • Slack + ticket support
  • Custom domains soon
Enterprise
For security reviews and custom limits
Custom
Contact sales
  • EventsFlexible
  • AppsFlexible
  • RetriesFlexible
  • RetentionFlexible
  • TimeoutFlexible
  • Max payloadCustom
  • OverageCustom
  • SSO and reviews
  • Dedicated onboarding
  • Custom routing options

Most teams start with Pro — production-grade volume, zero maintenance. Retry queues, dead-letter handling, idempotency — let us own the complexity so you can ship what matters.

FAQ

You can. Here's what you're signing up for:

Reliability — Idempotency keys, dead-letter queues, backoff state machines. One missed edge case and you double-process a payment or silently drop an event. Most teams find these bugs in production, at 2 AM.

Security — Every provider signs differently. Stripe HMAC-SHA256 + timestamp, GitHub raw SHA-256, Shopify Base64. You maintain one verifier per provider, handle key rotation, encrypted storage. Skip one = accepting unsigned traffic.

Observability — Debugging means grepping CloudWatch across Lambda invocations. No searchable event log, no replay, no full payload history.

Cost — Infra is $50–200/mo. The real cost is $3,000–5,000/mo in engineer time: on-call, migrations, debugging stuck retries. AnyHook Pro is $20/month and zero maintenance.

How delivery works under the hood

Different hops. Stripe's clock runs on the connection to your public URL. Point that at AnyHook and Stripe waits on our edge — which returns 2xx in milliseconds.

The Timeout column is our delivery clock: how long we wait for your endpoint to respond (60s Free, 120s Pro, 5 min Scale). Most endpoints respond well within that. For tasks that take even longer, return 202 Accepted and process async.

Retry schedule & timeout details

Zapier/Make are low-code automation platforms — visual editors, drag-and-drop flows. AnyHook is a developer-grade relay: your webhook, your endpoint, your code, your infrastructure.

Writing Python or TypeScript to process webhooks? Use AnyHook. Want "if payment → send email" without code? Use Zapier.

Events are written to a durable queue before we return 200 to the sender. If our Forwarder is temporarily down, events queue up and process on recovery. The sender already got their 200 — no retries, no data loss.

Uptime published at status.anyhook.net.

Yes — that's exactly what AnyHook is for. We acknowledge Stripe in under 50ms. Your Agent runs as long as it needs.

Your endpoint should return 202 Accepted immediately, then process async. AnyHook's delivery timeout (60s Free, 120s Pro, 5 min Scale) only applies to that initial HTTP round-trip.

Delivery timeout & retry schedule

No. Return 200 as soon as the webhook is authenticated. Run business logic async. This is Stripe's recommended pattern.

With AnyHook: edge validates signature → event queued → Stripe gets 200 instantly → failures retried and replayed in AnyHook instead of forcing Stripe to redeliver.

AnyHook handles async event webhooks where a fast 2xx is the contract. Not a fit for synchronous control webhooks that need a specific response body:

Twilio Voice (expects TwiML), Discord Interactions (expects JSON UI), Shopify Carrier Shipping (expects live rates). Standard event webhooks from these providers work perfectly.

Your endpoint returns 202 Accepted immediately → processes the task async. AnyHook marks delivery successful on the 202. Your Agent runs for minutes or hours — no impact on the webhook lifecycle.

If your endpoint returns 200 only after the Agent completes, it will trigger retries on long tasks. Fix: 202 + async.

Yes — three ways:

1. Dashboard — click Replay on any event. One click, no re-triggering from Stripe.

2. API single replayPOST /api/v1/events/{id}/replay to replay one event programmatically.

3. Batch recoveryPOST /api/v1/apps/{slug}/replay-failed replays all failed events for an app in one call.

Need to inspect first? GET /api/v1/apps/{slug}/events/undelivered lists every event that didn't make it. Replays are tagged is_replay: true and linked to the original event. Replays don't count against your quota.

Dashboard replay & API replay

No — and that's intentional. AnyHook classifies HTTP status codes into retryable and terminal:

Retryable (will retry with backoff): 5xx server errors, 408 timeout, 429 rate limited, network errors.

Terminal (marked failed immediately): 400, 401, 403, 404, 422 — any 4xx except 408/429.

Why? A 400 Bad Request or 422 Unprocessable Entity means the payload or auth is wrong — retrying the same request wastes your retry quota and delays the real fix. AnyHook marks it failed immediately so you get notified faster and can fix the root cause.

Failed events are always available for replay once you've fixed the issue.

Full retry classification table

AnyHook is a real-time relay — events are forwarded as fast as they arrive. We do not currently apply rate limiting or concurrency caps on outbound delivery.

For most teams this is ideal: you want events delivered immediately, not artificially delayed. If your server can handle the traffic from your webhook source directly, it can handle the same volume through AnyHook.

If your server is sensitive to bursts:

1. Return 429 with a Retry-After header — AnyHook will back off and retry.

2. Use your own queue internally (e.g. accept fast, process async).

Per-destination concurrency limits are on our roadmap — if this is critical for your use case, let us know.

Delivery pipeline architecture

Nothing is lost. Here's the sequence:

1. AnyHook keeps retrying on an exponential backoff (5 min → 30 min → 2 h → 12 h).

2. If all retries fail, we email you with the event ID, destination, status code, and a direct link to the event in your dashboard.

3. You also get a circuit breaker alert if 20+ deliveries fail in a row — AnyHook progressively pauses that destination (10 min → 30 min → 2 h → 24 h) to protect your quota. Inbound events keep being received and stored — only outbound delivery pauses.

4. When your server is back: call GET /api/v1/apps/{slug}/events/undelivered to see what you missed, then POST /api/v1/apps/{slug}/replay-failed to catch up. One API call replays everything.

Circuit breaker & recovery flow

Encrypted in transit (TLS) and at rest. Retained only for your plan window (3 / 30 / 90 days), then permanently deleted. We never use payload data to train models. Secrets stored encrypted, never exposed in logs.

Pro/Scale: overage billed at $0.90 / 1,000 events. Set a monthly spending cap ($5–$50) in Settings — once reached, events stop until the next cycle. You can also toggle overage per-app so only critical apps keep flowing.

Free: 3,000/mo + 100/day cap. Overages queue for the next cycle — no surprise bills.

Overage billing details

Yes — two approaches:

1. Set your destination to a tunnel URL (ngrok, cloudflared, localhost.run). AnyHook forwards webhooks there just like any other endpoint.

2. Even better: let AnyHook capture real production events, then replay them to your localhost whenever you need. No need to trigger events manually — test against real data, unlimited times.

Local development guide

Yes — fully. AnyHook works with any HTTP POST webhook, not just the 20+ providers we auto-detect.

For unsupported or custom sources, select "Generic" when creating your App. AnyHook will:

1. Accept and queue every inbound POST — no signature check required.

2. Forward the original headers and body byte-for-byte to your destination.

3. Attach an AnyHook-Signature header (timestamped HMAC-SHA256) so your endpoint can verify the request came through AnyHook.

If your custom source uses HMAC-SHA256, you can configure a signing secret under Generic — AnyHook will verify it at the edge. Otherwise, skip it and let AnyHook act as a secure, logged relay.

Edge verification & supported sources

Yes — per-event limits by plan:

Free: 512 KB · Pro: 2 MB · Scale: 5 MB · Enterprise: custom.

Oversized requests get 413 Payload Too Large at the edge — not silently dropped, not queued, not billed. You see the rejection in your event log with full headers for debugging.

These limits cover 99%+ of webhook payloads. Stripe events are typically 2–8 KB. Even AI-heavy payloads (summaries, embeddings) rarely exceed 1 MB. If you need more, Enterprise plans support custom limits.

Plan limits & payload specs

Three layers:

1. Original provider headers (Stripe-Signature etc.) forwarded intact — your existing SDK verification works without changes on first delivery.

2. Custom headers (Authorization, x-api-key) attached per-destination. Secrets encrypted at rest.

3. AnyHook-Signature header on every request — timestamped HMAC-SHA256 with a per-destination secret. Recommended for production.

AnyHook-Signature verification guide

You can — on the first delivery. But retries will fail.

Provider signatures include a timestamp. Most providers reject signatures older than 5 minutes to prevent replay attacks. AnyHook's retry schedule (5 min → 30 min → 2 h → 12 h) means retries carry the original timestamp from hours ago — your server's signature check will reject them.

AnyHook's solution: we verify the original signature once at the edge, then re-sign every delivery (including retries) with a fresh AnyHook-Signature and current timestamp. Your server checks one header — it never expires, even on the 5th retry.

Trust chain: Provider → AnyHook verifies → AnyHook re-signs → your server verifies AnyHook. You trust AnyHook, AnyHook trusts the provider.

Ship your agent.
We handle delivery.