08.custom_plan
- Back
- 00.overview.md
-
01.admin
- 00.overview.md
-
01.auth
-
02.user-management
-
03.group-management
-
04.announcement-management
-
05.guide-management
-
02.general
- 00.overview.md
-
01.analysis
-
02.auth
-
03.chat
-
04.checkout
-
00.general
- 00.overview.md
-
01.retail_buyer
-
02.subscription
-
-
05.packages
-
06.wishlist
- 00.overview.md
-
01.temp-wishlist-to-group
-
02.wishlist-to-group
-
07.file-storage
-
08.unique-product-upload
-
09.dataset-workflow
-
10.landing-page
-
03.widget
カスタムプラン(Custom Contract)
概要
本ドキュメントは、Stripe Checkout の price_data を用いた カスタムプラン(契約ベース価格)のフローを説明します。カスタムプランはベースプランの価格マッピングと分離し、既存の価格カタログや標準のプラン変更フローに影響を与えない設計です。
主要データモデル
subscriptions
pricing_type:customcustom_contract_id: 契約への参照payment_provider_subscription_id: Stripesub_...
custom_contracts
- 契約条件:
amount,currency,billing_interval,starts_at,ends_at, 各種制限 - Stripe 連携項目:
provider_checkout_session_id(Stripecs_...)provider_price_id(Stripeprice_...)provider_subscription_item_id(Stripesi_...)
subscription_histories
請求ごとのスナップショット:
custom_contract_idprovider_price_idprovider_subscription_item_idinvoice_id/payment_intent_id
フロー全体
1) カスタム契約の作成(Admin)
API:
POST /api/v1/admin/custom-contracts
ロジック:
draft状態で契約を作成- 既存 subscription に紐付けるか、
pricing_type = customの subscription を新規作成
2) 支払いリンク送信(Admin)
API:
POST /api/v1/admin/custom-contracts/{id}/send-payment-link
ロジック:
price_dataで Stripe Checkout Session を作成- metadata 設定:
custom_contract_idsubscription_slug
custom_contracts.provider_checkout_session_idを更新- ステータス
draft→offered
3) Stripe Webhook(Checkout + Subscription)
customer.subscription.created
- subscription と契約の紐付け:
subscriptions.pricing_type = customsubscriptions.custom_contract_id = <id>
custom_contractsを更新:provider_price_idprovider_subscription_item_idsubscription_id
invoice.paid
- 請求サイクルの
subscription_historiesを作成/更新 custom_contracts.provider_price_id/provider_subscription_item_idを更新(invoice line から補完)- 成功時:
custom_contracts.status = active
customer.subscription.updated
- subscription ステータスを同期
- 必要に応じて更新/更新履歴を作成
customer.subscription.deleted
- subscription をキャンセルし契約を更新:
- 早期終了は
cancelled ends_at終了済みならexpired
- 早期終了は
ガードレール
- カスタムプランは
package_plan_to_providersを使用しない - 価格/範囲の変更は契約 + webhook 経由で実施
- Stripe metadata が正しい紐付けの鍵
注意点
- Webhook は順不同で到着するため、処理は idempotent 前提。
amount = 0の場合でもinvoice.paidによる有効化を前提とする。