メインコンテンツへスキップ
サブスクリプションを使用すると、自動更新で継続的なアクセスを販売できます。柔軟な請求サイクル、無料トライアル、プラン変更、アドオンを使用して、各顧客に合わせた価格設定を行います。

サブスクリプションとは?

サブスクリプションは、顧客がスケジュールに従って購入する定期的な製品です。以下に最適です:
  • SaaSライセンス: アプリ、API、またはプラットフォームアクセス
  • メンバーシップ: コミュニティ、プログラム、またはクラブ
  • デジタルコンテンツ: コース、メディア、またはプレミアムコンテンツ
  • サポートプラン: SLA、成功パッケージ、またはメンテナンス

主な利点

  • 予測可能な収益: 自動更新による定期請求
  • 柔軟なサイクル: 月次、年次、カスタム間隔、トライアル
  • プランの柔軟性: アップグレードとダウングレードのための按分
  • アドオンと席数: オプションの数量化可能なアップグレードを添付
  • シームレスなチェックアウト: ホストされたチェックアウトと顧客ポータル
  • 開発者ファースト: 作成、変更、使用状況追跡のための明確なAPI

サブスクリプションの作成

Dodo Paymentsダッシュボードでサブスクリプション製品を作成し、チェックアウトまたはAPIを通じて販売します。製品をアクティブなサブスクリプションから分離することで、価格設定のバージョン管理、アドオンの添付、パフォーマンスの独立した追跡が可能になります。

サブスクリプション製品の作成

ダッシュボードでフィールドを設定して、サブスクリプションの販売、更新、請求の方法を定義します。以下のセクションは、作成フォームで見る内容に直接対応しています。

製品の詳細

  • 製品名 (必須): チェックアウト、顧客ポータル、請求書に表示される名前。
  • 製品説明 (必須): チェックアウトと請求書に表示される明確な価値声明。
  • 製品画像 (必須): PNG/JPG/WebP 最大3MB。チェックアウトと請求書で使用されます。
  • ブランド: 特定のブランドに製品を関連付けてテーマやメールに使用します。
  • 税カテゴリ (必須): 税ルールを決定するためにカテゴリ(例: SaaS)を選択します。
正確な税カテゴリを選択して、地域ごとの正しい税金の徴収を確保してください。

価格設定

  • 価格タイプ: サブスクリプション(このガイド)。代替は単一支払いと使用ベースの請求です。
  • 価格 (必須): 通貨付きの基本的な定期価格。
  • 適用可能な割引 (%): 基本価格に適用されるオプションのパーセント割引; チェックアウトと請求書に反映されます。
  • 毎回の支払いの繰り返し (必須): 更新の間隔、例: 毎月1回。サイクル(月または年)と数量を選択します。
  • サブスクリプション期間 (必須): サブスクリプションがアクティブな合計期間(例: 10年)。この期間が終了すると、更新は停止します(延長しない限り)。
  • トライアル期間日数 (必須): 日数でトライアルの長さを設定します。トライアルを無効にするには0を使用します。最初の請求はトライアルが終了すると自動的に発生します。
  • アドオンを選択: 基本プランと一緒に顧客が購入できる最大3つのアドオンを添付します。
アクティブな製品の価格を変更すると、新しい購入に影響します。既存のサブスクリプションは、プラン変更と按分設定に従います。
アドオンは、席数やストレージなどの数量化可能な追加に最適です。顧客が変更したときに許可される数量と按分の動作を制御できます。

高度な設定

  • 税金を含む価格設定: 適用される税金を含む価格を表示します。最終的な税金計算は顧客の所在地によって異なります。
  • ライセンスキーを生成: 購入後に各顧客にユニークなキーを発行します。ライセンスキーガイドを参照してください。
  • デジタル製品の配信: 購入後にファイルやコンテンツを自動的に配信します。デジタル製品の配信で詳細を学びます。
  • メタデータ: 内部タグ付けやクライアント統合のためにカスタムキー–バリューのペアを添付します。メタデータを参照してください。
メタデータを使用して、システムからの識別子(例: accountId)を保存し、後でイベントと請求書を照合できるようにします。

