プロダクトを構築

プラン、上限、エンタイトルメント

Free・Plus・Max の既定カタログを、プラン判定を散在させずに独自の料金体系へ変えます。

スターターのコミット 2a1a04a で検証済みです。

デモ用の料金設定を置き換えるときは、ここから始めます。各プランで許可する顧客操作、制限する量、支払い失敗やダウングレード時の動作を決めます。スターターは一つのカタログと適用境界を提供し、判断を一貫させます。

エンタイトルメントの入口は一つ

ルートやコンポーネントは src/config/plans.ts を直接読み込まず、tier === "max" のような比較もしません。src/services/entitlements.ts に機能や上限を問い合わせます。

await requireEntitlement(orgUuid, "tasks.text_to_video");
await enforceLimit(orgUuid, "storage.totalMb", { current, adding });

そのため、プラン名変更や第四のプラン追加でも散在する条件が壊れません。アーキテクチャテストが境界を強制します。

既定カタログ

これは動作する既定値であり、推奨する料金設定ではありません。公開前にプラン名や値を変えたり、プランを追加したりできますが、すべての機能について全プランの値を明示してください。

機能・上限FreePlusMax
組織メンバー1520
アップロード
最大ファイル5 MB25 MB200 MB
総ストレージ100 MB5,000 MB50,000 MB
テキストから動画不可
画像生成
月間タスク1050無制限
月間クレジット05002,500

null は無制限です。サインアップクレジットは一回限りで、Free の定期付与ジョブはありません。

画像 reference は固定 5-credit cost を台帳で計測するため全 tier で利用できます。Free は entitlement 境界を通ったまま signup grant を使えます。

有効プランの解決

プランは組織に属します。subscriptions が現在の状態、orders が変更されない財務履歴です。有効な契約のうち、順位が最も高いものを採用します。activetrialing は有効で、past_due には七日間の猶予があります。

組織は複数契約を持てます。クレジット付与は加算されますが、機能上限は最上位の有効プランが決めます。課金画面には全契約を表示します。

カスタマイズ

  1. src/types/plan.ts に名前を追加する。
  2. src/config/plans.ts ですべてのプランの値を定義する。
  3. 金額、期間、クレジット、通貨、Price 対応は src/config/billing.ts に置く。
  4. requireEntitlement または enforceLimit で保護する。

次の 3 つを明示的に決めます。

  1. **料金への組み込み方:**プランで利用可否を決める機能と、クレジットで利用量を測る機能。
  2. **支払い失敗:**既定の七日間の past_due 猶予期間を保つか、別の顧客向け方針にするか。
  3. **プラン変更:**独立した複数のサブスクリプションを保つか、アップグレード、日割り計算、クレジット調整を設計・テストしてから既存契約の変更を有効にするか。

新規 Checkout はサーバー専用の STRIPE_PRICE_* を使います。ダウングレードしてもデータやメンバーは削除しません。サポート担当者は監査記録付きの利用人数例外を設定でき、手動で無償提供する場合は source = "manual" の通常のサブスクリプションとして扱います。

公開する料金カード、Stripe Price、課金設定、エンタイトルメントのテスト、ダウングレード時の動作が同じ商品内容を説明していれば、公開できます。Free、各有料プラン、猶予期間内外の past_due、手動の無償提供、ダウングレード後に新しい上限を超える組織を検証してください。次にStripe 課金で実際の価格を接続し、従量制を採用する場合は組織のクレジット台帳で消費と返却の規則を決めます。

プラン、上限、エンタイトルメント · Sushi SaaS