새로운 기능
1. Discount Codes: Amount 할인, 일정 예약 및 자격 규칙
Discount codes는 더 이상 percentage 전용이 아닙니다. 이제 code에서 고정 금액을 차감하고, 일정을 지정해 시작하며, 통화별로 다른 가격을 적용하고, 사용 가능한 사용자를 제한할 수 있습니다. Amount 할인type을 flat으로 설정하면 percentage 대신 고정 금액을 차감합니다. 차감액은 line item별로 적용되지 않고 전체 cart에 걸쳐 합산됩니다.

currency_options을 사용하면 판매하는 모든 통화에서 하나의 code가 올바르게 동작합니다. 각 항목은 하나의 통화에 대해 최대 할인 금액(Amount code의 경우 차감액, Percentage code의 경우 상한)과 최소 cart 금액을 설정합니다. Amount 할인에는 확인 가능한 기본값이 있는 통화 옵션이 하나 이상 필요하며, Percentage 할인에서는 통화별 옵션을 선택적으로 설정할 수 있습니다.
고객 자격
customer_eligibility은 code를 사용할 수 있는 사용자를 제어합니다:

GET /discounts/{discount_id}/customers으로 연결된 고객을 조회하고, POST /discounts/{discount_id}/customers으로 고객을 연결하며, DELETE /discounts/{discount_id}/customers/{customer_id}으로 고객 한 명의 연결을 해제할 수 있습니다.
일정 예약 및 고객별 한도
starts_at을 설정하면 향후 출시 일정에 맞춰 code를 예약할 수 있습니다. 설정하지 않으면 code가 즉시 활성화되며, 이 값은 반드시 expires_at보다 엄격히 이전이어야 합니다. per_customer_usage_limit을 사용하면 단일 고객이 code를 사용할 수 있는 횟수를 제한할 수 있습니다. 이는 전체 usage_limit을 초과할 수 없는 별도의 한도입니다.
최소 cart 금액은 stack 진행 중간의 누적 합계가 아니라 항상 cart의 원래 가격을 기준으로 계산됩니다. 따라서 stacking 순서가 최소 금액 충족 여부를 바꾸지 않습니다.
2. 새롭게 구축된 Webhooks 환경
dashboard의 webhooks 섹션이 embedded portal을 대체하는 네이티브 환경으로 다시 구축되었습니다. 이제 모든 기능이 일관된 테이블, 필터 및 탐색 기능과 함께 dashboard 내부에 있으며, 모바일에서도 올바르게 작동합니다.- Endpoints — side sheet에서 endpoints를 생성하고 편집하며, 검색 가능한 트리에서 event type을 선택하고, 최근 24시간의 error rate를 한눈에 확인할 수 있습니다.
- Activity 및 logs — Delivery activity chart에서 시간 경과에 따른 delivery 시도를 확인하고, 전달된 메시지를 탐색하며, message detail 페이지를 열어 payload와 response code 및 duration이 포함된 모든 delivery 시도를 검사할 수 있습니다. 각 시도는 해당 페이지에서 replay할 수 있습니다.
- Event catalog — Dodo Payments가 전송하는 모든 event type과 해당 schema 및 example payload를 확인할 수 있습니다.
- Endpoint overview — 최근 24시간의 delivery 통계, 확인 또는 rotate할 수 있는 signing secret, Replay history를 제공합니다.
- Testing — live 상태로 전환하기 전에 example event를 endpoint로 전송하여 receiver를 검증할 수 있습니다.
- Advanced — delivery를 throttle하고, 해당 endpoint에 대한 모든 request와 함께 전송되는 custom headers를 관리하며 transformation을 편집할 수 있습니다.
- Bulk replay — endpoint에서 failed message를 복구하고, dispatch되지 않은 메시지를 replay하거나 필터링된 범위를 replay할 수 있습니다.
- Email alerting — endpoint로의 delivery가 실패하기 시작할 때 이메일을 보낼 주소를 관리할 수 있는 새로운 Settings 탭입니다. 여러 주소는 쉼표로 구분하고, 비워 두면 alert가 꺼집니다.
이번 변경은 dashboard에만 적용됩니다. 기존 endpoints, signing secrets, signature verification, event names 및 payloads는 모두 변경되지 않았으므로 integration 작업이 필요하지 않습니다.
3. Subscriptions용 Cash App Pay
이제 Cash App Pay를 일회성 결제뿐만 아니라 recurring subscription에도 사용할 수 있습니다. 기존 card 옵션과 함께 USD로 청구되는 미국 checkout에서 이용할 수 있습니다. 자세히 알아보기: Digital Wallets4. SEPA Direct Debit
이제 Eurozone 전역에서 SEPA Direct Debit을 사용할 수 있어 고객이 card 대신 은행 계좌에서 직접 결제할 수 있습니다. 일회성 결제를 위한 EUR checkout에서 제공됩니다. 자세히 알아보기: European Payment Methods5. 더 명확해진 Payment Failure 메시지
payment가 실패하면 이제 귀사와 고객에게 raw processor text 대신 목적에 맞게 작성된 문구가 표시됩니다. 모든 failure는 46개의 통합 error code taxonomy를 통해 처리되며, 각 code는 두 대상에 매핑됩니다:- 귀사에는 payment에 headline과 권장 조치가 표시되므로 고객에게 retry를 요청할지, 은행에 문의하도록 할지, 다른 card를 사용하도록 할지 알 수 있습니다. Payment object의
error_message는error_code이 인식된 통합 code인 경우 이 문구를 전달합니다. - 고객에게는 checkout failure 화면, Customer Portal 및 dunning 이메일에 일반 언어로 된 설명이 표시됩니다. 예: “카드 보안 코드(CVC)가 올바르지 않은 것 같습니다. 다시 입력한 후 다시 시도해 주세요.”
6. 고객이 직접 Subscriptions를 취소하도록 허용
이제 Allow Subscription Cancellation은 dashboard 설정의 Subscriptions 탭에 있는 독립적인 설정이며 전체 흐름에 적용됩니다. 이 설정을 끄면 Customer Portal에서 cancel 버튼이 비활성화되고 API는 고객이 시작한 취소를403과 함께 거부합니다. 즉시 취소와 “다음 청구일에 취소” 흐름 모두에 적용됩니다. 이전에는 이 설정이 버튼만 숨겼기 때문에, 고객이 API를 통해 여전히 취소할 수 있었습니다.
이 설정은 기본적으로 활성화되어 있습니다. merchant API 및 dashboard를 통한 귀사의 취소에는 영향을 주지 않으며, 고객은 이미 예약한 취소를 언제든 철회할 수 있습니다.
자세히 알아보기: Customer Portal | Subscriptions
7. Payout Webhooks
이제 자체 payouts에 대한 webhooks를 수신하므로 polling 없이 accounting system에서 이를 조정할 수 있습니다.payout.created은 이전에 payout.not_initiated로 전송되었습니다. 기존 endpoint가 payout.not_initiated을 필터링하는 경우, 계속 일치하도록 필터를 payout.created로 업데이트하세요. payload의 status field는 이 단계에서 여전히 not_initiated을 보고합니다.8. Dashboard에서 로그인 이메일 변경
이제 support에 문의하지 않고 로그인에 사용하는 이메일 주소를 변경할 수 있습니다. Account 탭이 새롭게 디자인되었으며, 흐름을 시작하는 Change email 버튼이 있는 새로운 Change Email 섹션이 포함됩니다. Verification은 두 단계로 진행됩니다. 먼저 현재 주소로 code를 이메일로 보내 본인임을 확인하고, 그다음 새 주소로 두 번째 code를 보내 해당 주소를 제어할 수 있는지 확인합니다. 두 주소의 verification이 완료되면:- 이후부터는 새 주소로 로그인합니다. 이전 주소는 password, magic link 및 이메일로 전송되는 code에 더 이상 사용할 수 없습니다.
- Google 또는 GitHub sign-in과 같은 연결된 identity provider가 연결 해제되므로 다시 연결해야 합니다.
- password, businesses, team access 및 verification status는 변경되지 않습니다.
- 이전 주소로 notification이 전송되므로 예상하지 못한 변경이 조용히 진행되지 않습니다.
9. Analytics: 새로운 Widgets 및 개선 사항
Analytics v3 재구축을 기반으로 이번 release에서는 새로운 visualization을 추가하고 기존 visualization을 개선했습니다.- Revenue by country가 이제 전체 너비의 choropleth map으로 제공되며, 옆에 순위별 country list가 표시됩니다. 다른 카드와 마찬가지로 이 card도 공유할 수 있습니다.
- 다시 그려진 trend chart에는 crosshair hover, x축의 rolling date pill 및 간결한 tooltip이 적용됩니다.
- 새로운 date preset — Last 30 days가 Last 4 weeks를 대체하고, Last 6 months가 목록에 추가됩니다.
- 필터가 유지됩니다. 이제 date preset과 comparison mode가 business별로 유지되고 여러 device에서 적용되므로 매 session마다 기본값으로 재설정되지 않습니다.
- Top customer가 이름으로 식별되며, 이름이 없으면 email을 사용합니다.
- Revenue by country가 이제 상위 150개 country까지 반환합니다.
개선 사항 및 Bug Fixes
10. 통화별 Payments 필터링
GET /payments은 선택적 currency query parameter를 지원하므로 특정 통화로 settlement된 payment만 조회할 수 있습니다. 예: GET /payments?currency=EUR. 동일한 필터를 dashboard의 Payments table에서도 사용할 수 있습니다.
자세히 알아보기: List Payments
11. Dispute Response Window을 10일로 연장
이제 dispute가 생성된 후 10일 동안 응답할 수 있으며, 기존 4일에서 연장되었습니다. dashboard의 dispute에 표시되는 countdown과 API가 반환하는 response deadline 모두 연장된 기간을 반영합니다. 자세히 알아보기: Disputes12. 더 명확해진 Payout Bank Account Form
payout bank account 추가 과정이 더 명확해졌습니다. field label, description 및 tooltip이 business type에 맞게 조정되므로 sole proprietor의 account holder와 beneficiary name이 더 이상 중복된 것처럼 표시되지 않습니다. 은행으로 Other를 선택하면 이름을 자유롭게 입력할 수 있고, 중국 국내 은행 코드는 CNAPS로 표시됩니다. 또한 test mode에서도 payouts 페이지가 계속 표시되므로 어느 mode에서든 연결된 account에 접근할 수 있습니다. 자세히 알아보기: Payouts Process기타 수정 및 개선 사항
- payment가 실패하면 plan-change credit이 되돌려집니다. subscription plan 변경 중 발행된 proration credit은 그 결과 payment가 성공하지 못한 경우 더 이상 남지 않습니다.
- paid-trial invoice에 일반 recurring price가 아닌 trial charge가 표시됩니다.
- Percentage discount가 최소 cart 금액을 적용합니다. 누적 합계가 아닌 base price를 기준으로 계산되며, discount lock timeout은 이제 일반적인
503대신 별도의 error code를 반환합니다. - 이미 제거된 payment method를 삭제해도 이제 성공하며 error를 반환하지 않으므로 호출을 안전하게 idempotent로 사용할 수 있습니다.
- subscription의 payment method를 업데이트할 때 India mandate floor에 사용되는 통화를 수정했습니다.
- 허용 범위를 벗어난 credit ledger entry는 나중에 실패하는 대신 typed
400와 함께 거부됩니다. - Pay-what-you-want product가 shared checkout link에서 고정 금액을 지원하며, entitlement detail panel에 entitlement ID가 표시됩니다.
- Analytics 수정 사항: lifetime-value series, MRR에 포함되는 add-on, all-time range에서 period comparison 제거, 현재 bucket에서 중지되는 series, 더 명확해진 range 및 comparison label.
- 플랫폼 전반의 사소한 bug 수정 및 안정성 개선.