サブスクリプショントライアル

トライアルを使用すると、顧客は即時の支払いなしでサブスクリプションにアクセスできます。最初の請求はトライアルが終了すると自動的に発生します。

トライアルの設定

製品の価格設定セクションでトライアル期間日数を設定します(無効にするには0を使用)。サブスクリプションを作成する際にこれを上書きできます:
// Via subscription creation
const subscription = await client.subscriptions.create({
  customer_id: 'cus_123',
  product_id: 'prod_monthly',
  trial_period_days: 14  // Overrides product's trial period
});

// Via checkout session
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'prod_monthly', quantity: 1 }],
  subscription_data: { trial_period_days: 14 }
});
trial_period_daysの値は0から10,000日までの範囲でなければなりません。

トライアルステータスの検出

現在、トライアルステータスを検出するための直接的なフィールドはありません。以下は、支払いをクエリする必要がある回避策であり、効率的ではありません。より効率的なソリューションに取り組んでいます。
サブスクリプションがトライアル中かどうかを判断するには、サブスクリプションの支払いリストを取得します。金額が0の支払いが正確に1件ある場合、サブスクリプションはトライアル期間中です:
const subscription = await client.subscriptions.retrieve('sub_123');
const payments = await client.payments.list({
  subscription_id: subscription.subscription_id
});

// Check if subscription is in trial
const isInTrial = payments.items.length === 1 && 
                  payments.items[0].total_amount === 0;

トライアル期間の更新

next_billing_dateを更新してトライアルを延長します:
await client.subscriptions.update('sub_123', {
  next_billing_date: '2025-02-15T00:00:00Z'  // New trial end date
});
next_billing_dateを過去の時間に設定することはできません。日付は未来でなければなりません。

サブスクリプションプランの変更

プラン変更により、サブスクリプションをアップグレードまたはダウングレードしたり、数量を調整したり、異なる製品に移行したりできます。各変更は、選択した按分モードに基づいて即時の請求をトリガーします。

按分モード

プラン変更時に顧客がどのように請求されるかを選択します:

prorated_immediately

現在の請求サイクルの残り時間に基づいて按分された金額を請求します。未使用の時間を考慮した公正な請求に最適です。
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately'
});

difference_immediately

価格差を即時に請求します(アップグレード)または将来の更新のためにクレジットを追加します(ダウングレード)。シンプルなアップグレード/ダウングレードシナリオに最適です。
// Upgrade: charges $50 (difference between $30 and $80)
// Downgrade: credits remaining value, auto-applied to renewals
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'difference_immediately'
});
difference_immediatelyを使用したダウングレードからのクレジットは、サブスクリプションスコープであり、将来の更新に自動的に適用されます。これは、顧客クレジットとは異なります。

full_immediately

残りの時間を無視して、新しいプランの全額を即時に請求します。請求サイクルをリセットするのに最適です。
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_monthly',
  quantity: 1,
  proration_billing_mode: 'full_immediately'
});

アドオンを伴うプランの変更

プラン変更時にアドオンを修正します。アドオンは按分計算に含まれます:
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: [{ addon_id: 'addon_extra_seats', quantity: 2 }]  // Add add-ons
  // addons: []  // Empty array removes all existing add-ons
});
プラン変更は即時の請求をトリガーします。請求に失敗した場合、サブスクリプションはon_holdステータスに移行する可能性があります。subscription.plan_changed webhookイベントを介して変更を追跡します。

プラン変更のプレビュー

プラン変更を確定する前に、正確な請求額と結果のサブスクリプションをプレビューします:
const preview = await client.subscriptions.previewChangePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately'
});

// Show customer the charge before confirming
console.log('You will be charged:', preview.immediate_charge.summary);

プラン変更プレビューAPI

プラン変更を確定する前にプレビューします。

サブスクリプションの状態

サブスクリプションはライフサイクルの中で異なる状態にあることがあります:
  • active: サブスクリプションはアクティブで、自動的に更新されます
  • on_hold: サブスクリプションは支払い失敗により一時停止されています。再活性化には支払い方法の更新が必要です
  • cancelled: サブスクリプションはキャンセルされ、更新されません
  • expired: サブスクリプションは終了日を迎えました
  • pending: サブスクリプションは作成中または処理中です

