ハンズオン
プラン、上限、エンタイトルメント
Free・Plus・Max の機能、組織上限、Stripe 対応、猶予期間、複数契約、サポート例外を設定します。
starter のコミット
7d452a6に同期しています。
エンタイトルメントの入口は一つ
ルートやコンポーネントは src/config/plans.ts を import せず、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 |
| テキストから動画 | 不可 | 可 | 可 |
| 月間タスク | 0 | 50 | 無制限 |
| 月間クレジット | 0 | 500 | 2,500 |
null は無制限です。サインアップクレジットは一回限りで、Free の定期付与ジョブはありません。
有効プランの解決
プランは組織に属します。subscriptions が現在状態、orders が不変の財務履歴です。有効かつ rank が最も高い契約を採用します。active と trialing は有効、past_due は七日間の猶予があります。
組織は複数契約を持てます。クレジット付与は加算されますが、機能上限は最上位の有効プランが決めます。課金画面には全契約を表示します。
カスタマイズ
src/types/plan.tsに名前を追加する。src/config/plans.tsですべての tier の値を定義する。- 金額、期間、クレジット、通貨、Price 対応は
src/config/billing.tsに置く。 requireEntitlementまたはenforceLimitで保護する。
新規 checkout はサーバー専用 STRIPE_PRICE_* を使います。ダウングレードはデータやメンバーを削除しません。サポートは監査付き席数例外を設定でき、手動 comp は source = "manual" の通常の subscription です。