Stripe Webhookイベントの選び方|サブスク運営に必須の通知一覧

目次

Webhookの基本とサブスク運営で重要な理由

StripeのWebhookは「Stripe側で何かが起きたときに、あなたのサーバーへ通知してくれる仕組み」です。たとえば請求書が発行された、支払いが成功した、サブスクのプランが変更された、といったタイミングでイベントが飛んできます。これを受け取って自社システムのDB更新やメール送信を行うことで、Stripeと自社サービスの状態を常に同期させることができます。

サブスク運営では「支払いが通っているか」「いつ解約されたか」「どのプランに変わったか」を正しく把握できないと、請求漏れやアカウントの権限ミスにつながります。Webhookを使うと、これらの状態変化を人手でチェックせず自動で反映できるため、運用負荷とヒューマンエラーを大きく減らせます。一方で、イベントの種類が多く「全部受け取るべき?」「最低限どれ?」と迷いやすいのも事実です。本記事では、その「迷いどころ」を整理していきます。

Webhookとは(簡単な概念)

Webhookは「あるサービスで出来事(イベント)が起きたときに、あらかじめ登録しておいたURLにHTTPリクエストを送る仕組み」の総称です。Stripeの場合、たとえば請求書が確定したときにJSON形式のイベントデータがPOSTされます。受け取る側(あなたのサーバー)は、そのJSONをパースして、DB更新やメール送信などの処理を実行します。

よく比較されるのが「ポーリング(一定間隔でAPIを叩いて状態を取りに行く方法)」ですが、ポーリングは「何も起きていないのに定期的にアクセスする」ムダが発生します。Webhookなら、イベントが発生したときだけ通知されるため、負荷もコストも抑えられます。開発者だけでなくWeb担当者も、「イベントが起こる → Stripeが通知する → 自社システムが動く」という3ステップだけ押さえておけば、仕様相談や要件整理がぐっとスムーズになります。

Stripeサブスクにおける主な用途

Stripeのサブスクリプション機能では、Webhookを使うことで次のような処理を自動化できます。

  • 請求成功時に「有料会員フラグ」をONにする(アカウント有効化)
  • 支払い失敗時にリマインドメールを送る・一時停止フラグを立てる
  • プラン変更(アップグレード・ダウングレード)を自社プラン情報に反映する
  • 解約・キャンセル時にアカウント権限を変更する、利用期限を設定する
  • 顧客が新規登録されたタイミングで、CRMやMAツールに連携する

こうした処理をすべて管理画面の目視と手作業で行うのは現実的ではありません。Webhookでイベントをトリガーにしておくことで、「決済周りの正確な状態管理」と「顧客体験(メール・画面表示)の自動化」を同時に実現できます。Stripeの仕様は随時アップデートされるため、詳細な最新仕様は必ず公式ドキュメントも合わせて確認することをおすすめします。

サブスク運営で必須となるWebhookイベント一覧

Stripeには数多くのWebhookイベントが用意されていますが、サブスク運営でよく使うのは大きく分けて「決済系(invoice.*)」「契約更新系(customer.subscription.*)」「顧客アカウント系(customer.*)」の3グループです。ここでは、まず全体像をざっくり整理したうえで、各グループごとに「よく使う代表イベント」と「最低限このあたりを押さえておくと安心」という観点で解説します。

なお、イベント名は例として invoice.payment_succeededcustomer.subscription.updated のような形式で表記されます。似た名前のイベントも多く、公式ドキュメントのイベント一覧と見比べながら選ぶのがおすすめです(APIの仕様は変更される可能性があるため、最終的には公式情報を必ず確認してください)。

決済系(invoice.*)

決済系イベントは、「いつ・どの金額が・成功したか/失敗したか」を把握するための中核です。代表的なものとして、次のようなイベントがあります。

  • invoice.created:請求書が作成されたタイミング
  • invoice.finalized:請求書が確定し、支払い可能になったタイミング
  • invoice.payment_succeeded:支払いが成功したタイミング
  • invoice.payment_failed:支払いに失敗したタイミング