保留状態

サブスクリプションは次の理由でon_hold状態に入ります:
  • 更新支払いが失敗した場合(残高不足、カードの期限切れなど)
  • プラン変更の請求が失敗した場合
  • 支払い方法の承認が失敗した場合
サブスクリプションがon_hold状態にある場合、自動的に更新されません。支払い方法を更新してサブスクリプションを再活性化する必要があります。

保留からの再活性化

on_hold状態からサブスクリプションを再活性化するには、支払い方法を更新します。これにより自動的に:
  1. 残りの未払い金の請求を作成します
  2. 請求書を生成します
  3. 新しい支払い方法を使用して支払いを処理します
  4. 支払いが成功した場合、サブスクリプションをactive状態に再活性化します
// Reactivate subscription from on_hold
const response = await client.subscriptions.updatePaymentMethod('sub_123', {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
  // Monitor webhooks for payment.succeeded and subscription.active
}
on_holdサブスクリプションの支払い方法を正常に更新した後、payment.succeededに続いてsubscription.active webhookイベントを受け取ります。

API管理

POST /subscriptionsを使用して、製品からプログラム的にサブスクリプションを作成します。オプションのトライアルとアドオンがあります。

APIリファレンス

サブスクリプション作成APIを表示します。
PATCH /subscriptions/{id}を使用して、数量を更新したり、期間終了時にキャンセルしたり、メタデータを変更したりします。

APIリファレンス

サブスクリプションの詳細を更新する方法を学びます。
按分コントロールを使用して、アクティブな製品と数量を変更します。

APIリファレンス

プラン変更オプションを確認します。
オンデマンドサブスクリプションに対して、特定の金額をオンデマンドで請求します。

APIリファレンス

オンデマンドサブスクリプションを請求します。
GET /subscriptionsを使用してすべてのサブスクリプションをリストし、GET /subscriptions/{id}を使用して1つを取得します。

APIリファレンス

リストと取得APIを参照してください。
メーターまたはハイブリッド価格モデルの記録された使用状況を取得します。

APIリファレンス

使用履歴APIを参照してください。
サブスクリプションの支払い方法を更新します。アクティブなサブスクリプションの場合、これは将来の更新のために支払い方法を更新します。on_hold状態のサブスクリプションの場合、残りの未払い金の請求を作成することでサブスクリプションを再活性化します。

APIリファレンス

支払い方法を更新し、サブスクリプションを再活性化する方法を学びます。

一般的なユースケース

  • SaaSとAPI: 席数や使用量のための階層的アクセス
  • コンテンツとメディア: 月次アクセスと導入トライアル
  • B2Bサポートプラン: プレミアムサポートアドオン付きの年間契約
  • ツールとプラグイン: ライセンスキーとバージョン管理されたリリース

統合例

チェックアウトセッション(サブスクリプション)

チェックアウトセッションを作成する際に、サブスクリプション製品とオプションのアドオンを含めます:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_subscription',
      quantity: 1
    }
  ]
});

按分を伴うプラン変更

サブスクリプションをアップグレードまたはダウングレードし、按分の動作を制御します:
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_new',
  quantity: 1,
  proration_billing_mode: 'difference_immediately'
});

期間終了時にキャンセル

即時のアクセス終了なしにキャンセルをスケジュールします:
await client.subscriptions.update('sub_123', {
  cancel_at_period_end: true
});

オンデマンドサブスクリプション

オンデマンドサブスクリプションを作成し、必要に応じて後で請求します:
const onDemand = await client.subscriptions.create({
  customer_id: 'cus_123',
  product_id: 'prod_on_demand',
  on_demand: true
});

await client.subscriptions.createCharge(onDemand.id, {
  amount: 4900,
  currency: 'USD',
  description: 'Extra usage for September'
});

アクティブなサブスクリプションの支払い方法を更新

