Skip to main content

전제 조건

Dodo Payments API를 통합하려면 다음이 필요합니다:
  • Dodo Payments 상인 계정
  • 대시보드에서 API 자격 증명 (API 키 및 웹훅 비밀 키)
전제 조건에 대한 자세한 가이드는 이 섹션을 확인하세요.

API 통합

체크아웃 세션

Checkout Sessions를 사용하여 보안 호스팅된 체크아웃으로 구독 상품을 판매하세요. 구독 상품을 product_cart에 전달하고 반환된 checkout_url로 고객을 리디렉션하세요.
혼합 체크아웃: 하나의 체크아웃 세션에서 구독 상품과 일회성 상품을 결합할 수 있습니다. 이렇게 하면 구독과 함께 초기 설정 비용, SaaS 하드웨어 번들 등의 사용 사례를 지원할 수 있습니다. 예시를 보려면 Checkout Sessions guide를 참조하세요.

API 응답

다음은 응답의 예입니다:
고객을 checkout_url로 리디렉션하세요.

웹훅

구독을 통합할 때 구독 생애 주기를 추적하기 위해 웹훅을 받게 됩니다. 이러한 웹훅은 구독 상태 및 결제 시나리오를 효과적으로 관리하는 데 도움을 줍니다. 웹훅 엔드포인트를 설정하려면 자세한 통합 가이드를 따르세요.

구독 이벤트 유형

다음 웹훅 이벤트는 구독 상태 변경을 추적합니다:
  1. subscription.active - 구독이 성공적으로 활성화되었습니다.
  2. subscription.updated - 구독 개체가 업데이트되었습니다 (필드가 변경될 때마다 발생합니다).
  3. subscription.on_hold - 갱신 실패로 인해 구독이 보류 상태로 전환됩니다.
  4. subscription.failed - mandate 생성 실패로 인해 구독 생성에 실패했습니다.
  5. subscription.renewed - 다음 청구 기간을 위해 구독이 갱신되었습니다.
신뢰할 수 있는 구독 생애 주기 관리를 위해 이러한 구독 이벤트를 추적하는 것을 권장합니다.
구독 변경 사항에 대한 실시간 알림을 받으려면 subscription.updated를 사용하여 API를 폴링하지 않고 애플리케이션 상태를 동기화하세요.

결제 시나리오

수신하는 웹훅과 해당 웹훅의 발생 시점은 상품에 trial이 있는지 여부에 따라 달라집니다. 즉시 청구(시험 기간 0일):
  1. subscription.active: mandate가 승인되고 subscription이 활성화됩니다.
  2. payment.succeeded: 첫 번째 청구를 확인합니다. checkout 후 2~10분 이내에 발생할 것으로 예상됩니다.
시험 기간이 있는 경우:
  1. 시험 시작 시(checkout): 결제 수단이 승인되면 subscription.active가 한 번 발생합니다. 아직 recurring charge는 청구되지 않습니다. 첫 번째 실제 청구는 시험 기간이 종료될 때까지 연기됩니다.
  2. 시험 종료 시: recurring amount가 청구되며, payment.succeededsubscription.renewed함께 수신합니다.
이후 각 renewal:
  • subscription.renewed: 각 billing cycle에서 renewal payment가 차감될 때 발생하며, 항상 payment.succeeded와 함께 전송됩니다. 또한 업데이트된 next_billing_date도 포함합니다.
subscription product에 대해 실제로 금액이 차감될 때마다 subscription.renewed payment.succeeded를 수신합니다. 다음 cycle에 대한 access를 연장할 신호로 payment.succeeded만 사용하는 대신 subscription.renewed를 사용하세요.
결제 실패 시나리오
  1. Subscription Failure
  • subscription.failed - mandate 생성 실패로 인해 subscription 생성에 실패했습니다.
  • payment.failed - 결제 실패를 나타냅니다.
  1. Subscription On Hold
  • subscription.on_hold - renewal payment 또는 plan change charge 실패로 인해 subscription이 보류됩니다.
  • subscription이 보류되면 payment method가 업데이트될 때까지 자동으로 renewal되지 않습니다.
Best Practice: 구현을 간소화하려면 subscription lifecycle을 관리할 때 subscription event를 주로 추적하는 것을 권장합니다.
error_code/error_message를 읽는 방법, 언제 retry할지 결정하는 방법, 고객에게 실패를 표시하는 방법에 대한 전체 안내는 결제 실패 처리를 참조하세요.

subscription.failedsubscription.on_hold 비교

이 두 event는 혼동하기 쉽지만, 처리 방법은 매우 다릅니다:
subscription.failed는 terminal 상태입니다. subscription을 다시 활성화할 수 없습니다. 고객은 새 subscription을 생성해야 합니다. 이 event가 발생하면 절대 entitlements를 부여하지 마세요.

