無料プラン/クーポンの扱い

目的

  • 無料プラン(価格=0)とクーポン割引(価格>0 を割り引き)の設計・運用指針をまとめます。
  • 誤用・不正利用を抑えつつ、トライアル/普及/カンペーン用途で柔軟に活用できるようにします。

無料プラン(Free Plan)

基本方針

  • プロダクトのプラン定義で価格を0に設定すると「無料プラン」として扱います。
  • 無料プランの発行時は**ユーザー識別(メール)**が必須。
    ※ダブルオプトイン(確認メール経由)を推奨。

推奨仕様(運用ルール)

  1. 発行制限
    • 同一メールあたり 1ライセンスまで(上限緩和は管理画面で可)。
    • 同一ドメインのアクティベーション回数も一般プラン同様にカウント(例:1サイトまで)。
  2. 本人性の担保
    • メール認証(ワンタイムトークン)でアクティベーションを有効化。
    • BOT/濫用対策として reCAPTCHAレートリミットを推奨。
  3. 機能制限
    • 無料プランでも ライセンス検証APIは同一(is_premium系ロジックに影響なし)。
    • ただし 有効期限・機能差分はプラン側のメタデータで制御。
  4. アップグレード導線
    • ユーザーポータルのライセンス詳細に 「上位プランへ」 を常設。
    • 差額課金に誘導(下記「差額課金」章と連携)。

よくあるユースケース

  • パブリックβ/教育NFR/期間限定キャンペーン
    → 失効日時(expires_at)を設定し、有効期限切れ後は自動で検証NGに。
  • 永久無料の“Lite”
    activation_limit を低めに(例1サイト)、上位プランで拡張。

クーポン(Coupons)

クーポン種別

  • 割合割引:例)20%OFF
  • 定額割引:例)¥1,000 OFF
  • 100%割引(コンプ):事実上の無料化。配布/PR/サポート用途。
  • 期間限定:発行〜失効の日時、曜日/時間帯限定など
  • 回数制限:総発行数(N回まで)、ユーザーあたり1回 など
  • 対象制限:特定プロダクト/プラン限定、通貨限定、国/リージョン限定

運用ルール(推奨)

  1. スタッキング規則
    • 原則 1トランザクションにつき1クーポン
      (複数適用の複雑化はサポート/不正検知コストが高い)
  2. 適用順序
    • 定額→割合の順で計算するか、どちらか一方のみなど、ルールを固定してUIにも明記。
  3. 適用可否の事前判定
    • チェックAPIで「対象プラン/地域/通貨/残回数/失効」を検証し、カートUIに反映。
  4. 監査ログ
    • だれが・いつ・どのIP/UAで・どのクーポンを使ったかを注文/ライセンスの監査トレイルに保存。
  5. 払い戻し/キャンセル規約
    • クーポン使用時の返金規則(実際支払額までを返金上限に)を明文化。

無料とクーポンの比較運用

項目無料プランクーポン100%OFF
管理プラン定義側で完結キャンペーン都度発行
制御期限・機能差分をプランで統一管理対象・回数など細かな配布制御
導線プラン選択に常時表示可特設LP/コード入力UI経由で配布
監査通常ライセンスと同一クーポン使用ログが追加で必要
  • 恒常的トライアル:無料プランが向く
  • プロモ/リカバリー/個別対応:クーポンが向く

不正・濫用対策(必須)

  • メールドメイン制限(使い捨て/一時メールのブロックリスト)
  • レートリミット(IP×メール×時間)
  • ドメイン正規化example.comwww.example.com を統一判定)
  • IP/UA の保存(監査用・プライバシーポリシー整備)
  • Webhookでの監視:異常発行/同一指紋の連続発行を検知し通知
  • 管理画面の一括無効化:不正判定クーポンの即時停止/回収

UI/UX 要件(購入ページ)

  • プランカードを複数表示(無料含む)し、特徴・制限・価格を即比較
  • 無料プラン選択時は メール入力モーダル → 発行成功ダイアログ → マイページ導線
  • クーポン入力欄(1行)と 事前検証ボタン(適用可否/割引額を即時表示)
  • 失効間近/残回数僅少なクーポンは バッジ表示(例:残4・あと2日)

バックエンド要件(仕様)

無料プラン発行フロー(サーバ)

  1. product_idplan_id の整合性チェック
  2. 価格=0 を確認
  3. メール検証(フォーマット/ドメイン/レートリミット/既存ライセンス数)
  4. ライセンスレコード生成(activation_limit/expires_at/status=active
  5. 確認メール送信(任意:確認完了でverified_at
  6. Webhook発火:license.issued.free, license.email_verification.sent

クーポン適用フロー(サーバ)

  1. product_id/plan_id を受領
  2. クーポン文字列受領→検証API
    • 対象/期限/回数/ユーザー適格性/通貨/地域/併用可否
  3. 小計→割引→税込合計の算出(丸めの一貫性を保証)
  4. チェックアウトセッション作成(メタ:coupon_id・割引内訳)
  5. Webhook発火:coupon.applied.preview, 決済成功後 coupon.redeemed

アップグレード連携(差額課金の前提)

  • 無料→有料旧=0円 なので全額が請求。
  • クーポンで購入済み の場合も、実支払額を基準に差額を計算。
    例)定価¥10,000 → 20%OFFで¥8,000支払い → 上位¥15,000へ
    → 差額 = ¥15,000 – ¥8,000 = ¥7,000

監査・レポート

  • KPI:
    • 無料発行数/有料転換率(Free→Paid CVR)、平均転換日数
    • クーポン別売上/使用率/不正率
  • ダッシュボード:期間フィルタ・プラン別円グラフ・発行/転換の時系列

エラーハンドリング(例)

  • invalid_coupon:存在しない/失効/対象外
  • coupon_limit_reached:発行上限到達
  • rate_limited:無料発行の過剰試行
  • plan_mismatch:product/plan の不整合
  • already_owned_free:同一メールの無料重複

(エラー規約はSDK/RESTの共通表に統一、翻訳文字列を提供)


テスト観点(チェックリスト)

  • 無料:同一メール2回目でブロックされる
  • 無料:メール未確認のままでは検証NG(任意要件の場合)
  • クーポン:対象外プランで拒否される
  • クーポン:1ユーザー2回目で拒否される
  • 差額:過去支払額を正しく参照し不足分のみ請求
  • Webhook:全イベントが一意ID付きで発火・再送安全

まとめ

  • 無料プランは恒常的な“入口”として、クーポンは戦術的な“ブースト”として使い分けます。
  • 不正対策・監査・差額課金との整合を最初から設計しておくことで、運用コストを低減しつつ成長を加速できます。