アクティブなサブスクリプションの支払い方法を更新します:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod('sub_123', {
  type: 'new',
  return_url: 'https://example.com/return'
});

// Or use existing payment method
await client.subscriptions.updatePaymentMethod('sub_123', {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});

保留からサブスクリプションを再活性化

支払い失敗により保留になったサブスクリプションを再活性化します:
// Update payment method - automatically creates charge for remaining dues
const response = await client.subscriptions.updatePaymentMethod('sub_123', {
  type: 'new',
  return_url: 'https://example.com/return'
});

if (response.payment_id) {
  // Charge created for remaining dues
  // Redirect customer to response.payment_link
  // Monitor webhooks: payment.succeeded → subscription.active
}

RBI準拠の命令を伴うサブスクリプション

UPIおよびインドのカードサブスクリプションは、特定の命令要件を伴うRBI(インド準備銀行)規制の下で運営されています:

命令の制限

命令の種類と金額は、サブスクリプションの定期的な請求に依存します:
  • ₹15,000未満の請求: ₹15,000 INRのオンデマンド命令を作成します。サブスクリプション金額は、サブスクリプションの頻度に従って定期的に請求され、命令の制限まで請求されます。
  • ₹15,000以上の請求: 正確なサブスクリプション金額のサブスクリプション命令(またはオンデマンド命令)を作成します。

アップグレードとダウングレードの考慮事項

重要: サブスクリプションをアップグレードまたはダウングレードする際は、命令の制限を慎重に考慮してください:
  • アップグレード/ダウングレードにより請求金額が₹15,000を超え、既存のオンデマンド支払い制限を超える場合、取引手数料が失敗する可能性があります。
  • その場合、顧客は支払い方法を更新する必要があるか、正しい制限で新しい命令を確立するために再度サブスクリプションを変更する必要があります。

高額請求の承認

₹15,000以上のサブスクリプション請求の場合:
  • 顧客は銀行から取引を承認するように求められます。
  • 顧客が取引を承認しない場合、取引は失敗し、サブスクリプションは保留になります。

48時間の処理遅延

処理タイムライン: インドのカードおよびUPIサブスクリプションの定期的な請求は、独自の処理パターンに従います:
  • 請求は、サブスクリプションの頻度に従って予定された日に開始されます。
  • 顧客の口座からの実際の控除は、支払い開始から48時間後にのみ発生します。
  • この48時間のウィンドウは、銀行APIの応答に応じて最大2-3時間延長される場合があります。

命令キャンセルウィンドウ

48時間の処理ウィンドウ中:
  • 顧客は銀行アプリを通じて命令をキャンセルできます。
  • 顧客がこの期間中に命令をキャンセルした場合、サブスクリプションはアクティブのままです(これはインドのカードおよびUPI自動支払いサブスクリプションに特有のエッジケースです)。
  • ただし、実際の控除が失敗する可能性があり、その場合、サブスクリプションは保留されます。
エッジケースの処理: 顧客に対して請求開始時に特典、クレジット、またはサブスクリプションの使用を即座に提供する場合、この48時間のウィンドウを適切にアプリケーションで処理する必要があります。考慮すべき点:
  • 支払い確認まで特典のアクティベーションを遅らせる
  • グレース期間や一時的なアクセスを実装する
  • 命令キャンセルのためのサブスクリプションステータスを監視する
  • アプリケーションロジックでサブスクリプション保留状態を処理する
サブスクリプションWebhookを監視して、支払いステータスの変更を追跡し、48時間のウィンドウ中に命令がキャンセルされた場合のエッジケースを処理します。

ベストプラクティス

  • 明確な階層から始める: 明確な違いのある2〜3のプラン
  • 価格を伝える: 合計、按分、次回の更新を表示
  • トライアルを慎重に使用する: 時間だけでなくオンボーディングで変換する
  • アドオンを活用する: 基本プランをシンプルに保ち、追加をアップセルする
  • 変更をテストする: テストモードでプラン変更と按分を検証する
サブスクリプションは、定期収益の柔軟な基盤です。シンプルに始め、徹底的にテストし、採用、解約、拡張の指標に基づいて反復してください。