Webhook

Webhookは、アプリ内でレコード操作が発生したときに外部のHTTPエンドポイントへ自動通知する機能です。 Slack、Microsoft Teams、独自システムなどと連携できます。

トリガーイベント

イベント
record.create
発生タイミング
新規レコードが登録されたとき
イベント
record.update
発生タイミング
レコードが編集されたとき
イベント
record.delete
発生タイミング
レコードがゴミ箱へ移動されたとき(通知ルールの「レコード削除時」トリガーと同じタイミング。完全削除では発火しません)
イベント
record.status
発生タイミング
ワークフローのステータスが変更されたとき
イベント
record.comment
発生タイミング
レコードにコメントが投稿されたとき

複数のイベントを同じWebhookで購読できます。

CSVインポートで作成・更新した行は Webhook を発火しません。取り込みは数万件規模になり得るため、都度の外部送信には対応していません (詳細はレコードの CSV インポートを参照)。

設定項目

項目
名前
説明
Webhookの識別用名称
項目
URL
説明
通知先のエンドポイント(HTTPS推奨)
項目
イベント
説明
購読するイベント種別(複数選択可)
項目
シークレット
説明
HMAC署名用のシークレット文字列(任意、空なら署名なし)

配信の仕組み

イベントが発生すると、配信は即座に送信されるのではなく一旦待ち行列に積まれ、 順に送信されます(同時送信数は内部で制限されており、大量のレコード操作が 重なっても送信先への負荷が急増しません)。通常は数秒以内に配信されますが、 待ち行列が混み合っている場合は多少の遅延が生じることがあります。

再送(リトライ)

送信に失敗した場合、指数バックオフ方式で自動的に再送されます。初回送信 + 再送最大5回(合計最大6回。再送間隔は指数的に延び、全試行の完了まで最短でも約30分、送信先の状態により最大1時間程度)まで試行します。

  • 再送する失敗 — 接続エラー・タイムアウト・5xx(サーバーエラー)・408・425・429
  • 再送しない失敗 — 上記以外の4xx(URLの誤り・認証失敗など、時間を置いても直らないエラー)。この場合は初回で失敗が確定します
  • リダイレクト(3xx)は失敗として扱います — 安全のためリダイレクトには追従しません。転送先ではなく最終的なURLを登録してください。また、送信先が内部アドレス(ローカルホスト・プライベートネットワーク等)の場合は送信せずに失敗となります

Webhookは「少なくとも1回」の配信を保証する設計のため、まれに同じ通知が 2回以上受信側に届くことがあります(再送は同一の配信IDで行われるため、本文・ 署名は再送でも変化しません)。受信側では 次項の X-Webhook-Delivery ヘッダーを使って重複を排除することを 強く推奨します。

送信ヘッダー

ヘッダー
X-Webhook-Delivery
説明
配信ID。1つの配信(イベント×購読)に対して発行され、再送しても同じ値のまま変わりません。重複排除のキーとして使用してください
ヘッダー
X-Webhook-Attempt
説明
試行回数(1始まり)。再送のたびに増加します
ヘッダー
X-Webhook-Event
説明
イベント種別(本文のeventと同じ値)
ヘッダー
X-Webhook-Signature
説明
シークレット設定時のHMAC-SHA256署名(詳細は次項)

自動停止

1つのWebhookで配信の最終的な失敗(再送を使い切った、または再送対象外の 失敗が確定した場合)が連続10回発生すると、そのWebhookは 自動的に無効化され、アプリの管理者とシステム管理者に通知が送られます。送信先の状態を確認し、 Webhook設定画面から有効に戻すと再開されます(有効化時に失敗回数のカウントは リセットされます)。

手動再送

配信ログの「失敗」または「スキップ」行には「再送」ボタンが表示されます。 自動再送の窓(30分〜1時間程度)を過ぎてしまった配信や、送信先が長時間ダウンしていた 間の配信を、手動で取り戻したい場合に使用してください。

送信されるペイロード

イベント発生時、POSTリクエストのボディに以下の構造のJSONが送信されます。

  • event — イベント種別(record.create / record.update など)
  • appId — アプリID
  • timestamp — 発生時刻(ISO 8601)
  • payload.recordId — 対象レコードID
  • payload.userId — 操作したユーザーのID(文字列)
  • payload.data — レコードの現在値。record.create /record.update / record.status では送信されますが、record.delete には含まれません(レコードが既に削除済みのため)。record.comment では commentIdbody のみが入ります

アプリ名やユーザーの氏名・メールアドレス等は Webhook ペイロードには含まれません。 必要な場合は appId / userId を元に REST API で追加取得してください。

HMAC署名による検証

シークレットを設定すると、リクエストヘッダー X-Webhook-Signature にHMAC-SHA256署名が付与されます。 受信側で署名を検証することで、正規のRaxelからのリクエストかを判定できます。

  • 設定したシークレットとペイロード本文からHMAC-SHA256を計算
  • ヘッダー値と自サーバーで計算した値が一致すれば正規のリクエスト
  • 再送であっても本文は初回と同一のため、署名の検証結果は変わりません
  • シークレットを定期的にローテーションすることを推奨

配信ログ

各Webhookの配信履歴を確認できます。

  • 配信日時
  • 配信状態(送信待ち/送信中/成功/失敗/スキップ)。「スキップ」はWebhookが無効(自動停止中または手動で無効化中)の間に配信が回ってきたため送信されなかったことを示します
  • 試行回数(再送された場合は2以上になります)
  • HTTPステータスコード(200など。まだ結果が確定していない配信では「-」と表示されます)
  • エラーメッセージ(失敗時)
  • 表示件数: 直近50件を表示します
  • 受信側のレスポンスボディは最大2000文字まで記録され、それを超える分は切り詰められます
  • 「失敗」または「スキップ」の行からは手動で再送できます(前項「手動再送」を参照)

タイムアウトと送信先制限

  • Webhook のリクエストタイムアウトは 5秒 です。受信側は速やかに 2xx を返して実処理は非同期化することを推奨します
  • 送信先URLは検証されます。localhost / ループバック / プライベートIPアドレス (RFC1918)/ クラウドメタデータエンドポイント (169.254.169.254 等)への送信は拒否されます
  • HTTPS の使用を推奨します

テスト送信

Webhook設定画面の「テスト」ボタンで、サンプルペイロードを手動送信できます。 URLやシークレット設定の動作確認に使用してください。

使用例

  • Slack通知 — 新規案件発生時にSlack Incoming Webhookへ転送
  • 外部システム連携 — 受注確定時に在庫管理システムへ通知
  • ログ集約 — すべてのレコード変更をログサーバーへ送信