プランの作成(サイト数・価格・課金モード)

この章では、Pricing Plan(プラン)の設計と作成手順をまとめます。プランは「同一プロダクト内の購入オプション」で、サイト数上限(activation_limit)、価格、課金モード(買い切り or サブスク)などを持ちます。将来の差額アップグレードも、ここで定義したプラン情報を元に動きます。


1) 前提:プロダクトが先、プランは後

  1. 管理画面 → AppCotton → Products でプロダクトを作成
  2. 該当プロダクトの編集画面 → Pricing Plans セクションでプランを追加

補足:プロダクトは product_slug を持ち、連携先アプリ/プラグインの識別子になります。各プランはこのプロダクトに紐づけられます。


2) プラン項目の意味(推奨フィールド)

  • plan_name(表示名)
    例: 1サイト, 3サイト, Unlimited, Pro, Business など。UIやレシートに出す人間可読名。
  • activation_limit(サイト数上限)
    正の整数 / -1 = 無制限。この値でドメインアクティベーション数の上限を制御します。
  • billing_type
    one_time(買い切り) / subscription(サブスク)。
  • price(最小通貨単位)
    円なら税込/税抜の内訳ポリシーをチームで統一。内部は整数(例:¥7,800 → 7800)。
  • subscription_interval(サブスクのみ)
    day|week|month|year のいずれか。
  • stripe_price_id(買い切り用)
    StripeのPrice ID(一括支払い)。
  • stripe_price_id_subscription(サブスク用)
    StripeのPrice ID(定期課金)。
  • sort_order
    プランの並び順。フロントのプラン表やセレクター表示順を制御。
  • metadata(任意)
    内部用メモ、表示タグ、上位/下位のアップグレード互換性などを入れても良い。

例(概念JSON)

{
  "product_id": 1,
  "plan_name": "3サイト",
  "activation_limit": 3,
  "billing_type": "one_time",
  "price": 14800,
  "sort_order": 20,
  "stripe_price_id": "price_1QabcXYZ...",
  "metadata": {
    "badge": "Most Popular",
    "upgrade_to": [ "plan_basic_5site", "plan_unlimited" ]
  }
}

3) サイト数(activation_limit)のルール

  • = 正の整数:上限数と同じ数までアクティベート可。解除すると枠が戻る。
  • = -1:無制限。差額課金ロジックの最上位に置くことが多い。
  • = 0 は非推奨(意味が曖昧)。「一時停止」等の状態管理はライセンスの status で行います。

表示例の命名規則(推奨)

  • 1サイト / 3サイト / 5サイト / 無制限
  • テーブルやUIでは used/limit と「残り」を常に見せると支援が減ります。

4) 価格と通貨・税

  • **内部は整数(最小通貨単位)**で保持(例:¥9,800 → 9800)。
  • 表示時にロケール整形。管理画面の入力は数値のみを強く推奨。
  • 税区分を使う場合は「税込/税抜」「税率」「適用開始日」をポリシーとして固定し、将来の税率変更に備えます。

5) 課金モードの選定

  • 買い切り(one_time)
    初期導入がシンプル。追加収益はメジャーアップデートサポート延長などで回収。
  • サブスク(subscription)
    継続収益。価格は低めでもCLVが伸びるsubscription_intervalmonth or year が一般的。

混在も可能:同一プロダクトに買い切りとサブスクを同居させ、UIで切り替えタブを提供する設計もよく使われます。


6) Stripe連携の注意

  • Priceは“プランごと”に1つが基本。
    • 買い切り:stripe_price_id
    • サブスク:stripe_price_id_subscription(必要に応じて monthyear を別IDで)
  • テスト用/本番用のPriceを混ぜない。環境ごとに明示して保管。
  • 将来の差額課金では、現在のプラン価格と目標プラン価格の差額を計算して一括チェックアウトする戦略が分かりやすい(Stripeのサブスクprorationとは別アプローチ)。

