SaaS 企業が決済の失敗の通知を n8n で受け、拒否の理由と契約の事情で分けて、督促と案内の下書きを作る
Stripe から届く請求書の決済の失敗の通知を n8n で受け、カードの拒否の理由と顧客の契約・過去のやり取りから対応の型に分けます。型ごとに督促と案内のメールの下書きを作り、担当者が直して送ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- EC/IT・SaaS/広告
- 対象部門
- カスタマーサポート/経理
- 対象業務
- 分類・仕分け/書類作成
- 主な課題
- 人手が足りない/問い合わせが多い/期限・対応漏れが起きる
- AIで行う処理
- 分類
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 経理の担当が毎朝 Stripe のダッシュボードで、決済が失敗した請求書の一覧を開く
- 1件ずつ請求書を開き、支払いの詳細から拒否の理由を読む
- 顧客管理のシステムで、契約の種類(月額・年額)、更新日、担当者、過去の問い合わせを確かめる
- 理由と事情から「カードの更新を頼む」「発行会社に問い合わせてもらう」「様子を見る」などを決める
- カスタマーサポートに依頼を出し、担当がメールを書いて送る
- 送ったことを顧客管理のシステムに記録する
- 自動Stripe の `invoice.payment_failed` が n8n の Stripe Trigger に届く
- 自動n8n がイベントの ID で重複を除き、請求書から支払い(PaymentIntent)と最新の Charge を取り、拒否の理由(`outcome.reason`)と次の対応の助言(`advice_code`)を読む
- 自動プログラムが、拒否の理由を対応表に当てて機械で決まる型を先に決める。不正利用の疑い・紛失・盗難は「理由を伝えない型」に回す
- 自動機械で決まらなかった失敗について、顧客管理のシステムから契約・更新日・過去のやり取りを取り、Text Classifier が対応の型に分ける
- 自動Basic LLM Chain が、型ごとの決まった骨組みに沿ってメールの下書きを作り、Gmail に下書きとして置く
- 自動担当者向けに、型・理由・下書きへのリンクを一覧にする
- 人担当者が一覧から下書きを開き、直して送る。「理由を伝えない型」と「人が見る型」は経理の責任者が見る
- 自動送った記録と型を Data Table に残す
各工程の詳しい説明を読む
- 経理の担当が毎朝 Stripe のダッシュボードで、決済が失敗した請求書の一覧を開く
- 1件ずつ請求書を開き、支払いの詳細から拒否の理由を読む
- 顧客管理のシステムで、契約の種類(月額・年額)、更新日、担当者、過去の問い合わせを確かめる
- 理由と事情から「カードの更新を頼む」「発行会社に問い合わせてもらう」「様子を見る」などを決める
- カスタマーサポートに依頼を出し、担当がメールを書いて送る
- 送ったことを顧客管理のシステムに記録する
(a)理由を読むまでに時間がかかる。 拒否の理由は支払いの詳細を開いて初めて見えます。同じ顧客の再試行の失敗が並び、どれが新しいかを探すところから始まります。
(b)「理由は不明」の失敗で手が止まる。 do_not_honor や generic_decline は、公式ページでも発行会社への問い合わせが案内されるだけです。同じ文面を、年額更新で枠を超えた顧客にも、カードの持ち主が退職した顧客にも送ってしまいます。
(c)伝えてはいけない理由を書いてしまう。 不正利用の疑いの拒否を見たまま書くと、顧客の担当者は自分が疑われたと受け取ります。
(d)月初に件数が集中する。 後回しになった顧客から順に、連絡より先に利用停止の期日が来ます。
- 【自動】 Stripe の
invoice.payment_failedが n8n の Stripe Trigger に届く - 【自動】 n8n がイベントの ID で重複を除き、請求書から支払い(PaymentIntent)と最新の Charge を取り、拒否の理由(
outcome.reason)と次の対応の助言(advice_code)を読む - 【自動】 プログラムが、拒否の理由を対応表に当てて機械で決まる型を先に決める。不正利用の疑い・紛失・盗難は「理由を伝えない型」に回す
- 【自動】 機械で決まらなかった失敗について、顧客管理のシステムから契約・更新日・過去のやり取りを取り、Text Classifier が対応の型に分ける
- 【自動】 Basic LLM Chain が、型ごとの決まった骨組みに沿ってメールの下書きを作り、Gmail に下書きとして置く
- 【自動】 担当者向けに、型・理由・下書きへのリンクを一覧にする
- 【人】 担当者が一覧から下書きを開き、直して送る。「理由を伝えない型」と「人が見る型」は経理の責任者が見る
- 【自動】 送った記録と型を Data Table に残す
3番目と4番目の順が、この設計の要です。 AIに渡すのは「理由は不明」とされる拒否だけにします。全件を分けさせると、expired_card のような明らかなものまで事情から推して別の型にすることがあります。
5番目で送らず下書きにするのは、型の取り違えが1件あれば、その顧客との次の更新に残るからです。
02今回想定するシステム構成
Stripe Billing(請求書の決済の失敗) │ invoice.payment_failed ▼【トリガー】Stripe Trigger ノード(署名の検証を有効) n8n ├─ Data Table「events」── イベント ID で重複を除く ├─ HTTP Request(Stripe API)── 請求書の支払い → PaymentIntent → 最新の Charge ├─ Code ── outcome.reason と advice_code を対応表に当て、機械で決まる型を付ける │ └─ 不正利用の疑い・紛失・盗難 → 「理由を伝えない型」へ(AIに渡さない) ├─ HTTP Request(顧客管理のシステム)── 契約の種類・更新日・担当者・直近のやり取り ▼ Text Classifier + Anthropic Chat Model │ 「理由は不明」の拒否を、契約とやり取りから対応の型に分ける(Other の出口あり) ▼ Basic LLM Chain + Anthropic Chat Model + Structured Output Parser │ 型ごとの骨組みに沿ったメールの下書き ▼ Gmail(Draft の Create)── 顧客の担当者あての下書き ▼ Data Table「dunning_log」── 型・理由・下書き・送信の記録 ▼ 【人】担当者が下書きを直して送る
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n(Stripe Trigger、HTTP Request、Code、Data Table、Text Classifier、Basic LLM Chain、Gmail) | Make、Zapier、Power Automate |
| 生成AI | Claude(n8n の Anthropic Chat Model から) | ChatGPT(OpenAI)、Gemini |
| 決済 | Stripe Billing(invoice.payment_failed、Smart Retries) | 他社の継続課金の決済サービス |
| 保管 | n8n の Data Table(重複の除去、対応の記録) | 社内のデータベース |
新しく入れるのは n8n と Claude の API です。 最初の準備は、拒否コードから型を引く対応表を作ることです。 Stripe の拒否コードの一覧の「次のステップ」を、自社の対応の型に読み替えます。
受け口は n8n の Stripe Trigger ノードです。 Stripe の資格情報に Signature Secret を設定すると、ノードが Stripe-Signature ヘッダーを確かめ、署名の無いもの・偽造・5分より古いものを 401 で拒みます(n8n 2.25.7・2.26.2 以降)。設定しないと、URL を知っていれば誰でも偽のイベントを送れます。
AIの部分は2段です。 型を分けるのは Text Classifier、下書きを作るのは Basic LLM Chain(「Require Specific Output Format」で Structured Output Parser をつなぐ)で、どちらにも Anthropic Chat Model をつなぎます。
03どうやって実装するのか
処理の起点を決める
起点は Stripe の invoice.payment_failed です。 Stripe の Smart Retries のページは、サブスクリプションの支払いの失敗と再試行の回数の更新をこの Webhook で受けるよう案内しています。再試行のたびに同じ請求書の通知が届くため、届いたらすぐ下書きを作るのではなく、請求書ごとに1回目の失敗と、型が変わったときだけ動かします。
Smart Retries は、決めた回数と期間で再試行し、推奨の既定は2週間以内に8回です。カスタムの規則にすると、前回から決めた日数を空けて最大3回の再試行になります。再試行で戻る失敗に、1回目から督促を送る必要はありません。 そこで型ごとに「すぐ連絡する」「再試行を何回か待つ」を決めておきます(第7章「AIに何をさせるのか」の表)。
Stripe の Webhook は、同じイベントを複数回届けることがあり、届く順も保証されません。 Stripe は処理したイベント ID を記録して二重に処理しないよう案内しています。n8n では受けた直後に Data Table「events」でイベント ID を引き、あれば止めます。受けたらすぐ成功を返すことも求められているので、重い処理は後ろに回します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 失敗の通知 | イベント ID、請求書の ID、顧客、attempt_count、amount_due、billing_reason、hosted_invoice_url | Stripe(invoice.payment_failed) |
| 拒否の理由 | Charge の outcome.reason(拒否コード)と outcome.advice_code | Stripe API(PaymentIntent の latest_charge) |
| 顧客の契約 | 契約の種類(月額・年額)、更新日、利用停止の予定日、請求先の担当者、支払い方法の種類 | 顧客管理のシステム |
| 直近のやり取り | 過去90日の問い合わせの件名と本文の要点、担当者の交代の記録 | 顧客管理のシステム |
| 型の対応表 | 拒否コード → 型、待つ再試行の回数 | 自社で作る表(Data Table) |
質を決めるのは、下の3つです。 拒否コードは「何が起きたか」しか言いません。「この顧客に何をお願いするか」は、契約とやり取りを見て初めて決まります。 年額の更新で card_velocity_exceeded(利用限度額の超過)になった顧客と、月額の少額で同じコードになった顧客では、お願いすることが違います。
データの取得方法を決める
拒否の理由は、通知の中には直接入っていません。 請求書の payments は既定では返らず、expand で取ります。そこから支払い(PaymentIntent)を引き、PaymentIntent の latest_charge を展開して Charge の outcome を読みます。Stripe の公式ページは、拒否コードを outcome の reason に、次の対応を outcome の advice_code に示すとしています。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 請求書の支払い | Invoice の payments(expand で取得) | PaymentIntent の ID を得る |
| 最新の Charge | PaymentIntent の latest_charge(展開) | outcome.reason と outcome.advice_code |
| 再試行の回数 | Invoice の attempt_count | 型ごとに待つ回数との比較 |
| 支払いの画面 | Invoice の hosted_invoice_url | 顧客が支払い方法を直せる場所として文面に入れる |
| 契約とやり取り | 顧客管理のシステムの API | 型の分類と文面 |
attempt_count には注意があります。 公式ページによると、再試行できない拒否コード(ハードデクライン)が返ると、新しい支払い方法が登録されるまで再試行は実行されませんが、予定は残り attempt_count は増え続けます。 回数が増えていても、実際には請求していないことがあります。回数だけを見て「何度も失敗している顧客」と扱わないでください。
HTTP Request ノードで Stripe API を呼ぶときは、n8n の Stripe の資格情報を使います。読むだけなので、制限付きのキーで請求書・支払い・Charge の読み取りに絞ります。
AIへ渡す前に整形する
- 重複の除去 … イベント ID で引き、処理済みなら止める。同じ請求書の再試行の通知は、型が前回と同じなら止める
- 型の先決め …
outcome.reasonを対応表に当てる。当たれば型が決まり、AIの分類に回さない - 理由を伝えない型の抜き出し …
fraudulent・stolen_card・lost_card・merchant_blacklistは「理由を伝えない型」にし、拒否コードの文字をこの後のどのノードにも渡さない - 待つ回数の判定 … 型ごとの「待つ再試行の回数」に
attempt_countが届いていなければ、記録だけして止める - 契約とやり取りの取得 … 顧客の ID で顧客管理のシステムを引き、過去90日のやり取りを件名と要点に絞る
- 個人情報の削り … やり取りの本文から電話番号・カード番号らしき数字の並びを伏せる
3番目は、文面の段で気をつけるのでは足りません。 下書きを作るAIに fraudulent という文字が渡れば、どれだけ指示しても文面に出る可能性が残ります。渡さなければ、書かれようがありません。
AIに処理させる
させるのは2つです。 「理由は不明」の拒否を対応の型に分けること、型ごとの骨組みに沿って下書きを書くことです。まず、プログラムが決める型と、AIが分ける型を分けます。
| 型 | 決め方 | 主な拒否コード | 待つ再試行 |
|---|---|---|---|
| カードの更新のお願い | 対応表 | expired_card、incorrect_number、pickup_card | 0回 |
| 認証のお願い | 対応表 | authentication_required | 0回 |
| 残高・枠の確認のお願い | 対応表 | insufficient_funds、card_velocity_exceeded | 2回 |
| 再試行を待つ | 対応表 | processing_error、issuer_not_available | 3回 |
| 理由を伝えない型 | 対応表(人へ) | fraudulent、stolen_card、lost_card、merchant_blacklist | 0回 |
| 下の4つのどれか | Text Classifier | do_not_honor、generic_decline、call_issuer ほか「理由は不明」 | 1回 |
AIが分けるのは、最後の行の4つの型です。
| 型 | どういうとき | 文面でお願いすること |
|---|---|---|
| 年額・高額の枠 | 年額の更新、または前月より請求額が大きく増えた | 発行会社への枠の確認、または請求書払いへの切替の相談 |
| 支払い担当の交代 | やり取りに担当者の交代・退職・部署の異動が出ている | 支払い方法の登録し直し |
| 解約の気配 | 直近のやり取りに不満・解約・他社への言及がある | カスタマーサポートが先に連絡(督促を出さない) |
| 発行会社への問い合わせ | 上のどれにも当たらない | 発行会社への問い合わせ |
3つ目の型が、AIに分けさせる理由です。 解約を考えている顧客に督促のメールを先に送ると、解約の背中を押します。拒否コードには出てこない事情で、やり取りの文面を読まないと分かりません。 Text Classifier の「When No Clear Match」は既定で当てはまらない項目を捨てるので、「Output on Extra, 'Other' Branch」に変え、Other は人が見る型にします。
| させないこと | 理由 |
|---|---|
| 拒否コードから決まる型を変える | 対応表で決まるものを事情で上書きしない |
| 理由を伝えない型の文面 | 拒否コードを渡さない。文面は人が書く |
| 利用停止・解約の判断 | 契約の判断は担当者と責任者が行う |
| 支払い期日・停止日の計算 | 日付は顧客管理のシステムの値を写す |
| メールの送信 | 下書きまで。送るのは人 |
指示内容を固定する
Text Classifier の型の説明と、System Prompt Template に入れる指示です。
あなたは SaaS 企業の経理部で、カードの継続課金が失敗した顧客への連絡を準備する立場です。
カード発行会社が理由を示さずに拒否した決済について、顧客の契約と直近のやり取りだけを見て、
次の型のどれに当たるかを選んでください。
【型】
{categories}
【判断の材料】
- 契約の種類(月額・年額)と、今回の請求額と前月の請求額
- 直近90日のやり取りの件名と要点
- 担当者の交代の記録
【厳守事項】
- 材料に書かれていない事情を推測しないでください。
やり取りに担当者の交代が書かれていなければ「支払い担当の交代」を選ばないでください。
- 「解約の気配」は、やり取りに解約・不満・他社への切替の言及がある場合だけ選んでください。
請求額が増えたことだけを理由に選ばないでください。
- どれにも当てはまると言い切れないときは、無理に選ばないでください。
- 型の名前だけを返してください。理由の説明は要りません。
Basic LLM Chain に渡す、下書きの指示です。
あなたは SaaS 企業のカスタマーサポートで、決済の失敗を顧客にお知らせするメールの下書きを書きます。
下の【型】の骨組みに沿って、件名と本文を書いてください。
【厳守事項】
- カードが拒否された理由を、骨組みに書かれている以上に説明しないでください。
「不正」「紛失」「盗難」「残高不足」などの言葉は、骨組みに無ければ使わないでください。
- 金額・請求書番号・利用停止の予定日は【請求の情報】の値をそのまま写してください。
日付を計算したり、言い換えたりしないでください。値が空なら「(要確認)」と書いてください。
- 支払い方法を直す場所として【支払いの画面の URL】を1回だけ入れてください。
カード番号やセキュリティコードをメールで送るよう頼まないでください。
- 利用停止や解約を予告する言葉は、骨組みにある一文だけにしてください。
- 宛名は【請求先の担当者】の値を使ってください。空なら「ご担当者様」としてください。
【型】{route}
【骨組み】{template}
【請求の情報】{invoice_summary}
【支払いの画面の URL】{hosted_invoice_url}
【請求先の担当者】{billing_contact}
「骨組みに無い言葉を使わない」を、具体的な言葉を挙げて書くのが要点です。 「理由を詳しく書かない」だけだと、AIは親切のつもりで「残高不足の可能性があります」と補います。理由を伝えない型をAIに渡していなくても、他の型の文面で同じことが起きます。
出力形式を固定する
Text Classifier は型ごとの出口に項目を流します。 型の名前を出口から受けるので、AIが自由な文字列を返して後段が迷うことはありません。下書きは次の JSON で受けます。
{
"invoice_id": "in_...",
"customer_id": "cus_...",
"route": "card_update | authentication | balance_limit | wait_retry | do_not_disclose | high_amount | contact_change | churn_risk | ask_issuer | other",
"route_source": "rule | classifier",
"decline_code_group": "known | unknown | do_not_disclose",
"attempt_count": 1,
"draft": {
"subject": "",
"body": "",
"missing_fields": []
},
"needs_review_by": "staff | manager"
}
1つ目の理由は、route_source で「誰が型を決めたか」を残せることです。 対応表で決まった型と、AIが分けた型を後で別々に数えられます。AIの分類を見直すとき、対象を classifier だけに絞れます。
2つ目は、decline_code_group に拒否コードそのものを入れないことです。 ログにも下書きにも fraudulent の文字を残さず、do_not_disclose という群だけを書きます。拒否コードは Stripe 側に残っているので、必要なら経理の責任者がそちらで見ます。
3つ目は、missing_fields で埋められなかった値が分かることです。 利用停止の予定日が顧客管理のシステムに無ければ、下書きには「(要確認)」と入り、この欄に名前が出ます。担当者は本文を読む前に、確かめる項目が分かります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Stripe | Stripe Trigger(署名の検証あり) | invoice.payment_failed を受ける |
| Stripe API | HTTP Request(読み取りの制限付きキー) | 請求書の支払い、PaymentIntent、Charge の outcome |
| 顧客管理のシステム | HTTP Request | 契約・更新日・担当者・直近のやり取り |
| Claude | Anthropic Chat Model | 型の分類と下書き |
| Gmail | Draft の Create | 請求先の担当者あての下書き(To・件名・本文・スレッド) |
| Data Table | Insert・Upsert | イベント ID、型、送信の記録 |
Stripe には書き込みません。 再試行の予定を変えたり、サブスクリプションを止めたりはこの構成の外です。下書きの段で止めているので、型を取り違えても顧客には何も届きません。
Gmail の Draft の Create は、To・件名・本文に加えて Thread ID を指定でき、過去のやり取りのスレッドに下書きを付けられます。同じ顧客とのやり取りが続いているときは、新しいメールより返信の形のほうが読まれます。
人が確認する
- 担当者が毎朝、一覧を型の順に開く … 「カードの更新のお願い」「認証のお願い」は件名と宛先だけ確かめて送る
- AIが分けた型は本文まで読む …
route_sourceがclassifierのものは、やり取りの要点と型が合っているかを確かめる - 「解約の気配」は督促を出さない … カスタマーサポートの担当が先に電話かメールで事情を聞く
- 「理由を伝えない型」と Other は経理の責任者が見る … 文面は人が書く。拒否の理由には触れず、別の支払い方法の登録をお願いする
- 型を直したら記録する … どの型からどの型に直したかを Data Table に残す
4番目を省かないでください。 事情を書けない以上、何を伝えるかは人が決めます。
目標は、240件をならして1件5分です。 対応表で決まる型は1〜2分で送れ、AIが分けた型と人が見る型は数分から10分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 署名の検証に失敗する | ノードが 401 で拒み、ワークフローは動かない。Stripe 側の配信の失敗を見て原因を調べる |
| 同じイベントが2回届く | イベント ID で止める |
payments に支払いが無い | 支払い方法が無い請求書。「カードの更新のお願い」にする |
latest_charge が null | 決済が試みられていない。記録だけして次の通知を待つ |
| 拒否コードが対応表に無い | 新しいコードか地域の決済手段のコード。Other として人へ回し、対応表に足す |
| 顧客管理のシステムに顧客が無い | Stripe の顧客 ID の対応が切れている。人へ |
| やり取りが空 | Text Classifier は契約の情報だけで分ける。迷えば Other |
| Claude の応答が返らない | 記録だけ残し、1時間後にもう一度分類する。その間に担当者が一覧で気づける |
| 下書きの宛先が空 | 下書きを作らず、missing_fields に宛先を出して人へ |
上から3行目と4行目は、正常に起きます。 エラーとして扱うと、毎朝の一覧が赤い行で埋まります。
記録を残す
- 受けたイベント ID、請求書の ID、顧客、
attempt_count、受けた時刻 - 型と
route_source、decline_code_group(拒否コードそのものは残さない) - Text Classifier に渡したやり取りの要点(伏せ字にした後のもの)
- 下書きの件名・本文と、担当者が送った版の差分
- 人が型を直した記録 … どの型からどの型へ、誰が
- 送った後に支払いが戻ったか(
invoice.paidの有無と日付)
最後の行が、型の対応表を直す材料になります。 「残高・枠の確認のお願い」を2回待ってから送っている型で、待つ間に戻る割合が高ければ、待つ回数を増やせます。逆に、送った後もほとんど戻らない型は、文面よりお願いの中身を見直します。
04実装レベルの3段階
半自動化で①の4分はほぼ無くなりますが、②と③は残ります。本格構成で②と③が下書きの確認に変わり、1件5分になります。この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、対応表に無いコードが何かが分かり、Other に落ちる件数を減らせます。
05工数削減シミュレーション
導入後 240件 × 5分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 法人向けの SaaS を月額・年額で提供し、Stripe Billing でカードの継続課金を受けている企業。決済の失敗が毎月数百件あり、経理が Stripe のダッシュボードで拒否の理由を1件ずつ見て、カスタマーサポートが顧客の事情を調べてから督促のメールを書いているため、連絡が遅れて利用停止の期日を迎える顧客が出ている場合。
- 決済の失敗が月に数件で、目で見て足りる場合。カード以外(請求書払い・口座振替)が中心で、失敗の通知が Stripe から届かない場合。督促のメールを自動で送りたい場合や、利用停止・解約の判断までを自動にしたい場合は、この構成では扱いません。
07最小構成で試す方法
- 先月の決済の失敗から30件を選ぶ(
do_not_honor・generic_declineを半分以上入れる) - その30件について、当時どの対応をしたか、支払いが戻ったかを顧客管理のシステムで確かめる
- 「理由は不明」の拒否の分について、契約の種類・請求額・直近のやり取りの要点を表にまとめる
- 手元の Claude の画面に表を貼り、「年額・高額の枠/支払い担当の交代/解約の気配/発行会社への問い合わせ のどれかに分けてください。書かれていない事情を推測しないでください」と指示する
- 分けた結果を、当時の対応と、その後に支払いが戻ったかと突き合わせる
試したいのは、事情から型が分けられるかです。
| 出てきた内容 | 判断 |
|---|---|
| 当時の対応と同じ型が多く、「解約の気配」を拾えた | n8n の組み立てに進む |
| やり取りに無い事情を推して型を選んだ | 指示の書き方で直る。構成は有効 |
| やり取りが空の顧客が多く、ほとんど「発行会社への問い合わせ」になる | 顧客管理のシステムの記録が先。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 再試行のたびに下書きが増える | 請求書ごとに1回目と型が変わったときだけ動かす |
| 同じイベントで二重に動く | イベント ID を Data Table に残して止める |
| 通知の順が前後する | 順に頼らない。請求書の今の状態を API で取り直す |
| 拒否の理由が通知に無い | Invoice の payments を expand し、PaymentIntent の latest_charge から outcome を読む |
attempt_count だけで判断する | ハードデクラインでは実際に請求していなくても増える。拒否コードと合わせて見る |
| 不正利用の疑いを文面に書く | 拒否コードをAIに渡さない。 群の名前だけを残す |
| Text Classifier が項目を捨てる | 「When No Clear Match」を Other の出口に変える |
| 「解約の気配」の顧客に督促が飛ぶ | この型は督促を作らず、カスタマーサポートへ回す |
| 署名の検証をしていない | Stripe の資格情報に Signature Secret を設定する |
| 利用停止の日付をAIが計算する | 顧客管理のシステムの値を写させ、空なら「(要確認)」 |
| Stripe からの顧客へのメールと重なる | Stripe 側で顧客へ送っている通知の設定を先に確かめ、文面の役割を分ける |
上の5行は Stripe の仕組みの話です。 通知は何度も順不同で届き、拒否の理由は通知の外にあります。ここを押さえないと、AIの分類が正しくても一覧が使えません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の会社名と請求先の担当者の氏名・メールアドレス、契約と請求額、決済の拒否の理由、問い合わせのやり取りです。カード番号そのものは扱いません。
- カードの情報を扱わない … カード番号やセキュリティコードをメールで送ってもらう文面にしないことを指示に書き、更新は Stripe の支払いの画面で行ってもらいます
- 伝えてはいけない理由を外す … AIにもログにも、群の名前だけを残します
- Stripe API のキーを絞る … 読み取りの制限付きキーを n8n の資格情報に置きます
- Webhook の受け口を守る … Signature Secret を設定します。Stripe は送信元の IP アドレスでの絞り込みも案内しています
- やり取りの本文を絞って渡す … 過去90日の件名と要点だけにし、電話番号らしき並びは伏せます
- 送信と契約の判断は人が行う … 利用停止・解約・請求書払いへの切替は担当者と責任者が決めます
誤りが起きた場合のリスクは、解約を考えている顧客に督促を送ることと、伝えてはいけない理由を書くことの2つです。 前者は人の確認で、後者は拒否コードを渡さない設計で守ります。
10まず何から始めるか
1週目:対応表と骨組みを作る
先月の拒否コードを数え、多い順に10個を型に当てて対応表にします。型ごとの文面の骨組みも作ります。理由を伝えない型の文面は、経理の責任者が書きます。
2週目:30件で試す
「理由は不明」の拒否を多めに入れた30件で、手元の Claude の画面に型を分けさせます。当時の対応と、その後に支払いが戻ったかと突き合わせ、「解約の気配」を拾えているかを最優先で見ます。
3週目:n8n で受けて一覧にする
Stripe Trigger で受け、重複を除き、拒否コードと対応表の型を一覧に書き出します。AIの分類も下書きもまだ入れません。
4週目:AIの分類を足す
Text Classifier で「理由は不明」の拒否を分け、結果を一覧に出すだけにして、担当者が1週間見比べます。
2か月目: 型ごとの下書きを Gmail に置き、担当者が直して送る運用に移ります。型を直した件数を毎週数えます。3か月目以降: 送った後に支払いが戻った割合を型ごとに見て、待つ再試行の回数と文面を直します。型ごとの戻りの割合が安定し、利用停止の期日を連絡より先に迎える顧客がいなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
拒否コードの一覧と次のステップ。fraudulent・stolen_card・lost_card・merchant_blacklist は顧客に詳細を知らせず generic_decline と同じように提示するとされること | Stripe: 支払い拒否コード | 2026-10-29 |
拒否コードが Charge の outcome の reason に、次の対応が advice_code(do_not_try_again・try_again_later・confirm_card_data)に示されること | Stripe: カードの支払い拒否 | 2026-10-29 |
Smart Retries の推奨の既定(2週間以内に8回)、カスタムの規則は最大3回。invoice.payment_failed で失敗を受けること。ハードデクラインでは新しい支払い方法まで再試行が実行されず attempt_count が増え続けること | Stripe: 支払いの再試行を自動化する | 2026-10-29 |
| 同じイベントが複数回届きうること、イベント ID の記録、順序が保証されないこと、2xx を素早く返すこと、署名の確認と IP アドレスでの絞り込み | Stripe: Webhook エンドポイントで Stripe イベントを受信する | 2026-10-29 |
Invoice の payments が既定では返らず expand で取ること、attempt_count・amount_due・hosted_invoice_url の項目 | Stripe API: Invoice オブジェクト | 2026-10-29 |
PaymentIntent の last_payment_error と latest_charge(展開できる) | Stripe API: PaymentIntent オブジェクト | 2026-10-29 |
Stripe Trigger ノードが Signature Secret の設定で Stripe-Signature を確かめ、署名の無いもの・偽造・5分より古いものを 401 で拒むこと。n8n 2.25.7・2.26.2 以降で使えること | n8n Docs: Stripe Trigger | 2026-10-29 |
Text Classifier の型の名前と説明、「When No Clear Match」の既定が Discard Item で Other の出口に変えられること、System Prompt Template の {categories} | n8n Docs: Text Classifier | 2026-10-29 |
| Basic LLM Chain の「Require Specific Output Format」で Structured Output Parser をつなげること | n8n Docs: Basic LLM Chain | 2026-10-29 |
| Anthropic Chat Model の出力の長さ・温度、Prompt Caching(既定は無効) | n8n Docs: Anthropic Chat Model | 2026-10-29 |
| Data Table の行の Insert・Upsert・Get | n8n Docs: Data Table | 2026-10-29 |
| Gmail の Draft の Create で To・件名・本文・Thread ID を指定できること | n8n Docs: Gmail の Draft operations | 2026-10-29 |
どの拒否で何回待つか、どの顧客の利用を止めるかは、自社の経理とカスタマーサポートで決めてください。 本記事は Stripe と n8n の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2286)についてのご相談はこちらから。
