カードの決済や請求書の支払いが失敗しても、Stripe のダッシュボードを開くまで気づけないことがあります。この記事では、支払い失敗を Slack のチャンネルへ流す手順を、金額の読み方と顧客情報の扱いまで含めて説明します。
結論
- Samurai App の「サービス連携」で Stripe の出来事を受け、「通知先へ送る」で Slack へ送ります。 URL の貼り付けは必要ありません。
- 軸にする出来事は
STRIPE_INVOICE_PAYMENT_FAILED(請求書の支払い失敗)とSTRIPE_CHARGE_FAILED(決済の失敗)です。申込みの完了はSTRIPE_CHECKOUT_SESSION_COMPLETEDで受けられます。 - 金額は最小通貨単位の数のまま届きます。日本円の
5000は 5,000 円ですが、米ドルの1099は 10.99 ドルです。 - 「通知先へ送る」はモデルを呼ばないので、この形にクレジットは使いません。受信 1 件ごとの約 0.5 円は別にかかります。
できること・できないこと
できること:
- 出来事ごとに、金額、失敗の理由、請求書番号などを選んで本文に差し込むこと
- 「設定」の「通知」で登録した通知先ごとに、送る先のチャンネルを分けること
Stripe の仕様から来る制約:
- 同じ出来事が 2 回届くことがあります。 Stripe は順序を保証せず、同じイベントを複数回送る場合があると案内しています。本番環境では、受信に失敗すると最長 3 日のあいだ再送します。
invoice.payment_failedは最終的な失敗とは限りません。 自動で再試行される一時的な失敗でも届きます。回数はattempt_countで本文に出せます。checkout.session.completedは入金の完了とは限りません。 セッションが完了していても決済が処理中の場合があるため、payment_statusを本文に載せて見分けます。- 1 回の支払い失敗で
charge.failedとinvoice.payment_failedの両方を受ける形にすると、通知が重なる可能性があります。公式に対応関係の明記が見つからないので、まず片方から始めて、実際の届き方を見てから足すことをおすすめします。
Samurai App の仕様から来る制約:
- トリガーの実行は公開版でしか動きません。
- サービス連携のトリガーを付けられるのはマネージャー以上で、有効にできる数は 20 個です。1 つの出来事に 1 つのトリガーを作るので、受けたい出来事の数だけ上限を消費します。
用意するもの
- Stripe のアカウント
- 投稿先のチャンネルと、そのチャンネルの Slack Incoming Webhook の URL
- Samurai App のマネージャー以上の権限
手順
完成すると、次のようなワークフローになります。

1. Slack で Incoming Webhook を作る
Slack のアプリ管理画面でアプリを作り、「Incoming Webhooks」を有効にします。「Add New Webhook to Workspace」で投稿先のチャンネルを選んで許可すると、URL が発行されます。投稿先はこの時点で固定され、送る側から変更できません。URL が漏れると第三者がそのチャンネルへ投稿できるので、URL は共有しないでください。
2. 通知先を登録する

Samurai App の「設定」→「通知」で「通知先」に名前と URL を登録し、「テスト送信」で届くことを確認します。通知先には https:// の URL だけを登録でき、登録後は URL が再表示されません。
3. Stripe を接続する
「コネクタ」画面の「コネクタ」タブで Stripe を検索して「追加」を押し、自分のアカウントを「連携」します。
4. ワークフローを作る
「ワークフロー」の「新規作成」で作り、ステップを選んでいない状態の「設定」にある「ワークフローの入力」で「入力の項目を追加」を押します。名前を event、種類を「項目の組」にします。
「ステップを追加」から「通知先へ送る」を足し、手順 2 の通知先を選びます。「本文」は「/」か「{{」か「変数」で値を差し込めます。請求書の支払い失敗なら、たとえば次のように書きます。
支払いが失敗しました
請求書: {{input.event.data.object.number}}
金額: {{input.event.data.object.amount_due}} {{input.event.data.object.currency}}
試行回数: {{input.event.data.object.attempt_count}}
決済の失敗なら amount、currency、failure_message を使います。currency は jpy のように小文字で届きます。チャットで作るなら、「Stripe の請求書の支払い失敗を Slack の通知先へ送るワークフローを作って」と頼めます。
5. 公開してトリガーを付ける
「バージョン」タブで「バージョン N を公開」を押します。続いて「トリガー」タブの「サービス連携を追加」を押し、「どのサービスを監視するか」で Stripe を、「どうなったら動かすか」で STRIPE_INVOICE_PAYMENT_FAILED を選びます。届いた内容は入力 event で渡るので、この欄は聞かれません。
6. 最初の 1 件で中身を確認する
出来事が届いたら、「実行」タブの「最近の実行」でステップの入力と出力を開き、差し込んだ値が想定どおりか確認します。この確認が済むまでは本文の項目を増やさないでください。
顧客情報を Slack に流すときの注意
Stripe の出来事には、customer_email、customer_name、customer_address、customer_phone、billing_details など顧客の個人情報が入っています。Slack のチャンネルは参加者全員が読め、投稿は残ります。本文には、必要な項目だけを選んで差し込みます。
- 誰の支払いかは、まず
customer(顧客 ID)で示し、詳細は Stripe のダッシュボードで見る形にすると、Slack に個人情報が残りません。 - 請求書の
hosted_invoice_urlは顧客が請求書の閲覧と支払いをする URL です。チャンネルに貼らないでください。 - 「一緒に送る値(任意)」は Slack には表示されません。出来事全体を入れても画面には出ず、外部へ送るデータが増えるだけなので、使わないでください。
動かないとき
- ステップが失敗し、値が無いと出る。 差し込んだ項目が届いた内容に無いと、空で送られるのではなくステップが失敗します。値が
nullなら空になりますが、親の項目がnullだとその下の項目は無い扱いです。Checkout のcustomer_detailsはnullになりうるので、customer_details.emailのような差し込みはこの形で失敗します。 - 出来事が届いているのに実行されない。 未公開の可能性があります。「バージョン」タブで公開の状態を確認してください。
- 金額の桁が合わない。 最小通貨単位の読み違いです。日本円は小数のない通貨なので、数のままが円の額です。米ドルなど 2 桁の小数を持つ通貨は 100 で割って読みます。
- Slack に届かない。 「通知先」の行に「宛先の URL が見つかりません。URL を確かめてください(404)」と出ていれば URL の誤りです。「編集」で直してください。
よくある質問
テスト環境の決済と本番の決済を見分けられますか
出来事には livemode が含まれます。本文に {{input.event.livemode}} を差し込めば見分けられます。
返金や異議申し立ても通知できますか
選べます。STRIPE_CHARGE_REFUNDED と STRIPE_CHARGE_DISPUTE_CREATED が一覧にあります。それぞれ別のトリガーとして追加します。入金の失敗には STRIPE_PAYOUT_FAILED があります。
重複した通知を止められますか
この手順の形では止められません。同じ出来事が再度届くと、もう一度送られます。Stripe はイベント ID で重複を判別するよう案内しているので、通知を読む側は請求書番号や決済の ID で同じ件かどうかを見てください。