Blogs | RevTech tools for Stripe

Category: チュートリアル

Tips and news

認証とサブスク決済:請求モデルに合致したデータ連携を設計しよう

<p>SaaS開発において、決済機能は特殊な位置にあります。基本機能とは直接関係なく、なくてもコア機能自体は動かせるため、「リソース最適化」の名目で組み込みを後回しにしがちです。「いざとなれば、別で請求書を出せばいい」という考えもよく聞かれます。</p><p>しかし、この考え方には大きな落とし穴があります。決済がないアプリは動くかもしれませんが、お金を生まないなら「会社の商品」ではありません。そして後から決済を組み込もうとすると、以下のような問題に直面します。</p><ul><li>プランごとの権限設定をどう実装するのか</li><li>契約情報はどこから取得するのか </li><li>追加のDBやデータモデルが必要になる</li><li>プラン変更の仕組みをどう構築するのか</li></ul><p><strong>重要なのは、実装はしなくとも決済を見据えた設計を心がけることです。</strong></p><h2 id="h6513b34e33">ありがちなハマりどころと考慮漏れ</h2><h3 id="h3e22eda184">契約主体の考慮漏れ</h3><p>ユーザーごと契約でリリースしたものの、見込み客から「法人契約が必要」と言われるケースです。個人向けに設計されたシステムを組織向けに拡張するのは、想像以上に困難な作業となります。</p><h3 id="heb2eb654d7">権限管理の考慮漏れ</h3><p>プランベースで権限管理を実装していたところ、大口顧客から個別のカスタム契約相談があるケース。標準プランでは対応できない要件が発生すると、システム全体の見直しが必要になることがあります。</p><p>決済では、顧客の商習慣や契約体系に応じたデータモデルや設計が必要となります。「担当者退職したので、契約者と決済内容をこのアカウントに移して」といった運用面での要求も珍しくありません。</p><h2 id="h914d158cc5">B2Bの取引・契約は開発者にとって複雑すぎる</h2><p>B2B SaaSで押さえておきたい要件として、以下の2つが特に重要です。</p><h3 id="hfeb6d78b4b">1. ユーザーと契約の分離</h3><p><strong>組織(Organization)の概念</strong></p><p>- ユーザーDBとは別のテーブルで管理</p><p>- サブスクや決済は組織に対して紐づける</p><p>- 個人の退職や異動に左右されない契約管理</p><h3 id="h331d8f56ce">2. 権限を独立管理 </h3><p><strong>Feature Flagの活用</strong></p><p>- プランと権限を別で管理</p><p>- 個別の権限付与に対応可能</p><p>- マーケティングや営業戦略に柔軟に対応</p><h2 id="h2590bfe44d">解決策としてのソリューション</h2><h3 id="hd86a9f3e32">Clerk Organization</h3><p>Clerk OrganizationはIDaaSのprebuilt組織機能として提供されています:</p><p>- ユーザーと別に組織管理機能を提供</p><p>- IDaaSに統合されていることで、DB設計の複雑さを回避</p><p>- <code>&lt;OrganizationProfile /&gt;</code> のような組み込み済みUIコンポーネント</p><pre><code>const { has } = await auth() const canAccessPremium = has({ plan: &apos;pro&apos; }) const isAdmin = has({ role: &apos;org:admin&apos; })</code></pre><h3 id="h458279e3f5"> <a href="http://Stigg.io">Stigg.io</a></h3><p><a href="http://Stigg.io">Stigg.io</a>は決済&amp;Entitlement SaaSとして以下の特徴があります。</p><p>- 契約やプランに対する権限の管理に特化</p><p>- APIやダッシュボードも提供 </p><p>- Stripeなどとも連携可能</p><pre><code>const entitlements = { // feature gate entitlement &apos;advanced-dashboards&apos;: {}, // configuration entitlement &apos;data-retention-days&apos;: { value: 14, }, // usage quota/limit entitlement &apos;file-storage-mb&apos;: { usage: 128, limit: 1024, }, }</code></pre><h2 id="h3e771ee65c">価格は変わる。絶対に</h2><p>AWS Kiro(AIエディタ)の価格変更のように、どんな大企業でも価格は二転三転させます。価格変更は避けられない現実として、システム設計時から考慮する必要があります。</p><h3 id="h07bd50b7b0">Stripe Subscription Schedule APIなどで価格改定に備える</h3><pre><code>const subscriptionSchedule = await stripe.subscriptionSchedules.create({ customer: &apos;cus_NcI8FsMbh0eFs&apos;, start_date: 1787130418, end_behavior: &apos;release&apos;, phases: [{ items: [{ price: &apos;price_1Mr3YcLkdIwHu7ixYOj2&apos;, quantity: 1, }], iterations: 12, }], })</code></pre><p>将来の価格変更に対応できる柔軟な設計を心がけることが重要です。</p><h2 id="h846d15e637">B2Cならもっとシンプルにできる?</h2><p>B2Cであっても、組織概念が必要になるケースがあります:</p><p><strong>家族契約のケース例</strong></p><p>- 知育アプリやサービス</p><p>- 見守りサービス </p><p>- 回線契約や施設利用など</p><p>「ユーザーはどんな契約をするだろうか?」を企画調査フェーズで必ず行うことが重要です。個人向けアプリでも、実際の利用形態を想定した設計が必要になります。</p><h2 id="h50a734545d">B2B SaaSは商習慣も重要なドメイン</h2><p>以下の3つのポイントを押さえることが重要です:</p><p>1. <strong>契約主体が個人か組織(法人)かは必ずチェック</strong></p><p>2. <strong>契約主体に合わせてユーザーDBと決済データなどの連携を設計すべし</strong> </p><p>3. <strong>マーケティングや営業戦略を踏まえると、プランと権限も別で管理することを推奨</strong></p><h2 id="h1d4713b59a">まとめ:ログインの先にある複雑さ</h2><p>認証とサブスクリプション決済の連携において、以下の点を理解しておくことが重要です。</p><p><strong>ログインユーザーと契約者/主体が常に同一人物とは限らない</strong></p><p>- 組織内の複数ユーザー</p><p>- 家族契約での利用者と契約者の違い</p><p>- 管理者の退職や交代への対応</p><p><strong>ユーザーとプランだけでなく、権限と組織についても設計を行おう</strong></p><p>- Feature Flagによる柔軟な権限管理</p><p>- 組織レベルでの契約管理</p><p>- カスタム要件への対応力</p><p><strong>設計・調査フェーズで「どう契約して、使われるか」も考慮しよう</strong></p><p>- 商習慣の理解</p><p>- 契約形態の多様性への対応</p><p>- 将来の価格変更への備え</p><p>認証の先にある複雑さを理解し、ビジネスの成長に合わせて拡張可能な設計を心がけることで、持続的な成長を支える技術基盤を構築できるでしょう。</p><p></p><div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2903%;"><iframe src="https://www.docswell.com/slide/Z37NVP/embed" style="top: 0; left: 0; width: 100%; height: 100%; position: absolute; border: 0;" allowfullscreen></iframe></div>

岡本 秀高

開発者

Stripeワークフローを使ったBacklog課題自動登録システムの構築

<p>決済システムを運用していると、決済エラーや課金失敗の通知を適切に管理することが重要な課題となります。これまでWebhookを使ったカスタム開発が一般的でしたが、Stripeから公開プレビューとしてリリースされたワークフロー機能を使えば、ノーコードで通知システムを構築できるようになりました。</p><p>今回は、Stripe ワークフローとBacklogの「メールによる課題登録」機能を組み合わせて、決済エラーを自動的にプロジェクト管理ツールに登録する仕組みを作ってみます。</p><h2 id="hf88f72e74b">Stripe ワークフローの概要</h2><p>Stripe ワークフローは、Stripeダッシュボード上でビジュアルビルダーを使ってタスクの自動化やカスタムフローを作成できる機能です。現在は公開プレビュー版として提供されており、コードを書くことなく複数ステップのプロセスを構築できます。</p><p>各ワークフローはトリガーとなるAPIイベントから始まり、条件ロジックを使った分岐処理や、複数のアクションを組み合わせた処理フローを作成できます。決済エラーが発生した時、特定の条件を満たした顧客に対してのみ処理を実行する、といった細かい制御も可能です。</p><p>特に便利なのが「Email team member」アクションで、ダッシュボードにアクセスできるユーザーに対してメール通知を送信できます。このメール機能を活用して、外部システムとの連携を実現していきます。</p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/5d7da5727c1f4aa08822f99093dc37d4/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.16.02.png" alt="" width="970" height="309"></figure><h2 id="h1b071028e8">Backlogのメール課題登録機能</h2><p>Backlogには「メールによる課題登録」という機能があります。プロジェクト設定のインテグレーション画面から設定でき、専用のメールアドレスが発行されます。</p><p>このアドレスにメールを送信すると、件名がタスクタイトル、本文がタスク内容として自動的に課題が登録される仕組みです。</p><p></p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/ec4bd198aef24ae3a0c9e5eedd7c488e/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.11.58.png" alt="" width="1152" height="164"></figure><p>この機能を使えば、Stripeワークフローからの通知メールを直接Backlogの課題として取り込むことができます。</p><h2 id="h2661198b93">実装手順</h2><h3 id="h0afaa7d2d3">Backlog側の設定</h3><p>まず、Backlogで課題登録用のメールアドレスを発行します。プロジェクト設定画面から「インテグレーション」→「メールによる課題登録」を選択し、設定を有効化します。</p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/6bb195c58bbe4807bba991247e0826d7/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.11.54.png" alt="" width="2164" height="982"></figure><p>ここで発行されるメールアドレスをメモしておきます。</p><h3 id="h1a76888d04">Stripe側でのメールアドレス登録</h3><p>次に、Stripeのダッシュボードでチームメンバーとして、先ほどBacklogで発行したメールアドレスを登録します。新しいユーザーとして招待する形になり、確認メールがBacklogに課題として登録されるため、そこから確認リンクをクリックして登録を完了させます。</p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/bc9e0f1aeb464127914c56b20e34d56d/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.12.50.png" alt="" width="1626" height="652"></figure><p>この際、適切な権限レベルを設定することが重要です。決済情報への過度なアクセス権限は与えない方が安全です。</p><h3 id="h677fed5eea">ワークフローの作成</h3><p>Stripeダッシュボードのワークフロー画面で新しいフローを作成します。トリガーとして適切なイベントを選択します。請求書の決済エラーであれば「Invoice payment failed」を選択するのが適切でしょう。</p><p></p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/901e6785ce8848e295fb1318691866f3/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.17.48.png" alt="" width="741" height="272"></figure><p>トリガー選択後、「Add action」から「Email team member」を選択し、先ほど登録したBacklogのメールアドレスを指定します。</p><p></p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/cfba951763654423a85410ef0bc9f943/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.18.50.png" alt="" width="433" height="325"></figure><h3 id="h8345744506">データの収集と通知内容の設定</h3><p>単純にエラーが発生したことを通知するだけでは実用的ではありません。「Append data」機能を使って、関連する情報を収集します。</p><p>顧客情報であれば「Customer ID」、請求書の詳細であれば「Invoice ID」、サブスクリプション関連であれば「Invoice Subscription ID」、決済試行回数なら「Invoice Attempt count」といったデータを追加できます。これらの情報がメール本文に含まれ、Backlogの課題内容として記録されます。</p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/ec2369c34199485a95e86f4bf3d38b09/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.17.11.png" alt="" width="420" height="333"></figure><h3 id="he4aa62006e">条件分岐の設定</h3><p>すべてのエラーを通知すると課題が増えすぎる可能性があります。「Add condition」を使って、特定の条件を満たした場合のみ通知するよう設定できます。</p><p></p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/65b453802fd7438aa0b54e396515582d/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-09-16%2015.23.10.png" alt="" width="1369" height="517"></figure><p>例えば、決済リトライが2回目の時のみ通知する、リトライ回数が4回に達した時に緊急度の高い通知を送る、といった細かい制御が可能です。条件は「Attempt count is equal to 2」のような形で設定し、複数の条件をOR条件で組み合わせることもできます。</p><h2 id="hac96eb8127">現在の制限事項と将来の改善</h2><p>2025/09時点でのワークフロー機能には制限があります。最も大きな制約は、配列データの処理ができないことです。</p><p>請求内容の詳細や、サブスクリプションの契約データなど、オブジェクトの配列として格納されているデータをループ処理して通知内容に含めることができません。これは開発ロードマップに含まれているため、将来的には改善される見込みです。</p><p>現在この制約により、通知内容はテキストメールとして受信する内容と同程度の情報に留まり、構造化された詳細データの処理には限界があります。より高度な処理が必要な場合は、従来のWebhook + Lambda/Cloud Runといった開発アプローチが必要になるでしょう。</p><h2 id="ha214098e44">まとめ</h2><p>Stripeワークフローを使った通知システムは、従来のWebhook開発と比べて圧倒的に簡単に構築できます。ノーコードでありながら条件分岐も可能で、実用的なレベルの自動化が実現できました。</p><p>ただし、現時点では配列データの処理に制限があるため、複雑なデータ処理が必要な場合は従来の開発手法との使い分けが重要です。</p><p>Stripeの機能拡張は活発に行われており、この制限も近い将来解消される可能性が高いです。まずはシンプルな通知システムから始めて、機能拡張に合わせて段階的に高度化していくアプローチが現実的でしょう。</p><p>決済システムの運用において、エラー通知の自動化は重要な要素です。開発コストを抑えながら実用的な仕組みを構築したい場合、Stripeワークフローは有力な選択肢になりそうです。</p>

岡本 秀高

開発者

Stripe Sessions 2025 で発表された Stripe Profiles を使って、プロフィールを作成してみました

<p>Stripe Sessions 2025 で発表された Stripe Profile。機能を利用するのは 2025 年の夏以降になるとのことですが、イベントに参加していた人限定でプロフィールの作成を体験させてもらえました。この記事では、どんな感じでプロフィールを設定するのかを簡単に紹介したいと思います。</p><p>Stripe Profiles について気になる方は、<a href="https://revtrona.hidetaka.dev/blogs/stripe-sessions-announcement-stripe-profiles" target="_blank" rel="noopener noreferrer">こちらの記事</a>も併せてご覧ください。</p><p><a href="https://revtrona.hidetaka.dev/blogs/stripe-sessions-announcement-stripe-profiles" target="_blank" rel="noopener noreferrer">[ Stripe Sessions レポート ] 企業間の請求処理を簡略化する新機能「 Stripe Profile 」がアナウンスされました</a></p><h2 id="h6e8d472e71">表示する名前とネットワーク ID を設定するだけ</h2><p>Stripe Profiles では請求先の企業に表示する名前と、プロフィールを検索する時などに利用する(らしい)ネットワーク ID を設定します。仕組み上ネットワーク ID は重複不可かつ変更もできない様子ですので、登録する際は慎重に決める必要がありそうです。</p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/50dcc609a01342d397f5a53731e78bd3/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-05-08%205.53.47.png" alt="" width="1690" height="668"></figure><p>この2つを登録するだけで、設定完了です!</p><p>プロフィール文章のようなものがプレビュー画面に見えますが、これは Stripe アカウントを本番利用申請した際に提出したビジネス情報が表示されている様子でした。</p><figure><img src="https://images.microcms-assets.io/assets/673f54f935574821bac7ee65829d6fb5/f8545adaa69441a0998aa9c9ef7a0c13/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-05-08%205.53.57.png" alt="" width="1610" height="590"></figure><p>プロフィールの作成だけで、イベント内にてアナウンスされたような請求書発行などにはまだ利用できません。ですがネットワーク ID を確保するという意味でも、 Stripe Sessions に参加されたメンバーを抱えている企業は、今のうちに登録しておく方がよさそうです。</p><p></p>

岡本 秀高

開発者