フォーム送信をSlack/Chatworkに通知する
フォームが送信されたとき・リードが作られたとき・案件ステータスが変わったときに、Slack・Chatwork・自社のシステムへ知らせることができます。設定は組織設定の「Webhook(外部への通知)」で行います。変更できるのは組織のオーナーだけです。
Slack に通知する
- Slack で「Incoming Webhook」を作り、通知したいチャンネルの Webhook URL(`https://hooks.slack.com/…`)をコピーします。
- 組織設定の「Webhook(外部への通知)」で、送り先の種類に「Slack(Incoming Webhook)」を選び、URL を貼ります。
- 知らせる出来事(フォーム送信・リード作成・ステータス変更)にチェックを入れ、「通知を送る」をオンにして保存します。
- 「テスト送信」を押し、チャンネルに【テスト】の通知が届くことを確かめます。
通知は「新しいフォーム送信: 資料請求 / 会社名 氏名(メールアドレス)」の形で、リードの画面へのリンクが付きます。
Chatwork に通知する
Chatwork には Slack のような Incoming Webhook が無いため、Chatwork の API で指定のルームに投稿します。
- Chatwork の「サービス連携」→「API トークン」でトークンを発行します(通知を投稿するアカウントのものです)。
- 通知したいルームを開き、URL の末尾の数字(`#!rid123456789` の `123456789`)をルーム ID として控えます。そのアカウントがルームに参加している必要があります。
- 組織設定で送り先の種類に「Chatwork」を選び、ルーム ID と API トークンを入れて保存します。
- 「テスト送信」で届くことを確かめます。
API トークンは保存後に画面には表示しません(変えるときだけ入れ直してください)。
自社のシステムに送る(汎用 JSON)
送り先の種類に「汎用 JSON(署名付き)」を選ぶと、指定の URL(https のみ)に JSON を POST します。
- ヘッダー: `X-Amo-Event`(出来事の種類)、`X-Amo-Delivery`(送信ごとの ID)、`X-Amo-Signature`(署名)
- 出来事の種類: `lead_created`(リード作成)/ `form_submitted`(フォーム送信)/ `status_changed`(ステータス変更)
- 本文: `{ "id", "event", "occurredAt", "orgId", "data": { "lead", "form", "submission", "status" } }`。`lead` にはメールアドレス・氏名・会社名・ステータス・流入チャネルなどが入ります。社内メモ(フリーメモ・活動記録)は送りません。
署名の確かめ方
最初に保存したとき、署名の秘密鍵が一度だけ表示されます(あとから取り出すことはできません。分からなくなったら「秘密鍵を作り直す」で作り直してください)。
`X-Amo-Signature` は `t=<UNIX秒>,v1=<署名>` の形です。受け取った本文(加工前の文字列)を使い、次のように確かめます。
import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
const t = /t=(\d+)/.exec(header)?.[1];
const v1 = /v1=([0-9a-f]+)/.exec(header)?.[1];
if (!t || !v1) return false;
// 古すぎる通知は受け付けない(5分)
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}送信のしくみ
- 送信はフォームの送信を待たせません(見込み客の画面が遅くなりません)。
- 届かなかったとき(通信エラー・時間切れ・相手のサーバーのエラー)は 1回だけ送り直します。それでも届かなければ、組織設定の「直近の送信結果」に記録されます(30日分)。
- 送り先は https のみで、社内ネットワークなどの内部アドレスには送れません。
- 一括でのステータス変更は通知しません(一度に大量の通知が届くのを防ぐため)。1件ずつの変更は通知します。
よくあるつまずき
- テスト送信が届かない: URL が正しいか、Slack の Webhook が削除されていないかをご確認ください。「直近の送信結果」に相手の応答(HTTP の番号)が出ます。
- Chatwork に届かない: ルーム ID が数字だけになっているか、トークンのアカウントがそのルームに参加しているかをご確認ください。
- 署名が合わない: 本文を JSON として読み直した後の文字列ではなく、受け取ったままの文字列で計算してください。秘密鍵を作り直した場合は、受け取る側の鍵も新しいものに変えてください。