Webhook

新しい案件が登録されたらチャットに知らせる、受注が確定したら別のシステムに伝える、といった連絡を、人が転記・連絡しなくても自動で行えます。アプリでの記録の追加や更新をきっかけに、ほかのシステムへ自動で通知を送ります (これを Webhook と呼びます)。

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

トリガーイベント

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

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

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

設定項目

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

送信先を決められる人

Webhookはレコードの値をアプリの外へ送るため、送信先を決められるのは、そのアプリのレコードと項目を全部見られる人だけです (行や項目のアクセス権で見えないものが1つでもあると決められません。アプリの管理者・システム管理者でも同じです)。 対象になるのは、作成・URLの変更・イベントの変更・無効から有効へ戻す操作で、保存した人が「送信先を決めた人」として記録されます。 名前・シークレットの変更、無効にする・削除するは、誰でも(Webhookを設定できる人なら)行えます。

  • 配信は、送信先を決めた人が送る時点でもアプリのレコードと項目を全部見られるときだけ送られます。 その人のアクセス権が変わって見えないものができた場合や、その人が停止・削除された場合は送信されず、配信ログで「スキップ」になります (Webhookは止まらず、失敗の回数にも数えません)
  • 送信先を決めた人が記録されていないWebhookは送信されません(設定画面に注意が表示されます)。全部を見られる人が一度無効にしてから有効に戻すと、 その人が送信先を決めた人になり、以後は送られます

配信の仕組み

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

送信先のURLを変えると、変える前に待ち行列に積まれた配信(再送を含む)も、送る直前に新しいURLへ送られます(配信ログのURLも新しい値になります。既に送信中のものだけは前のURLで終わることがあります)。 Webhookを無効にした場合は、送信中のものを除いて送られません(配信ログでは「スキップ」になります)。

再送(リトライ)

送信に失敗した場合、指数バックオフ方式で自動的に再送されます。初回送信 + 再送最大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設定画面から有効に戻すと再開されます(有効に戻せるのはプランにWebhookが含まれる場合です。有効化時に失敗回数のカウントは リセットされます)。

手動再送

配信ログの「失敗」または「スキップ」行には「再送」ボタンが表示されます。 自動再送の窓(30分〜1時間程度)を過ぎてしまった配信や、送信先が長時間ダウンしていた 間の配信を、手動で取り戻したい場合に使用してください。手動再送も、送る時点の最新の値を送ります (送信先を決めた人が全部を見られない・レコードが無い場合は、再送しても「スキップ」になります)。

送信されるペイロード

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

  • event — イベント種別(record.create / record.update など)
  • appId — アプリID
  • timestamp — 発生時刻(ISO 8601)
  • payload.recordId — 対象レコードID
  • payload.userId — 操作したユーザーのID(文字列)。公開フォームの送信など、 ユーザーによらない操作では null になります
  • payload.actor — ユーザーによらない操作のときだけ付きます (例: 公開フォームの送信は { "kind": "non_user", "source": "public_form" })。 ユーザーの操作では含まれません
  • payload.data — record.create / record.update では、送る時点のレコードの値のうち、 送る時点でアプリにある項目だけ(削除した項目・テーブルの中の削除した列の値は入りません)。record.status では変更前後のステータス名(fromStatus / toStatus)。record.comment では送る時点のコメントの commentId・body・replyToId・attachmentIds。record.delete には含まれません(レコードが既に削除済みのため)

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

HMAC署名による検証

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

  • 設定したシークレットとペイロード本文からHMAC-SHA256を計算
  • ヘッダー値と自サーバーで計算した値が一致すれば正規のリクエスト
  • 署名は実際に送った本文に対して計算されます(再送では本文が変わりうるので、署名も送られた本文から検証してください)
  • シークレットを定期的にローテーションすることを推奨

配信ログ

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

  • 配信日時
  • 配信状態(送信待ち/送信中/成功/失敗/スキップ)。「スキップ」は送る時点で送れなかったことを示します(Webhookが無効・プランに含まれない・送信先を決めた人がアプリのレコードと項目を全部見られない・レコードやコメントが無い)
  • 試行回数(再送された場合は2以上になります)
  • HTTPステータスコード(200など。まだ結果が確定していない配信では「-」と表示されます)
  • エラーメッセージ(失敗時)
  • 表示件数: 直近50件を表示します
  • 送った本文と受信側のレスポンスボディは記録されません(配信ログには表示されません。レコードの値を配信ログに残さないため)
  • 配信ログは30日を過ぎると、終わった配信(成功・失敗・スキップ)から順に自動で削除されます
  • 「失敗」または「スキップ」の行からは手動で再送できます(前項「手動再送」を参照)

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

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

テスト送信

Webhook設定画面の「テスト」ボタンで、サンプルペイロードを手動送信できます。 URLやシークレット設定の動作確認に使用してください。テスト送信も通常の配信と同じ送信先の検査を通ります (ホスト名が内部アドレスに解決される場合は送信しません)。テスト送信は1つのWebhookにつき1分に10回までです (画面とAIエージェント(MCP)からの送信を合わせて数えます。送信できなかった試みも数えます)。

件数の上限とプラン

  • 1つのアプリに作れるWebhookは50件までです(無効にしているものも数えます)
  • 作成と、送信先が増える変更(URL・イベントの変更、無効から有効へ戻す — 自動停止からの再開を含む)は、プランにWebhookが含まれる場合だけ行えます。 プランにWebhookが含まれなくなった後は、有効なWebhookも送信されません(その間の配信は配信ログで「スキップ」になります。プランを戻すと、以後の配信はまた送られます)。 画面ではWebhookの設定タブが表示されません。無効にする・削除するは、AI エージェント(MCP)の Webhook の道具(止める形・削除)から行えます。名前やシークレットの変更はできません(シークレットの変更は画面だけです)

AI エージェント(MCP)から設定する

WebhookはAI エージェント連携(MCP)からも設定できます (settings:webhooks を許可したトークンが必要です)。AI が作る・送信先を変える・有効に戻すときは、保存した後の送信先 (URL・イベント・有効かどうか)を AI に書き写して申告させる関門を通ります。シークレットは AI からは設定・確認できません(画面だけ)。 送信先を決められる人の決まり(アプリのレコードと項目を全部見られる人だけ)は AI からの保存にも同じく効き、トークンの持ち主で判定します。

使用例

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