サブスク運営で最低限押さえたいのは、支払いの「成功」と「失敗」です。多くのケースでは、invoice.payment_succeeded をトリガーにして「有料会員フラグをON」「請求履歴を自社DBに保存」といった処理を行います。一方、invoice.payment_failed を受け取ったら、「カードの有効期限切れかもしれないのでメール通知」「一定回数失敗したらアカウントを一時停止」などのロジックを組むと、未回収のまま利用され続けるリスクを減らせます。

運用をシンプルにしたい場合は、最初は invoice.payment_succeeded と invoice.payment_failed の2つから始め、必要に応じて invoice.finalized などを追加していくと迷いにくいです。

契約更新系(customer.subscription.*)

契約更新系イベントは、「サブスク契約そのものの状態変化」を教えてくれます。代表的なイベントとしては次のようなものがあります。

  • customer.subscription.created:サブスク契約が新規作成された
  • customer.subscription.updated:プラン変更・数量変更・自動更新設定などが更新された
  • customer.subscription.deleted:解約・キャンセルが行われた
  • customer.subscription.trial_will_end:トライアル終了が近づいた

たとえば、customer.subscription.updated を使うと「ライトプランからスタンダードプランに変更された」「月額×5ユーザーから×10ユーザーに変更された」といった情報を自社のユーザー情報に反映できます。また、customer.subscription.deleted をトリガーにして「次回更新日以降はログインはできるが有料機能はロックする」といった制御も可能です。

実務的には、最低限 created / updated / deleted を押さえておくと、「契約のライフサイクル」をほぼ追いかけられます。トライアルを積極的に活用するサービスであれば、trial_will_end を使ってリマインドメールを送ると解約率改善にもつながります。

顧客アカウント系(customer.*)

顧客アカウント系イベントは、「Stripe上の顧客情報」と「自社サービスのユーザー情報」を揃える用途で使います。代表的なイベントは次の通りです。

  • customer.created:顧客が新規に作成された
  • customer.updated:メールアドレスや住所など顧客情報が更新された
  • customer.deleted:顧客情報が削除された

たとえば顧客がチェックアウト画面でメールアドレスを変更した場合、customer.updated イベントを受けて自社側の会員情報も更新することで、「請求メールは新しいアドレスに届くが、サービスからのお知らせは古いアドレスのまま」といった状態を避けられます。customer.created を使えば、新規顧客発生時にCRMやメール配信サービスへ自動連携することもできます。

初期導入では、「Stripe上の顧客IDと自社ユーザーIDをどのようにひも付けるか」が重要な設計ポイントになります。customer.* 系イベントはこのひも付けを前提に使うため、まずは自社側のユーザーテーブルに Stripeのcustomer IDを保持する設計を検討するとスムーズです。

::contentReference[oaicite:0]{index=0}

目的別|最低限選ぶべきイベントのセット例

StripeのWebhookイベントは数が多く、すべてを受け取る必要はありません。実務では「自分のサービスで何を自動化したいか」から逆算してイベントを選ぶのが最も効率的です。ここでは、代表的な3つの目的別に「このセットから始めればOK」という最低限のイベント構成例を紹介します。まずは必要最小限のイベントだけで運用を始め、あとから不足が出たときに追加するスタイルが、管理もシンプルでおすすめです。

なお、ここで紹介するイベント名は一般的な構成例です。Stripeの仕様は更新される場合があるため、必ず公式ドキュメントも合わせて確認してください。

「請求成功を記録したい」場合

もっとも導入が多いのが「支払い成功を自動でDBに反映したい」というケースです。特に月額課金サービスでは、有料会員のステータスを確実に切り替える必要があります。この目的で最低限押さえるべきイベントは以下の2つです。

  • invoice.payment_succeeded:支払い成功を確実に検知できる中心イベント
  • invoice.payment_failed:カード期限切れなどによる失敗を検知

一般的には、invoice.payment_succeeded を受けたタイミングで「有料会員フラグをON」「請求履歴を保存」といった処理を行います。また、invoice.payment_failed の回数(Stripeの再試行回数)を見て、一定回数失敗したらアカウント一時停止といった制御も可能です。エラー発生時はサーバー側が適切なレスポンスを返せばStripeが自動で再試行してくれるため、再試行設計とも相性が良い構成です。

「プラン変更・解約を同期したい」場合