보류된 Subscription 처리

subscription이 on_hold 상태가 되면 다시 활성화하기 위해 payment method를 업데이트해야 합니다. 이 섹션에서는 subscription이 보류되는 시점과 처리 방법을 설명합니다.

Subscription이 보류되는 경우

다음과 같은 경우 subscription이 보류됩니다:
  • Renewal payment 실패: 잔액 부족, 만료된 카드 또는 은행 거절로 인해 자동 renewal charge가 실패함
  • Plan change charge 실패: plan upgrade/downgrade 중 즉시 charge가 실패함
  • Payment method authorization 실패: recurring charge에 대해 payment method를 승인할 수 없음
on_hold 상태의 subscription은 자동으로 renewal되지 않습니다. subscription을 다시 활성화하려면 payment method를 업데이트해야 합니다.

보류된 Subscription 다시 활성화

on_hold 상태의 subscription을 다시 활성화하려면 Update Payment Method API를 사용하세요. 이 API는 다음 작업을 자동으로 수행합니다:
  1. 미납 잔액에 대한 charge 생성
  2. 해당 charge에 대한 invoice 생성
  3. 새 payment method를 사용하여 payment 처리
  4. payment 성공 시 subscription을 active 상태로 재활성화
1

Handle subscription.on_hold webhook

subscription.on_hold webhook을 수신하면 application state를 업데이트하고 고객에게 알리세요:
2

Update payment method

고객이 payment method를 업데이트할 준비가 되면 Update Payment Method API를 호출하세요:
고객이 저장된 payment method를 보유하고 있다면 기존 payment method ID를 사용할 수도 있습니다:
3

Monitor webhook events

payment method를 업데이트한 후 다음 webhook event를 모니터링하세요:
  1. payment.succeeded - 미납 잔액에 대한 charge가 성공했습니다.
  2. subscription.active - subscription이 다시 활성화되었습니다.

Subscription event payload 예시


Subscription Plan 변경

change plan API endpoint를 사용하여 subscription plan을 upgrade 또는 downgrade할 수 있습니다. 이를 통해 subscription의 product와 quantity를 수정하고 proration을 처리할 수 있습니다.

Change Plan API Reference

subscription plan 변경에 대한 자세한 내용은 Change Plan API documentation을 참조하세요.

Proration 옵션

subscription plan을 변경할 때 즉시 charge를 처리하는 방법은 두 가지입니다:

1. prorated_immediately

  • 현재 billing cycle의 남은 시간을 기준으로 prorated amount를 계산합니다.
  • 기존 plan과 새 plan의 차액만 고객에게 청구합니다.
  • trial 기간에는 사용자를 즉시 새 plan으로 전환하고 고객에게 바로 청구합니다.

2. full_immediately

  • 새 plan의 전체 subscription amount를 고객에게 청구합니다.
  • 이전 plan의 남은 시간이나 credit을 무시합니다.
  • billing cycle을 reset하거나 proration과 관계없이 전체 금액을 청구하려는 경우에 유용합니다.

3. difference_immediately

  • upgrade하는 경우 두 plan 금액의 차액이 고객에게 즉시 청구됩니다.
  • 예를 들어 현재 plan이 30 Dollars이고 고객이 80 Dollars plan으로 upgrade하면 즉시 $50가 청구됩니다.
  • downgrade하는 경우 현재 plan의 미사용 금액이 internal credit으로 추가되고 향후 subscription renewal에 자동으로 적용됩니다.
  • 예를 들어 현재 plan이 50 Dollars이고 고객이 20 Dollars plan으로 전환하면 남은 $30가 credit으로 적립되어 다음 billing cycle에 사용됩니다.

4. do_not_bill

  • plan 변경을 즉시 적용하지만 변경 시점에는 아무것도 청구하지 않습니다.
  • 업데이트된 plan(및 quantity/add-ons)은 다음 예정된 renewal에 청구되며, 기존 billing date가 유지됩니다.
세 가지 “charge now” mode는 모두 billing cycle을 reset합니다. prorated_immediately, difference_immediatelyfull_immediately는 subscription의 next_billing_date를 변경일로 이동합니다. do_not_bill만 기존 renewal date를 유지하지만 즉시 charge는 적용하지 않습니다.

동작

  • 이 API를 호출하면 Dodo Payments가 선택한 proration 옵션에 따라 즉시 charge를 시작합니다.
  • plan 변경이 downgrade이고 prorated_immediately를 사용하는 경우 credit이 자동으로 계산되어 subscription의 credit balance에 추가됩니다. 이 credit은 해당 subscription에만 적용되며 동일한 subscription의 향후 recurring payment를 상쇄하는 데만 사용됩니다.
  • full_immediately 옵션은 credit 계산을 건너뛰고 새 plan의 전체 금액을 청구합니다.
