Webhook プロバイダーの挙動

エンドポイントが遅いときやダウンしているときに各送信元がどう動くか、送信するデータにどう署名するかをまとめています。ここにある記載にはすべて出典があります。出典を確認できなかった欄は、もっともらしい数字で埋めずに空欄にしています。

署名の列

プロバイダーごとに動作する検証コードで確認し、テストスイートで裏付けています。仕様を読み違えれば、リリースされる前にテストが失敗します。

最終確認 2026-08-20

配信の列

二次情報ではなく、各社の公式ドキュメントから読み取っています。行ごとに出典へのリンクがあります。

最終確認 2026-08-06

配信の挙動

まず応答期限の列を見てください。実際の制約になるのは、なじみのある送信元ではなく、受信している中で最も厳しい送信元です。

プロバイダー応答期限リトライ打ち切り/無効化
Slack出典3 秒3 回リトライ:即時、1 分後、5 分後60 分間で配信試行の 95% 超が失敗すると、イベントサブスクリプションが無効になる
LINE出典2 秒

ボットサーバーが 2 秒以内に応答しないと request_timeout として扱われる

「Webhookの再送」:デフォルトはオフ(チャネルの「Messaging API設定」で有効にする)。回数と間隔は非公開ボットサーバーが受信に失敗し続けると、Webhook の送信を停止することがある。しきい値は非公開
Xero出典5 秒

5 秒以内に、ボディも Cookie もない 200 を返す。署名が正しくなければ 401

未確認未確認
Discord出典3 秒

Interaction エンドポイントは 3 秒以内に最初の応答を返す必要がある

未確認未確認
Shopify出典5 秒

接続に 1 秒、リクエスト全体で 5 秒

4 時間にわたり 8 回リトライAdmin API で作成したサブスクリプションは、8 回連続で失敗すると削除される。アプリの緊急時の開発者連絡先には警告メールが届く
Paddle出典5 秒本番環境:約 2 日間で最大 60 回試行(最初の 1 時間に約 10 回、初日に約 45 回)。サンドボックス:約 2 分以内に 3 回未確認
HubSpot出典5 秒

最大 100 件の通知を含むバッチ全体に適用される

24 時間にわたり最大 10 回試行未確認
GitHub出典10 秒なし。GitHub は失敗した配信を自動ではリトライしない無効化なし。配信は 3 日間は手動で再配信でき、その後は記録が消える
Meta (Instagram, Facebook, Threads)出典未公表36 時間にわたり頻度を下げながらリトライし、その後は破棄。WhatsApp Cloud API は最大 7 日間リトライする未確認
Twilio出典15 秒

設定可能。rt(読み取りタイムアウト)はデフォルト 15000ms(最大 15000)、ct(接続)はデフォルト 5000ms(最大 10000)、tt(合計)はデフォルト 15000ms

設定可能:rc は 0〜5、デフォルトは 1。rp で対象とする失敗の種類を選ぶ未確認
Stripe出典未公表

Stripe は数値を公開していない。ドキュメントにあるのは、時間のかかる処理の前に 2xx を返すようにという指示だけ。20 秒はコミュニティでの目安

本番環境では指数バックオフで最大 3 日間。サンドボックスでは数時間で 3 回試行失敗が続くとエンドポイントが無効化される(その前にメールが届く)。イベントは Events API に 30 日間残る
Svix (Clerk, Resend)出典未公表8 回試行:即時、5 秒、5 分、30 分、2 時間、5 時間、10 時間、10 時間。その後 message.attempt.exhausted の Operational Webhook が送られる5 日間すべての試行が失敗するとエンドポイントが無効化される
WooCommerce出典未公表

配信は Action Scheduler のキューに入り、WP-Cron で処理される。そのため送信はイベント発生時ではなく、次にページが読み込まれたときになる

未確認配信が 5 回を超えて連続で失敗すると Webhook が無効化される

特に注意して読むべき行が 2 つあります。GitHub はまったくリトライしないため、失敗した配信は誰かが 3 日以内に再配信しない限り失われます。Paddle は 60 回の試行のうち、約 10 回を最初の 1 時間に、約 45 回を最初の 1 日に送ります。そのため遅いだけのハンドラーにとっては、Stripe の間隔よりはるかに厳しくなります。

署名方式

多くの人が何時間も費やす原因になるのが「署名対象」の列です。raw body 以外なら、リクエストボディだけをハッシュしても検証できません。

プロバイダーアルゴリズム署名対象エンコードヘッダー許容範囲
SlackHMAC-SHA256v0:{timestamp}:{body}hexx-slack-signature = v0=hex5 分
LINEHMAC-SHA256raw bodybase64x-line-signature = base64なし
XeroHMAC-SHA256raw bodybase64x-xero-signature = base64なし
DiscordEd25519{timestamp}{body}hexx-signature-ed25519 + x-signature-timestampなし
ShopifyHMAC-SHA256raw bodybase64x-shopify-hmac-sha256なし
PaddleHMAC-SHA256{timestamp}:{body}hexpaddle-signature = ts=X;h1=hex5 秒
HubSpotHMAC-SHA256POST{decodedUrl}{body}{timestamp}base64x-hubspot-signature-v35 分
GitHubHMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hexなし
Meta (Instagram, Facebook, Threads)HMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hexなし
TwilioHMAC-SHA1full URL + form params sorted by keybase64x-twilio-signatureなし
StripeHMAC-SHA256{timestamp}.{body}hexstripe-signature = t=X,v1=hex5 分
Svix (Clerk, Resend)HMAC-SHA256{id}.{timestamp}.{body}base64svix-signature = v1,base645 分
WooCommerceHMAC-SHA256raw bodybase64x-wc-webhook-signatureなし
Lemon SqueezyHMAC-SHA256raw bodyhexx-signature + x-event-nameなし
PayPalRSA-SHA256{txId}|{txTime}|{webhookId}|{crc32(body)}base64paypal-transmission-sig + 4 moreなし
SendGridECDSA P-256{timestamp}{body}base64x-twilio-email-event-webhook-signatureなし
LinearHMAC-SHA256raw bodyhexlinear-signatureなし
SentryHMAC-SHA256raw body, no timestamphexsentry-hook-signatureなし
IntercomHMAC-SHA1raw bodyhexx-hub-signature = sha1=hexなし
VercelHMAC-SHA1raw bodyhexx-vercel-signatureなし

このデータを使う

同じ表を /providers.json で JSON として CC BY 4.0 で公開しています。コピーも埋め込みも修正も自由です。数字の誤りや各社の仕様変更に気づいたら、リポジトリで Issue を作成してください。ここで修正します。

出典表記:AnyHook、Webhook プロバイダーの挙動リファレンス、https://anyhook.net/ja/providers

それぞれの数字を取り上げた記事