ユーザーが自動更新設定を変更したり、アップグレード・ダウングレードしたり、あるいは完全に解約した際に、自社側の契約情報を必ず一致させたいケースです。その場合に必須となるイベントは次の3つです。

  • customer.subscription.updated:プラン変更や数量変更を検知
  • customer.subscription.deleted:解約・キャンセルを検知
  • invoice.payment_succeeded:更新タイミングでの支払い成功をチェック

たとえば、ユーザーがライトプランからスタンダードプランに変更した際、customer.subscription.updated を受け取るだけではなく、次の更新日で invoice.payment_succeeded が来たかどうかも合わせて確認すると、DBとの整合性を高く保てます。また解約時には、customer.subscription.deleted を起点に権限を落とし、次回更新日で完全終了といった柔軟なロジック設計が可能です。

「顧客登録の自動処理を行いたい」場合

チェックアウト完了時や顧客追加時に、自社システム側でもユーザー情報を作成したいケースです。CRM連携やメールマーケティング運用でよく利用されます。この目的で押さえるべきイベントは次の3つです。

  • customer.created:新規顧客登録を検知して自社ユーザー作成
  • customer.updated:メールアドレスや住所の変更を反映
  • invoice.payment_succeeded:初回購入時のアクティベーションにも利用

Stripeの顧客ID(customer ID)を自社ユーザーIDとひも付ける運用が前提ですが、この3つのイベントがあれば、最低限の「ユーザー生成 → 更新 → アクティベーション」の基本フローを自動化できます。とくに customer.updated は見落とされがちですが、メールアドレス変更などのトラブル防止に役立ちます。

実装時の注意点(重複送信・署名検証・再試行)

StripeのWebhookは便利な反面、実装時に注意すべきポイントもあります。特に「重複送信が起きる」「署名を検証しないと危険」「サーバーのエラーで再試行される」など、知っておくと運用トラブルを避けられる事柄が多く存在します。本章では、初学者がつまずきやすい3つの注意点を整理します。Stripeの仕様は更新されることがあるため、最新情報は公式ドキュメントも併せて確認してください。

ここを押さえておくと「Webhookが届かない」「二重に課金される」「解約処理が2回走った」といった典型的なトラブルをほぼ防げます。サブスク運営ではWebhookが”裏側の生命線”となるため、安定運用の視点で理解しておくことが重要です。

idempotency(多重処理防止)

StripeのWebhookはネットワーク状況やサーバー負荷の影響により、同じイベントが複数回送信されることがあります。これはStripe側の仕様であり、正常な挙動です。そのため、あなたのサーバー側で「同じイベントIDを二度処理しない」仕組みを入れる必要があります。一般的には、Webhookの event.id をDBに記録し、すでに処理済みならスキップする方法がよく使われます。

また、決済処理そのものにも冪等性(idempotency)が求められるため、DB更新やメール送信が二重で実行されないよう、トランザクション設計にも注意しましょう。とくに会員ステータス更新・領収書発行などは重複が起きるとユーザーの混乱につながります。

署名検証でセキュリティ確保

Webhookは「外部からあなたのサーバーURLにリクエストが飛んでくる」仕組みのため、セキュリティ面の配慮が欠かせません。Stripeは Webhook-Signature という署名を付けてリクエストを送ります。サーバー側でこの署名を検証し、「本物のStripeから届いたリクエストだけ」を処理するようにしてください。署名の検証を省略すると、第三者が不正なリクエストを送ってアカウントを強制停止させる、といった攻撃リスクが生じます。

開発環境では署名検証を一時的にスキップするケースもありますが、本番環境では必ず有効化が必須です。ライブラリが検証ロジックを提供しているため、実装はそれほど難しくありません。

再試行ロジックの考え方

StripeはWebhookを送信した際、あなたのサーバーが 2xx系の成功レスポンスを返さないと「失敗」と判断し、一定間隔で再試行を行います。これは一時的なサーバーダウンやネットワーク障害への備えとして重要ですが、処理が重いロジックをWebhook内で直接行うとタイムアウトが発生しやすく、結果として再試行が多発します。

安定運用のためには、Webhook受信後すぐに「処理キューに投げる → 軽い成功レスポンスを返す」という設計が推奨されます。キューを使うことでレスポンスが速くなり、再試行の連鎖を防げます。また、Stripeダッシュボードでは再試行ログが確認できるので、障害発生時の原因調査にも役立ちます。