7) 並び順と表示

  • sort_order の昇順で表示。
  • おすすめプランには metadata.badge = "Most Popular" などの視覚ヒントを与えるとCVRが向上。
  • 無料プランがある場合は価格0の専用フロー(メール送信でキー発行)を別扱いにするのが混乱が少ない。

8) 差額アップグレード設計(概要)

  • 原則:同一プロダクト内の上位プランへは「(目標価格 − 現在価格)」を請求。
  • サブスク間のアップグレードは請求期間を跨いだ整合が難しいため、
    • ①本サイクルは現プランのまま、次回更新から上位へ
    • 即時差額払って上位に切り替え
      のどちらかをUIで明示
  • 買い切り→サブスク移行は別SKU扱いにして「移行割引」のクーポンを発行するのが運用上シンプル。

9) 管理画面での作成手順(推奨フロー)

  1. Products → 対象プロダクトをEdit
  2. セクション Pricing Plans → 「Add Plan」
  3. 入力:
    • Plan Name:例 1サイト
    • Activation Limit1
    • Billing Typeone_time
    • Price(最小通貨単位):7800
    • Stripe Price IDprice_...
    • Sort Order10
  4. Save
  5. 同様に 3サイトactivation_limit=3, price=14800, sort_order=20)、5サイト無制限 を追加

追加が保存されない/表示されない場合は、DBマイグレーションの不整合(テーブルの型・カラム不足)が原因のことが多いです。管理画面の「設定 → DB Repair」を先に実行してから再保存する運用を推奨。


10) REST API での作成(参考ペイロード)

実装状況によってエンドポイント名は異なり得ます。概念例です。

例:プラン作成

POST /wp-json/appcotton/v1/products/{product_id}/plans
Content-Type: application/json

{
  "plan_name": "3サイト",
  "activation_limit": 3,
  "billing_type": "one_time",
  "price": 14800,
  "sort_order": 20,
  "stripe_price_id": "price_1QabcXYZ..."
}

例:プランの更新

PATCH /wp-json/appcotton/v1/plans/{plan_id}
{
  "plan_name": "5サイト",
  "activation_limit": 5,
  "price": 19800,
  "sort_order": 30
}

11) チェックリスト

  • プロダクトに最低1つ以上のプランが紐づいている
  • activation_limit は整数(無制限は -1)
  • billing_typeStripe Price ID不整合になっていない
    • 買い切り → stripe_price_id
    • サブスク → stripe_price_id_subscription / subscription_interval
  • Priceは最小通貨単位で保存
  • sort_order を設定し、UIの並びを意図通りに
  • 差額アップグレードの階段(上位/下位関係)が整理されている
  • 保存後にフロント(購入UI)で全プランが期待通りに表示される

12) よくある落とし穴

  • 保存はできるのに表示に出ない
    → プランの product_id が空/不整合。DBの型崩れ(BIGINT UNSIGNED か)もチェック。
  • StripeのPrice IDの環境混在
    → テスト用と本番用を混ぜると、チェックアウト時に失敗 or 想定外金額。
  • 無制限プランの差額計算
    → 中間プランを挟む設計(段階差額)か、直接差額(今の価格→無制限)かを仕様で固定。
  • 価格の少数扱い
    → 小数を入れてしまい、内部整数化で丸め誤差。必ず最小通貨単位で入力。

13) サンプル構成(買い切り)

plan_nameactivation_limitbilling_typepricesort_orderStripe Price
1サイト1one_time780010price_...A
3サイト3one_time1480020price_...B
5サイト5one_time1980030price_...C
無制限-1one_time2980040price_...D

差額

  • 1 → 3:14800 - 7800 = 7000
  • 3 → 5:19800 - 14800 = 5000
  • 5 → 無制限:29800 - 19800 = 10000

この設計に沿ってプランを作っておけば、ドメインアクティベーション上限の制御購入UIのプラン表示差額アップグレードまで一貫した動作が可能になります。