사전 요구 사항
시작하기 전에 다음이 필요합니다:- Dodo Payments merchant account
- 대시보드의 Developer → API Keys에서 발급한 API key를
DODO_PAYMENTS_API_KEY에 저장 - Developer → Webhooks에서 발급한 webhook secret을
DODO_PAYMENTS_WEBHOOK_KEY에 저장 - Products에서 생성된 subscription product 하나 이상
API 통합
Checkout Session
subscription product를 사용해 Checkout Session을 생성하여 subscription을 만듭니다. 고객이 payment method를 승인하면 Checkout을 완료하는 즉시 subscription이 활성화됩니다.- Node.js SDK
- Python SDK
- REST API
API Response
응답에는 다음이 포함됩니다checkout_url:
Webhooks
subscription event가 발생하면 Webhooks가 서버에 알립니다. dashboard의 Developer → Webhooks에서 endpoint를 설정하세요. webhook endpoint를 설정하려면 Webhooks를 참조하세요.Subscription Event Types
subscription lifecycle을 관리하려면 다음 event를 추적하세요:subscription.active— Subscription이 활성화됨subscription.updated— Subscription의 field가 변경됨subscription.on_hold— renewal 또는 plan-change charge가 실패함subscription.failed— Subscription 생성에 실패함(최종 상태이며 고객이 다시 subscribe해야 함)subscription.renewed— recurring charge가 성공함subscription.past_due— renewal이 실패하고 grace period가 시작됨. 고객은past_due_ends_at까지 access를 유지함subscription.plan_changed— Plan이 upgrade, downgrade 또는 변경됨subscription.cancelled— Subscription이 취소됨subscription.expired— Subscription이 term 종료에 도달함
paused, unpaused, update_payment_method을 포함한 전체 목록은 Subscription Webhooks를 참조하세요.
Payment Scenarios
Successful Payment Flow webhook sequence는 subscription에 trial이 있는지에 따라 달라집니다. Immediate billing (0 trial days):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에서 renewal 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- renewal payment 또는 plan change charge 실패로 Subscription이 on hold 상태가 됩니다. 비즈니스에 grace period가 있는 경우, renewal 실패 시 먼저 Subscription이past_due(subscription.past_due)로 이동하며, grace period가 종료될 때에만on_hold(또는 grace period 설정에 따라cancelled)로 이동합니다. Subscription States를 참조하세요.- Subscription이 on hold 상태가 되면 payment method가 업데이트될 때까지 자동으로 renewal되지 않습니다.
Best Practice: 구현을 간소화하려면 subscription lifecycle 관리 시 주로 subscription event를 추적하는 것이 좋습니다.
subscription.failed vs. subscription.on_hold
이 두 event는 혼동하기 쉽지만 처리 방식은 매우 다릅니다:
Handling Subscription On Hold
Subscription이on_hold 상태가 되면 다시 활성화하기 위해 payment method를 업데이트해야 합니다. 이 섹션에서는 subscription이 on hold 상태가 되는 시점과 처리 방법을 설명합니다.
When Subscriptions Go On Hold
다음과 같은 경우 Subscription이 on hold 상태가 됩니다:- Renewal payment 실패: 자금 부족, 만료된 카드 또는 bank decline으로 automatic renewal charge가 실패함
- Plan change charge 실패: plan upgrade/downgrade 중 즉시 charge가 실패함
- Payment method authorization 실패: recurring charge에 대해 payment method를 인증할 수 없음
Reactivating Subscriptions from On Hold
on_hold 상태의 Subscription을 다시 활성화하려면 Update Payment Method API를 사용하세요. 이 API는 자동으로 다음을 수행합니다:
- 미납 잔액에 대한 charge 생성
- charge에 대한 invoice 생성
- 새 payment method를 사용하여 payment 처리
- payment 성공 시 Subscription을
active상태로 다시 활성화
1
Handle subscription.on_hold webhook
subscription.on_hold webhook을 수신하면 애플리케이션 상태를 업데이트하고 고객에게 알리세요: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이 다시 활성화됨
Sample Subscription Event Payload
Changing Subscription Plans
change plan API endpoint를 사용하여 subscription plan을 upgrade 또는 downgrade할 수 있습니다. 이를 통해 subscription의 product와 quantity를 수정하고 proration을 처리할 수 있습니다.Change Plan API Reference
Proration Options
subscription plan을 변경할 때 즉시 charge 처리 방법으로 네 가지 옵션을 사용할 수 있습니다:1. prorated_immediately
- 남은 시간을 기준으로 prorate하여 현재 billing cycle의 사용하지 않은 부분을 credit으로 제공합니다. 이 credit에는 base plan, quantity 및 add-on이 반영됩니다.
- 그런 다음 새 plan, quantity 및 add-on에 대해 전체 cycle을 청구합니다. charge 자체는 절대 prorate되지 않습니다.
- 순 즉시 charge = (새 전체 cycle) - (남은 비율 x 기존 전체 cycle). credit이 더 큰 경우 차액은 subscription-scoped credit으로 보관되어 향후 renewal에 사용됩니다.
- trial period 중에는 사용자가 즉시 새 plan으로 전환되고 고객에게 바로 charge됩니다.
2. full_immediately
- 이전 cycle에 대한 credit 없이 새 plan의 전체 subscription amount를 고객에게 청구합니다.
- upgrade와 downgrade 모두 고객은 새 plan의 전체 가격을 처음부터 지불합니다.
- 기존 plan에 남은 기간과 관계없이 전체 금액을 청구하려는 경우 유용합니다.
3. difference_immediately
- 고객은 기존 plan 가격과 새 plan 가격의 차액만 지불합니다.
- 금액은 cycle 중 언제 변경하는지에 따라 달라지지 않습니다. 1일 차와 29일 차의 동일한 upgrade 비용은 같습니다.
- upgrade 시 고객에게 차액이 즉시 청구됩니다. 예: $30/month → $80/month = 즉시 $50 청구
- downgrade 시 가격 차액은 subscription-scoped credit으로 저장되어 향후 renewal에 자동 적용됩니다. 예: $50/month → $20/month = $30이 credit으로 저장
4. do_not_bill
- plan 변경을 즉시 적용하지만 변경 시점에는 아무것도 청구하지 않습니다. 새 plan, quantity 및 add-on을 즉시 사용할 수 있습니다.
- 현재 청구 cycle의 남은 기간 동안 upgrade된 상위 plan을 무료로 제공하게 됩니다. downgrade는 이미 결제한 cycle의 미사용 부분에 대한 credit 없이 즉시 적용됩니다.
do_not_bill를 통해 부여된 add-on은 청구된 적이 없으므로 이후 plan 변경 시 credit되지 않습니다. 이후 변경 시 새 add-on quantity 전체가 청구됩니다.- 업데이트된 plan(및 quantity/add-on)은 다음 예정 renewal에 청구되며, 기존 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를 청구합니다.do_not_billoption은 변경을 즉시 적용하지만 billing을 다음 renewal date까지 연기하며, 해당 date는 유지됩니다.
Charge Processing
- plan 변경 시 시작된 즉시 charge는 일반적으로 2분 이내에 처리가 완료됩니다.
- 이 즉시 charge가 어떤 이유로든 실패하면 문제가 해결될 때까지 Subscription이 자동으로 on hold 상태가 됩니다.
On-Demand Subscriptions
On-demand subscription을 사용하면 고정된 일정이 아니라 유연한 방식으로 고객에게 charge할 수 있습니다. 이 기능은 모든 account에서 사용할 수 있습니다.
subscription_data.on_demand field를 포함하세요. 이를 통해 즉시 charge 없이 payment method를 인증하거나 custom initial price를 설정할 수 있습니다.
on-demand subscription에 charge하려면:
후속 charge에는 POST /subscriptions//charge endpoint를 사용하고 해당 transaction에서 고객에게 charge할 amount를 지정하세요.
request/response example, 안전한 retry policy 및 webhook 처리를 포함한 단계별 전체 안내는 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가 정확히 하나 표시됩니다. paid trial은 대신 trial_amount를 선불로 charge합니다.Subscription lifecycle:
past_due = renewal이 실패하고 grace period가 진행 중이며 고객은 access를 유지합니다. on_hold = renewal이 실패했으며 복구할 수 있습니다. 고객에게 payment method 업데이트를 요청하고 dunning retry가 적용됩니다. expired = term이 renewal 없이 종료되었으며 다시 활성화할 수 없습니다. 고객은 다시 subscribe해야 합니다. cancelled = 고객 또는 merchant가 종료했습니다. 대부분의 renewal 실패는 Dodo 오류가 아니라 issuer 측 decline(자금 부족, 카드 거부)입니다.