よくある質問(FAQ)

ここまで読んで「結局うちのサービスではどれを選べばいい?」「似た名前のイベントが多くて不安」「テスト環境で挙動が違うのはなぜ?」と感じた方も多いと思います。この章では、Stripe Webhookの導入相談でよく出てくる質問をピックアップし、Web担当者・開発者双方の目線でポイントを整理します。細かい仕様は公式ドキュメントに譲りつつ、実務で迷いやすい部分だけをぎゅっと絞って解説します。

どのイベントを選べば良い?

最初のつまずきポイントが「イベントが多すぎて選べない」という悩みです。基本的には、この記事で紹介した3つのグループから「目的別セット」を選ぶと迷いにくくなります。

  • 売上を正しく記録したい → invoice.payment_succeeded / invoice.payment_failed
  • 契約の開始・変更・終了を追いたい → customer.subscription.created / updated / deleted
  • 顧客情報を同期したい → customer.created / updated

これらをベースに、必要になったタイミングで invoice.finalized や trial_will_end などを追加していくのがおすすめです。「最初から完璧を目指さない」ことが、Webhook導入をスムーズに進めるコツです。

似たイベントの違いはどう考えればいい?

Stripeのイベントには、似たような名前が多く混乱しがちです。ざっくりとした判断基準として、「請求書に関することは invoice.*」「契約そのものは customer.subscription.*」「顧客情報は customer.*」というグルーピングで見ると理解しやすくなります。

たとえば、支払い成功を検知したいなら invoice.payment_succeeded を選び、プラン変更そのものを追いたいなら customer.subscription.updated を選ぶ、といったイメージです。どちらにもまたがりそうなケースでは、「売上の話か」「契約状態の話か」で分類すると整理しやすくなります。最終的な細かい違いは、公式ドキュメントのイベント仕様を必ず確認しましょう。

テスト環境と本番で挙動が違うのはなぜ?

Sandbox(テストモード)と本番環境では、使用するカード番号やシナリオが異なるため、Webhookの発火タイミングや件数が変わることがあります。また、テスト環境では署名検証を無効にしているケースも多く、本番に切り替えたとたんに「署名エラーで処理できない」というトラブルもよくあります。

実務では、次の点を意識するとスムーズです。

  • テストモード・本番モードで、別々のエンドポイント・署名秘密キーを使う
  • テスト用のカード番号で、成功・失敗・チャージバックなど複数パターンを試す
  • 本番切り替え前に、署名検証を有効にした状態で一度テストする

仕様変更の可能性もあるため、テストシナリオを組む際はStripeの最新ドキュメントを必ず確認してください。

まとめ:目的からイベントを逆算して選ぶ

StripeのWebhookイベントは、サブスク運営を自動化するうえで非常に強力な仕組みです。一方で、イベントの種類が多く「全部わからないと使えないのでは?」と身構えてしまいがちです。本記事でお伝えしたいポイントは、「すべてを完璧に理解する必要はなく、自社の目的から必要なイベントだけを選べば良い」というシンプルな考え方です。

具体的には、まず「何を自動化したいか」を言語化します。たとえば「支払い成功をDBに記録したい」「プラン変更・解約を確実に同期したい」「顧客情報を他のツールと連携したい」といったレベルで構いません。その上で、この記事で紹介した決済系(invoice.*)、契約更新系(customer.subscription.*)、顧客アカウント系(customer.*)の3グループから、対応するイベントを選べば、初期導入としては十分です。

実装フェーズでは、idempotency(多重処理防止)、署名検証、再試行ロジックといった安定運用のポイントを押さえておくと、長期運用でも安心してWebhookに任せられます。Stripeはアップデートの多いサービスなので、細かい仕様や最新の推奨パターンは必ず公式ドキュメントを併せて確認してください。本記事が、あなたのサブスク運営における「Webhookイベントの選び方」の土台として役立てば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

システム開発やWeb制作をして15年以上。
このブログでは、これから起業したい人や小さくビジネスを始めたい人に役立つ情報を発信しています。
Stripeを使った販売方法や、ノーコードでサブスクを作るコツなど、
「やってみたい」を形にするためのヒントをお届けしています。

コメント

コメントする

目次