プラン、上限、エンタイトルメント
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 });そのため、プラン名変更や第四のプラン追加でも散在する条件が壊れません。アーキテクチャテストが境界を強制します。
既定カタログ
これは動作する既定値であり、推奨する料金設定ではありません。公開前にプラン名や値を変えたり、プランを追加したりできますが、すべての機能について全プランの値を明示してください。
| 機能・上限 | Free | Plus | Max |
|---|---|---|---|
| 組織メンバー | 1 | 5 | 20 |
| アップロード | 可 | 可 | 可 |
| 最大ファイル | 5 MB | 25 MB | 200 MB |
| 総ストレージ | 100 MB | 5,000 MB | 50,000 MB |
| テキストから動画 | 不可 | 可 | 可 |
| 画像生成 | 可 | 可 | 可 |
| 月間タスク | 10 | 50 | 無制限 |
| 月間クレジット | 0 | 500 | 2,500 |
null は無制限です。サインアップクレジットは一回限りで、Free の定期付与ジョブはありません。
画像 reference は固定 5-credit cost を台帳で計測するため全 tier で利用できます。Free は entitlement 境界を通ったまま signup grant を使えます。
有効プランの解決
プランは組織に属します。subscriptions が現在の状態、orders が変更されない財務履歴です。有効な契約のうち、順位が最も高いものを採用します。active と trialing は有効で、past_due には七日間の猶予があります。
組織は複数契約を持てます。クレジット付与は加算されますが、機能上限は最上位の有効プランが決めます。課金画面には全契約を表示します。
カスタマイズ
src/types/plan.tsに名前を追加する。src/config/plans.tsですべてのプランの値を定義する。- 金額、期間、クレジット、通貨、Price 対応は
src/config/billing.tsに置く。 requireEntitlementまたはenforceLimitで保護する。
次の 3 つを明示的に決めます。
- **料金への組み込み方:**プランで利用可否を決める機能と、クレジットで利用量を測る機能。
- **支払い失敗:**既定の七日間の
past_due猶予期間を保つか、別の顧客向け方針にするか。 - **プラン変更:**独立した複数のサブスクリプションを保つか、アップグレード、日割り計算、クレジット調整を設計・テストしてから既存契約の変更を有効にするか。
新規 Checkout はサーバー専用の STRIPE_PRICE_* を使います。ダウングレードしてもデータやメンバーは削除しません。サポート担当者は監査記録付きの利用人数例外を設定でき、手動で無償提供する場合は source = "manual" の通常のサブスクリプションとして扱います。
公開する料金カード、Stripe Price、課金設定、エンタイトルメントのテスト、ダウングレード時の動作が同じ商品内容を説明していれば、公開できます。Free、各有料プラン、猶予期間内外の past_due、手動の無償提供、ダウングレード後に新しい上限を超える組織を検証してください。次にStripe 課金で実際の価格を接続し、従量制を採用する場合は組織のクレジット台帳で消費と返却の規則を決めます。