外部システムへのイベント通知
プランの購入、予約・決済・契約の動きを、登録したURLへ自動で送る機能です(送信 webhook)。基幹システムや会計・顧客管理・券売機などの外部システムに、サブスクラインで起きたことをすぐに反映できます。
場所: 管理画面サイドバー「設定」>「イベント通知(webhook)」タブ >「送信先と未着一覧を開く」(/settings/outbound-webhooks)
使える権限: クライアント管理者
通知するイベント
送信先ごとに、送るイベントを選べます。
| イベント名 | 送るタイミング |
|---|---|
subscription.purchased | プランの初回の支払いが確定したとき(0円・トライアル開始を含む) |
subscription.renewed | 継続課金・プラン変更などで2回目以降の支払いが確定したとき |
reservation.confirmed | 予約が確定したとき(確定で作成された予約・仮予約やキャンセルから確定にした予約。キャンセル申請を取り下げて確定に戻したときは送りません) |
reservation.cancelled | 予約をキャンセルにしたとき(会員のキャンセル・管理画面での変更を含む) |
payment.succeeded | 決済に成功したとき。定期課金(サブスク)の請求・予約の事前決済・注文の一回決済(0円の請求は送りません) |
payment.failed | 決済に失敗したとき。定期課金はカード会社の再試行ごと、予約・注文は失敗ごとに1回 |
subscription.created | 契約が始まったとき(入会) |
subscription.paused | 休会を受け付けたとき、または請求の一時停止を反映したとき |
subscription.cancelled | 解約を受け付けたとき(phase: "requested")と、契約が実際に終わったとき(phase: "ended"。解約予定日の到来・決済が続けて失敗したことによる自動解約を含む) |
送るイベントを選ばずに登録した送信先は、subscription.purchased と subscription.renewed だけを受け取ります。
設定のしかた
- 「送信先を追加」を押します。
- 送信先URL(
https://で始まるURLだけ)と、送るイベントを選んで保存します。 - 画面に署名用の secret が一度だけ表示されます。外部システムに保存してから閉じてください。表示されるのはこの1回だけです。紛失したときは「secret を再発行」を押します(再発行すると以前の secret では署名を検証できなくなります)。
- 「テスト送信」で、
webhook.testイベントを1回送って届くか確かめられます。結果は画面に表示されます。
送信先は5件まで登録できます。社内ネットワーク・ローカルのアドレス(localhost・プライベートIPなど)には送れません。送信先を「送信を有効にする」のチェックを外して止めたり削除したりすると、送信待ちの通知も送りません。
送る内容
Content-Type: application/json の POST で送ります。どのイベントも、先頭に eventId・eventType・occurredAt・clientId が入り、会員は lineUser で送ります。
{
"eventId": "evt_3f1c0a9e2b7d4c58a6e1f0b2c3d4e5f6a7b8c9d0",
"eventType": "reservation.confirmed",
"occurredAt": "2026-11-01T01:00:00.000Z",
"clientId": 123,
"lineUser": {
"id": "会員のハッシュID",
"lineUserId": "LINEのユーザーID",
"memberId": 1024,
"barcodeData": "0000000001024"
},
"reservation": {
"id": "予約のハッシュID",
"status": "confirmation",
"startAt": "2026-11-03T01:00:00.000Z",
"endAt": "2026-11-03T02:00:00.000Z",
"totalPrice": 3300,
"shop": { "id": "店舗のハッシュID", "name": "渋谷店" },
"menus": [{ "id": "メニューのハッシュID", "name": "カット" }]
}
}- 購入のイベントは
plan(プランのハッシュID・名前・種類・回数券の回数)・subscription・payment(金額・支払日時・請求のID)を送ります。 - 契約のイベントは
subscription(契約のハッシュID・状態・開始日・プランの名前と金額)を送ります。休会・解約では、休会の種類や解約日もsubscriptionに入ります。 - 決済のイベントは
payment(targetがsubscription・reservation・orderのどれか・金額・通貨。定期課金は請求のIDinvoiceId(Stripe 以外の継続課金は課金のIDchargeId)、予約・注文は決済のIDpaymentIntentId。失敗時は再試行の回数や失敗の理由コード)と、対応する契約・予約・注文を送ります。注文にはハッシュIDが無いため、paymentIntentIdで突き合わせてください。 - 会員の氏名・電話番号・メールアドレスは送りません。会員はハッシュIDと会員番号で識別してください。
ヘッダー
| ヘッダー | 内容 |
|---|---|
X-Subscline-Event-Type | イベント名 |
X-Subscline-Event-Id | イベントのID(本文の eventId と同じ)。再送しても変わりません |
X-Subscline-Timestamp | 送った時刻(UNIX秒) |
X-Subscline-Signature | v1=<署名> の形の署名 |
署名の確かめ方
v1= の後ろの値は、<X-Subscline-Timestamp の値>.<受け取った本文そのまま> を secret で HMAC-SHA256 にかけた16進文字列です。受け取った本文を JSON として読み直す前の、生の文字列で計算してください。
const crypto = require('crypto')
function verify(rawBody, headers, secret) {
const timestamp = headers['x-subscline-timestamp']
const signature = headers['x-subscline-signature']
const expected = 'v1=' + crypto.createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300 // 5分より古いものは受け付けない
return fresh && expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))
}再送のルール
- 送信先が 2xx を返したら成功です。10秒以内に応答してください。
- 2xx 以外を返したとき・10秒以内に応答がなかったとき・接続できなかったときは、1分・2分・4分…(最長6時間)と間隔をあけて最大8回まで送ります。リダイレクト(3xx)には従いません。
- 同じイベントが2回届くことがあります。
X-Subscline-Event-Idで重複を取り除いてください。 - 送信に失敗しても、購入・予約・決済・解約などの手続きそのものは取り消されません。
- 通知は手続きの完了後に受け付けます。受け付けの直前にサーバーが止まった場合など、まれに通知が欠けることがあります。外部システムで状態を正確に保つ必要があるときは、定期的にサブスクラインの管理画面やデータの書き出しと突き合わせてください。
- 上限まで届かなかった通知と、送信先を止めた・削除したため送らなかった通知は、画面下の「届かなかった通知」で、送信回数・最後に受け取ったHTTPステータス・理由を確認できます。