前提条件
開始する前に、以下が必要です。- Dodo Paymentsのマーチャントアカウント
- ダッシュボードの Developer → API Keys にあるAPI key。
DODO_PAYMENTS_API_KEYに保存します - Developer → Webhooks にあるwebhook secret。
DODO_PAYMENTS_WEBHOOK_KEYに保存します - Products で作成したサブスクリプションプロダクトが少なくとも1つ
API連携
Checkout Sessions
サブスクリプションプロダクトを使用してcheckout sessionを構築し、サブスクリプションを作成します。顧客が支払い方法を承認し、チェックアウトを完了するとサブスクリプションが有効になります。- Node.js SDK
- Python SDK
- REST API
API Response
レスポンスにはcheckout_url が含まれます。
Webhooks
Webhooks は subscription event が発生したときにサーバーへ通知します。ダッシュボードの Developer → Webhooks で endpoint を設定してください。 webhook endpoint の設定方法については、Webhooks を参照してください。Subscription Event Types
subscription lifecycle を管理するため、以下の event を追跡します。subscription.active— Subscription が有効化されたsubscription.updated— Subscription のフィールドが変更されたsubscription.on_hold— 更新または plan-change の charge に失敗したsubscription.failed— Subscription の作成に失敗した(terminal。顧客は再 subscription が必要)subscription.renewed— recurring charge に成功したsubscription.past_due— 更新に失敗し、grace period が開始された。顧客はpast_due_ends_atまで access を維持するsubscription.plan_changed— plan が upgrade、downgrade、または変更されたsubscription.cancelled— Subscription がキャンセルされたsubscription.expired— Subscription が契約期間の終了に達した
paused、unpaused、update_payment_method を含む完全な一覧については、Subscription Webhooks を参照してください。
Payment Scenarios
Successful Payment Flow webhook のシーケンスは、subscription に trial があるかどうかによって異なります。 Immediate billing(trial 0 日):subscription.active: mandate が承認され、subscription が有効化されます。payment.succeeded: 最初の charge を確認します。checkout から 2〜10 分以内 に発生します。
- Trial 開始時(checkout): payment method が承認されると
subscription.activeが発生します。この時点では recurring charge は発生しません。 最初の実際の charge は trial 終了まで延期されます。 - Trial 終了時: recurring amount が請求され、
payment.succeededとsubscription.renewedを同時に受信します。
subscription.renewed: 各 billing cycle で更新 payment が引き落とされると発生し、常にpayment.succeededとともに送信されます。更新されたnext_billing_dateも含まれます。
subscription product に対して実際に資金が引き落とされるたびに、
subscription.renewed と payment.succeeded を受信します。次の cycle の access を延長するシグナルとして、payment.succeeded 単独ではなく subscription.renewed を使用してください。- Subscription Failure
subscription.failed- mandate の作成に失敗したため、Subscription の作成に失敗しました。payment.failed- payment の失敗を示します。
- Subscription On Hold
subscription.on_hold- 更新 payment または plan change charge の失敗により、Subscription が on hold になります。ビジネスに grace period がある場合、更新の失敗によって Subscription はまずpast_due(subscription.past_due)に移行し、grace period の終了時にのみon_hold(または grace period の設定に応じてcancelled)へ移行します。Subscription States を参照してください。- Subscription が on hold になると、payment method が更新されるまで自動的に更新されません。
Best Practice: 実装を簡単にするため、subscription lifecycle の管理では主に subscription event を追跡することを推奨します。
subscription.failed と subscription.on_hold
これら 2 つの event は混同しやすいものの、必要な対応は大きく異なります。
Handling Subscription On Hold
Subscription がon_hold state になった場合、再有効化するには payment method を更新する必要があります。このセクションでは、subscription が on hold になるタイミングと対応方法を説明します。
Subscription が On Hold になるタイミング
以下の場合、Subscription は on hold になります。- 更新 payment の失敗: 資金不足、カードの有効期限切れ、または bank decline により自動更新 charge に失敗した
- Plan change charge の失敗: plan の upgrade/downgrade 中に発生した即時 charge に失敗した
- Payment method authorization の失敗: recurring charge に対して payment method を承認できない
On Hold の Subscription の再有効化
on_hold state の subscription を再有効化するには、Update Payment Method API を使用します。これにより自動的に以下が行われます。
- 未払い残額の charge を作成
- charge の invoice を生成
- 新しい payment method で payment を処理
- payment 成功時に subscription を
activestate へ再有効化
1
Handle subscription.on_hold webhook
subscription.on_hold webhook を受信したら、アプリケーションの state を更新し、顧客に通知します。2
Update payment method
顧客が payment method を更新する準備ができたら、Update Payment Method API を呼び出します。
顧客が保存済みの payment method を持っている場合は、既存の payment method ID も使用できます。
3
Monitor webhook events
payment method の更新後、以下の webhook event を監視します。
payment.succeeded- 未払い残額の charge に成功したsubscription.active- Subscription が再有効化された
Subscription Event Payload の例
Subscription Plan の変更
change plan API endpoint を使用して、subscription plan を upgrade または downgrade できます。これにより、subscription の product と quantity を変更し、proration を処理できます。Change Plan API Reference
Proration Options
subscription plan の変更時には、即時 charge の処理方法として 4 つの option があります。1. prorated_immediately
- 現在の billing cycle の未使用部分を、残り時間に応じて prorate して credit します。credit の対象は base plan、quantity、add-on です
- その後、新しい plan、quantity、add-on で full cycle を charge します。charge 自体は proration されません
- 即時 charge の純額 =(新しい cycle 全額)-(残りの割合 × 古い cycle 全額)。credit の方が大きい場合、差額は subscription-scoped credit として将来の更新に保持されます
- trial period 中は、ユーザーを直ちに新しい plan に切り替え、顧客にすぐ charge します
2. full_immediately
- 前の cycle に対する credit なしで、新しい plan の subscription amount 全額を顧客に charge します
- upgrade と downgrade のどちらでも、顧客は新しい plan の価格全額を最初から支払います
- 古い plan の残り時間にかかわらず全額を charge したい場合に便利です
3. difference_immediately
- 顧客は古い plan の価格と新しい plan の価格の差額のみを支払います
- 金額は cycle のいつ変更したかに左右されません。同じ upgrade であれば、1 日目でも 29 日目でも費用は同じです
- upgrade の場合、顧客には差額が直ちに charge されます。例: $30/月 → $80/月 = $50 を即時 charge
- downgrade の場合、価格差は subscription-scoped credit として保存され、将来の更新に自動適用されます。例: $50/月 → $20/月 = $30 を credit として保存
4. do_not_bill
- plan の変更を直ちに適用しますが、変更時には何も charge しません。新しい plan、quantity、add-on はすぐに使用できます
- 現時点で charge されないため、upgrade では現在の cycle の残り期間、高い plan を無料で利用できます。downgrade は、すでに支払った cycle の未使用部分に対する credit なしで直ちに適用されます
do_not_billによって付与された add-on は、請求されていなかったため、後の plan change で credit されません。その後の変更では、新しい add-on quantity の全額が請求されます- 更新された plan(および quantity/add-on)は次回の予定された更新で請求され、元の billing date は維持されます
Behavior
- この API を呼び出すと、Dodo Payments は選択した proration option に基づいて直ちに charge を開始します
prorated_immediatelyでは、upgrade と downgrade のどちらでも、変更のたびに現在の cycle の未使用部分に対する credit が計算されます。その credit が新しい cycle の charge を上回る場合、残額は subscription の credit balance に追加されます。この credit はその subscription 専用であり、同じ subscription の将来の recurring payment を相殺するためにのみ使用されますdifference_immediatelyでは、純額は常に正確な価格差になります。downgrade の場合、超過分はprorated_immediatelyと同様に subscription-scoped credit として保存されますfull_immediatelyoption は credit の計算を行わず、新しい plan amount 全額を charge しますdo_not_billoption は変更を直ちに適用しますが、billing を次回の更新日まで延期します。更新日は維持されます
Charge Processing
- plan change 時に開始された即時 charge は、通常 2 分未満で処理を完了します
- この即時 charge が何らかの理由で失敗すると、問題が解決するまで Subscription は自動的に on hold になります
On-Demand Subscriptions
On-demand subscription を使用すると、固定スケジュールだけでなく、柔軟に顧客へ charge できます。この機能はすべての account で利用できます。
subscription_data.on_demand field を含めます。これにより、即時 charge なしで payment method を承認するか、カスタムの初回価格を設定できます。
On-demand subscription に charge するには:
以降の charge には、POST /subscriptions//charge endpoint を使用し、その transaction で顧客に charge する amount を指定します。
request/response の例、安全な retry policy、webhook handling を含む完全な手順については、On-Demand Subscriptions Guide を参照してください。
Subscription Billing で知っておくべき重要事項
Trial では charge ではなく $0 authorization が行われます。 subscription に trial がある場合、trial 開始時にカードを保存するため $0 mandate authorization が作成され、最初の実際の charge は trial 終了時に発生します。payments list では、free trial 中の subscription に
total_amount が 0 の payment が正確に 1 件表示されます。paid trial では代わりに trial_amount が前払いで charge されます。Subscription lifecycle:
past_due = 更新に失敗し、grace period が進行中(顧客は access を維持)。on_hold = 更新に失敗(復旧可能。顧客に payment method の更新を促し、dunning retry が適用されます)。expired = 更新されないまま契約期間が終了し、再有効化できない。顧客は再 subscription が必要です。cancelled = 顧客または merchant によって終了。更新の失敗の多くは Dodo の error ではなく、issuer-side decline(資金不足、カード declined)です。