Proration 옵션을 신중하게 선택하세요: 사용하지 않은 시간을 반영한 공정한 billing을 원하면 prorated_immediately를 사용하고, 현재 billing cycle과 관계없이 새 plan의 전체 금액을 청구하려면 full_immediately를 사용하세요.

Charge 처리

  • plan 변경 시 시작된 즉시 charge는 일반적으로 2분 이내에 처리가 완료됩니다.
  • 이 즉시 charge가 어떤 이유로든 실패하면 문제가 해결될 때까지 subscription이 자동으로 보류됩니다.

On-Demand Subscription

Create Subscription

구독 상품 생성 및 구독 라이프사이클 관리에 대한 API 참조

Change Subscription Plan

비율 옵션을 사용하여 구독 플랜 업그레이드, 다운그레이드 또는 변경에 대한 API 참조

Update Payment Method

결제 방법 업데이트 및 보류 중인 구독 재활성화에 대한 API 참조

Patch Subscription

구독 세부정보 및 구성 업데이트에 대한 API 참조
on-demand subscription을 생성하려면: on-demand subscription을 생성하려면 POST /subscriptions API endpoint를 사용하고 request body에 on_demand field를 포함하세요. 이를 통해 즉시 charge 없이 payment method를 승인하거나 custom initial price를 설정할 수 있습니다. on-demand subscription에 charge하려면: 이후 charge를 진행하려면 POST /subscriptions//charge endpoint를 사용하고 해당 transaction에서 고객에게 청구할 amount를 지정하세요.
request/response 예시, 안전한 retry policy 및 webhook 처리를 포함한 전체 단계별 안내는 On-Demand Subscriptions Guide를 참조하세요.

Subscription Billing에 대해 알아야 할 주요 사항

subscription period를 payment frequency보다 길게 설정하세요. subscription period가 payment frequency와 같으면(예: period = 1 month, frequency = 1 month) subscription은 단일 cycle 동안만 유효한 후 renewal되지 않고 expired로 전환됩니다. 지속적인 monthly plan을 사용하려면 monthly payment frequency와 함께 긴 subscription period(예: 20 years)를 설정하세요.
첫 번째 성공한 charge에서 currency가 고정됩니다. checkout을 생성할 때 항상 billing_currency billing_address.country를 명시적으로 전달하세요. 생략하면 고객의 IP(Adaptive Currency)를 기준으로 감지되며, subscription이 첫 charge를 완료하면 해당 subscription의 전체 수명 동안 currency가 고정됩니다. 이후 고객이 여행하더라도 변경할 수 없습니다.
trial은 charge가 아닌 $0 authorization을 수행합니다. subscription에 trial이 있으면 trial 시작 시 카드를 저장하기 위해 $0 mandate authorization이 생성되며, 첫 번째 실제 charge는 trial이 종료될 때 발생합니다. payments list에서 trial 중인 subscription에는 amount: 0가 포함된 payment가 정확히 하나 표시됩니다.
Subscription lifecycle: on_hold = renewal 실패(복구 가능: 고객에게 payment method 업데이트를 요청하며 dunning retry가 적용됨). expired = renewal 없이 term이 종료되었으며 다시 활성화할 수 없음. 고객은 다시 subscribe해야 합니다. cancelled = 고객 또는 merchant가 종료함. 대부분의 renewal 실패는 Dodo 오류가 아니라 issuer 측 거절(잔액 부족, 카드 거절)입니다.
인도 카드는 RBI e-mandate를 사용합니다. off-session charge(renewal 및 plan-change charge)가 정산되기까지 최대 약 48시간이 걸릴 수 있으며, ₹15,000 초과 recurring auto-debit에는 고객의 새로운 인증이 필요합니다(따라서 해당 한도를 초과하는 upgrade는 기존 mandate를 사용할 수 없습니다). 하나의 charge가 아직 processing인 동안 동일한 subscription에 대한 두 번째 charge는 “Cannot create new charge as previous payment is not successful yet.” 오류와 함께 실패합니다. 인도 외 카드는 거의 즉시 확인됩니다.
subscription charge에는 $1(또는 이에 상응하는 통화 금액)의 minimum이 있습니다. $0.01–$0.99 금액은 product_price: value out of range와 함께 거부됩니다. on-demand mandate_only setup을 통해서는 $0만 허용됩니다.

관련 API Reference

Create Subscription

subscription product 생성 및 subscription lifecycle 관리에 대한 API reference

Change Subscription Plan

proration 옵션을 사용한 subscription plan upgrade, downgrade 또는 변경에 대한 API reference

Update Payment Method

payment method 업데이트 및 보류된 subscription 재활성화에 대한 API reference

Patch Subscription

subscription 세부 정보 및 configuration 업데이트에 대한 API reference
마지막 수정일 2026년 7월 31일