LLM 呼び出しが約 20 秒を超える → Stripe が失敗と判定してリトライ → ハンドラーが 2 回実行される → 二重処理。
/v1/webhook_endpoints · status: failed
LLM の呼び出しで、ハンドラーは 45 秒かかります。Stripe は約 20 秒でタイムアウトし、リトライします。顧客の注文は二重処理され、発送、クレジットの付与、メールの送信が 2 回行われます。
AnyHook は送信元とハンドラーの間に入ります。ハンドラーのコードに手を入れずに、すべてを保存し、リトライし、記録し、再送します。
evt_3Pk2X3b1Lcx
リクエストがタイムアウトしました。Stripe は最長 3 日間、バックオフ付きでリトライします。
$ stripe webhooks update we_1234
--url in.anyhook.net/u/app
✓ Endpoint updated
✓ Delivering to AnyHookevt_3Pk2X3b1Lcx
1 回目の試行 · 送信元に応答済み · ハンドラー 47.2 秒
// before
await llm.run(evt); /* 45s */
// after
return Response.json({ ok: true });回避した送信元のリトライ
127
LLM 呼び出しが約 20 秒を超える → Stripe が失敗と判定してリトライ → ハンドラーが 2 回実行される → 二重処理。
/v1/webhook_endpoints · status: failed
ボットは 3 秒以内に応答しなければなりません。AI エージェントが 30 秒かかると、Slack は 3 回リトライし、ボットが最大 4 回応答することがあります。
応答が遅れると失敗とみなされ、4 時間にわたり 8 回リトライします。失敗が続くとサブスクリプションが削除され、注文が届かなくなります。
本番環境の Webhook トラフィック向けです。リトライを 2 週間かけて自前で作るより安く済みます。
配信について、AnyHook の言葉をうのみにする必要はありません。署名検証ライブラリと MCP サーバーは Apache 2.0 で公開しています(github.com/gba3124/anyhook-mcp)。中継サービス自体はオープンソースではありません。
メールアドレスか Google で新規登録します。AnyHook が https://in.anyhook.net/you/app のような受信 URL を発行します。Free プランならクレジットカードの登録は不要です。
Stripe ダッシュボード → Webhook → エンドポイントを編集 → AnyHook の URL を貼り付けます。GitHub、Shopify、Slack Events API、Paddle でも同じ変更で動きます。ハンドラーのコードはそのままです。
AnyHook はイベントを保存し、送信元に約 1 秒で 200 を返し、リトライ付きでハンドラーに転送します。配信は少なくとも 1 回(at-least-once)なので、重複排除には X-AnyHook-Delivery を使います。失敗したイベントはダッシュボードに残り、Replay(再送)ボタンを 1 クリックで再送できます。
向いている
向いていない
SDK を導入してハンドラーを永続関数として書き直す余力があるなら、Inngest は優れた選択です。AnyHook は、ハンドラーの形を変えずに解決したいチーム向けです。Webhook の URL を 1 つ変えるだけで、既存のコードはそのまま使えます。
はい。月 10,000 件(1 日の上限は 1,000 件)、App 1 つで、クレジットカードの登録は不要です。趣味のプロジェクトなら十分に動かせる一方、本番のトラフィックなら自然にアップグレードしたくなる量にしています。裏はなく、期限もありません。
GitHub、Shopify、Slack Events API、Paddle、Linear、Clerk など、どれも同じように URL を差し替えるだけで使えます。署名検証の方式は、受信したヘッダーから自動で判別します。
一部だけです。どの部分なのかを正確に書いておきます。署名検証ライブラリと MCP サーバーは github.com/gba3124/anyhook-mcp で Apache 2.0 として公開しているので、AnyHook が署名したすべての配信を、AnyHook を信用することも依存することもなく検証できます。受信、保存、リトライを行う中継サービスはオープンソースではなく、現時点でセルフホスト版もありません。
保存時に暗号化して保存します(AES-256-GCM)。プランの再送可能期間(3/30/90 日)は再送でき、その後 Free のイベントは削除されます。有料プランでは読み取り専用の暗号化アーカイブとして残ります(Pro は 1 年、Scale は 7 年)。鍵が AnyHook のインフラの外に出ることはありません。Pro と Scale では、ゼロリテンションをオンにすることもできます。オンにすると、配信が完了した時点で、イベントのヘッダーとボディがログから消去されます。暗号化アーカイブには、そのコピーが残ります。
Free では、月間クォータを超えたイベントは、さらにクォータの 20% まで、ログで保留(held)になり、アップグレード後に再送できます。それを超えたときと、1 日の上限を超えたときは、エッジが 429 を返して何も保存せず、メールが届きます。Pro にアップグレードすると、上限はすぐに解除されます。Pro の超過料金は 1K 件あたり $0.15 で、ダッシュボードで任意の超過料金の上限(Spending cap)を設定できます。上限を超えたイベントは、課金されずに保留になります。
無料で新規登録して受信 URL を受け取り、Stripe で差し替えます。リトライは AnyHook が吸収し、ハンドラーは今とまったく同じように動き続けます。