認証とサブスク決済:請求モデルに合致したデータ連携を設計しよう
<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><OrganizationProfile /></code> のような組み込み済みUIコンポーネント</p><pre><code>const { has } = await auth() const canAccessPremium = has({ plan: 'pro' }) const isAdmin = has({ role: 'org:admin' })</code></pre><h3 id="h458279e3f5"> <a href="http://Stigg.io">Stigg.io</a></h3><p><a href="http://Stigg.io">Stigg.io</a>は決済&Entitlement SaaSとして以下の特徴があります。</p><p>- 契約やプランに対する権限の管理に特化</p><p>- APIやダッシュボードも提供 </p><p>- Stripeなどとも連携可能</p><pre><code>const entitlements = { // feature gate entitlement 'advanced-dashboards': {}, // configuration entitlement 'data-retention-days': { value: 14, }, // usage quota/limit entitlement 'file-storage-mb': { 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: 'cus_NcI8FsMbh0eFs', start_date: 1787130418, end_behavior: 'release', phases: [{ items: [{ price: 'price_1Mr3YcLkdIwHu7ixYOj2', 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>
開発者
