席数ベースの課金では、顧客が必要とするユーザー数・チームメンバー数・ライセンス数に応じて課金できます。チームコラボレーションツール、エンタープライズソフトウェア、B2B SaaS製品では標準的な価格モデルです。
Implementation Tutorial
コード例付きのステップバイステップガイド。
Add-ons Documentation
席数ベースの課金を支えるアドオンシステムについて学ぶ。
Subscription Management
席数ベースのサブスクリプションとプラン変更を管理する。
Webhooks
サブスクリプションのWebhooksで席数の変更を追跡する。
シートベースの請求とは?
シートベースの請求(ユーザーごとまたはシートごとの価格設定とも呼ばれる)は、製品にアクセスするユーザーの数に基づいて顧客に料金を請求します。定額料金の代わりに、価格はチームのサイズに応じてスケールします。一般的な使用例
| 業界 | 例 | 価格モデル |
|---|---|---|
| チームコラボレーション | Slack, Notion, Asana | アクティブユーザー/月ごと |
| 開発者ツール | GitHub, GitLab, Jira | シート/月ごと |
| CRMソフトウェア | Salesforce, HubSpot | ユーザーライセンスごと |
| デザインツール | Figma, Canva | エディターシートごと |
| セキュリティソフトウェア | 1Password, Okta | ユーザー/月ごと |
| ビデオ会議 | Zoom, Teams | ホストライセンスごと |
シートベースの価格設定の利点
あなたのビジネスにとって:- 顧客が成長するにつれて収益が自然にスケール
- 顧客が予算を立てやすい予測可能な価格設定
- 個人からチーム、エンタープライズへの明確なアップグレードパス
- チームが拡大するにつれて高いライフタイムバリュー
- 使用した分だけ支払う
- コストを理解しやすく予測しやすい
- 必要に応じてユーザーを追加/削除する柔軟性
- チームのサイズに合った公正な価格設定
Dodo Paymentsにおけるシートベースの請求の仕組み
Dodo Paymentsは、アドオンシステムを使用してシートベースの請求を実装しています。以下がその仕組みです:アーキテクチャの概要
Team Proサブスクリプションは月額99ドルで5席が含まれています。5名を超えるユーザーがいる場合、追加の席1つにつき月額15ドルが加算されます。 例えばチームが15席必要な場合:- ベースプラン:月額99ドル(5席を含む)
- アドオン:追加10席×月額15ドル=月額150ドル
- 合計月額費用:99ドル+150ドル=15席で249ドル
主要コンポーネント
| コンポーネント | 目的 | 例 |
|---|---|---|
| 基本製品 | 含まれるシートのコアサブスクリプション | ”チームプラン - 月額$99(5シート含む)“ |
| シートアドオン | 追加ユーザーのためのシートごとの料金 | ”追加シート - 各月額$15” |
| 数量 | 購入した追加シートの数 | 10シート |
価格設定戦略
ビジネスに合ったシートベースの価格設定戦略を選択してください:戦略1: 基本 + シートごとのアドオン
基本プランに設定された数のシートを含め、追加シートに対して料金を請求します。 例:戦略2: 純粋なシートごとの価格設定
基本料金なしでシートごとに定額料金を請求します。 例:戦略3: 階層型シート価格設定
異なる基本プランに異なるシートごとの料金。 例:戦略4: シートバンドル
シートを個別ではなくパックで販売します。 例:シートベースの請求の設定
ステップ1: 価格設定を計画する
実装前に、価格構造を定義します:ステップ2: シートアドオンを作成する
Dodo Paymentsダッシュボードで:- 製品 → アドオンに移動します
- アドオンを作成をクリックします
- アドオンを設定します:
| フィールド | 値 | メモ |
|---|---|---|
| 名前 | ”追加シート”または”チームメンバー” | 明確でユーザーフレンドリーな名前 |
| 説明 | ”ワークスペースに別のチームメンバーを追加” | 顧客が得られるものを説明 |
| 価格 | あなたのシートごとの価格 | 例: $10.00 |
| 通貨 | 基本製品と一致させる | 同じ通貨でなければなりません |
| 税カテゴリ | 基本製品と同じ | 一貫した税処理を確保 |
ステップ3: 基本サブスクリプションを作成する
サブスクリプション製品を作成します:- 製品 → 製品を作成に移動します
- サブスクリプションを選択します
- 価格と詳細を設定します
- アドオンセクションで、シートアドオンを添付します
ステップ4: 製品にアドオンを添付する
シートアドオンをサブスクリプションにリンクします:- サブスクリプション製品を編集します
- アドオンセクションまでスクロールします
- アドオンを追加をクリックします
- シートアドオンを選択します
- 変更を保存します
サブスクリプション商品は席数ベースの価格設定をサポートします。顧客はチェックアウト時に任意の追加席数を購入できます。
シートの管理
新しいサブスクリプションへのシートの追加
チェックアウトセッションを作成する際に、シートの数量を指定します:既存のサブスクリプションのシート数の変更
シートを調整するためにChange Plan APIを使用します:シートの削除
シート数を減らすには、より少ない数量を指定します:すべての追加シートの削除
すべてのアドオンを削除するには、空のアドオン配列を渡します:シート変更の按分
顧客がシートを追加または削除する際、按分が請求方法を決定します。Proration Modes
| Mode | Adding Seats | Removing Seats |
|---|---|---|
prorated_immediately | Charge for remaining days in cycle | Credit for unused days |
difference_immediately | Charge full seat price | Credit applied to future renewals |
full_immediately | Charge full seat price, reset billing cycle | No credit |
Proration Examples
Scenario: 15-day billing cycle remaining, adding 5 seats at $10/seat- prorated_immediately
- difference_immediately
- full_immediately
Preview Before Changing
変更前には常にプラレーションをプレビューする:Tracking Seats with Webhooks
サブスクリプションWebhooksを監視して席数の変更を追跡する:Relevant Events
| Event | When Triggered | Use Case |
|---|---|---|
subscription.active | New subscription activated | Provision initial seats |
subscription.plan_changed | Seats added/removed | Update seat count in your app |
subscription.renewed | Subscription renewed | Confirm seat count unchanged |
subscription.cancelled | Subscription cancelled | Deprovision all seats |
Webhook Handler Example
Enforcing Seat Limits
お客様のアプリケーションは席数制限を強制する必要があります。Dodo Paymentsが課金を追跡しますが、アクセス制御はあなたが管理します。Enforcement Strategies
- Hard Limit
- Soft Limit with Warning
- Auto-Upgrade
席数を超えるユーザーの追加を厳密に防止します。
Advanced Patterns
Different Seat Types
価格が異なる複数の席タイプを提供する:Annual Seat Discounts
割引された年額席価格を提供する:Minimum Seat Requirements
特定プランに対して最低席数を必須とする:Best Practices
Pricing Best Practices
- Clear Communication: 価格ページで席単価を目立つように表示する
- Included Seats: ベース価格にいくつかの席を含めて摩擦を減らすことを検討する
- Volume Discounts: 大規模チーム向けに席単価を下げてエンタープライズ契約を獲得する
- Annual Incentives: キャッシュフローと維持率を改善するために年額プランを割引する
Technical Best Practices
- Cache Seat Counts: リクエストごとにAPIコールを避けるためにサブスクリプションの席数をローカルにキャッシュする
- Sync Regularly: 定期的にDodo PaymentsのAPIを使ってローカルの席数と同期する
- Handle Failures: 席の変更に失敗した場合は明確なエラーメッセージと再試行オプションを表示する
- Audit Trail: 請求に関する紛争やコンプライアンスのためにすべての席変更を記録する
User Experience Best Practices
- Real-Time Feedback: 席を調整した際のコストへの影響を即座に表示する
- Confirmation Steps: 課金変更前に確認ステップを設ける
- Proration Transparency: プラレーション料金を適用する前に明確に説明する
- Easy Downgrades: 席数を減らすのを難しくしないこと(信頼を築く)
Troubleshooting
Seat count mismatch between app and billing
Seat count mismatch between app and billing
症状: アプリがサブスクリプションと異なる席数を表示する。原因:
- Webhookが受信または処理されていない
- 席の変更時に競合状態が発生している
- キャッシュされたデータが更新されていない
subscription.plan_changedのWebhookハンドラーを実装する- 現在のサブスクリプションを取得する「請求と同期」ボタンを追加する
- 定期的に更新されるようにキャッシュのTTLを設定する
Proration charges unexpected
Proration charges unexpected
症状: 顧客がサイクル途中の請求額に戸惑っている。原因:
- プラレーションモードが明確に伝えられていない
- 顧客が確認前にプレビューを見ていない
- 変更前に常に
previewChangePlanを使用する - 「X席追加=今日Yドル(Z日分を按分)」の明確な内訳を表示する
- プラレーションポリシーをヘルプセンターに文書化する
Add-on not appearing in checkout
Add-on not appearing in checkout
症状: チェックアウト時に席アドオンが利用できない。原因:
- アドオンが商品に紐づいていない
- アドオンがアーカイブまたは削除されている
- 商品とアドオンの通貨が一致していない
- 商品設定でアドオンが紐づいているか確認する
- アドオンのステータスをアドオンダッシュボードで確認する
- 通貨が正確に一致していることを確認する
Cannot reduce seats below current usage
Cannot reduce seats below current usage
症状: 顧客がユーザーを割り当てたまま席数を減らしたい。解決策:
- 席を減らす前に削除が必要なユーザーを表示する
- ワークフローを実装する:ユーザーを削除 → 席を削減
- 席減少を強制する前に猶予期間を検討する