> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# v1.112.0 (2026년 8월 5일)

> Discount codes에 Amount 할인, 예약 일정, 고객 자격 규칙, 통화별 옵션이 추가되었으며, 이메일 알림을 지원하는 새롭게 구축된 네이티브 webhooks 환경이 함께 제공됩니다. 또한 subscriptions용 Cash App Pay, 일회성 EUR 결제용 SEPA Direct Debit, 고객 친화적인 payment failure 메시지, payout webhooks, 셀프서비스 로그인 이메일 변경, 고객이 직접 subscriptions를 취소할 수 있는 설정, list payments의 통화 필터가 추가되었습니다.

## 새로운 기능

### 1. **Discount Codes: Amount 할인, 일정 예약 및 자격 규칙**

Discount codes는 더 이상 percentage 전용이 아닙니다. 이제 code에서 고정 금액을 차감하고, 일정을 지정해 시작하며, 통화별로 다른 가격을 적용하고, 사용 가능한 사용자를 제한할 수 있습니다.

**Amount 할인**

`type`을 `flat`으로 설정하면 percentage 대신 고정 금액을 차감합니다. 차감액은 line item별로 적용되지 않고 전체 cart에 걸쳐 합산됩니다.

| 유형         | API 값        | 동작                                           |
| ---------- | ------------ | -------------------------------------------- |
| Percentage | `percentage` | percentage만큼 가격을 낮추며, 통화별 상한을 선택적으로 설정할 수 있음 |
| Amount     | `flat`       | 전체 cart에 걸쳐 합산된 고정 금액을 차감함                   |

<Frame>
  <img src="https://mintcdn.com/dodopayments/Rh05LkBeJE32G3qq/images/discount-codes/discount-flat-discount-option.png?fit=max&auto=format&n=Rh05LkBeJE32G3qq&q=85&s=38ce7f39a1ccbd26c61718f685fc4e71" alt="Amount 유형이 선택되어 500 INR 고정 금액 차감이 표시된 discount code 편집기" style={{ maxHeight: '500px', width: 'auto' }} width="3474" height="1968" data-path="images/discount-codes/discount-flat-discount-option.png" />
</Frame>

**통화별 옵션**

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

**고객 자격**

`customer_eligibility`은 code를 사용할 수 있는 사용자를 제어합니다:

| 값            | 사용 가능한 고객                     |
| ------------ | ----------------------------- |
| `any`        | 모든 고객. 기본값입니다.                |
| `first_time` | 이전에 귀사에서 구매한 적이 없는 고객.        |
| `existing`   | 이전에 귀사에서 구매한 적이 있는 고객.        |
| `specific`   | code의 allow list에 추가한 고객만 해당. |

<Frame>
  <img src="https://mintcdn.com/dodopayments/Rh05LkBeJE32G3qq/images/discount-codes/discount-restriction.png?fit=max&auto=format&n=Rh05LkBeJE32G3qq&q=85&s=3c01240807a7ca2f13b33a9f4cf4ce43" alt="Any, First-time, Existing 및 Specific customer 옵션을 표시하는 고객 자격 드롭다운" style={{ maxHeight: '500px', width: 'auto' }} width="2832" height="830" data-path="images/discount-codes/discount-restriction.png" />
</Frame>

dashboard에서 allow list를 관리하거나 새로운 endpoints를 사용할 수 있습니다. `GET /discounts/{discount_id}/customers`으로 연결된 고객을 조회하고, `POST /discounts/{discount_id}/customers`으로 고객을 연결하며, `DELETE /discounts/{discount_id}/customers/{customer_id}`으로 고객 한 명의 연결을 해제할 수 있습니다.

<Warning>
  `specific` code는 적격 고객 **0명**으로 시작하며, 고객을 연결할 때까지 모든 사용 시도를 거부합니다.
</Warning>

**일정 예약 및 고객별 한도**

`starts_at`을 설정하면 향후 출시 일정에 맞춰 code를 예약할 수 있습니다. 설정하지 않으면 code가 즉시 활성화되며, 이 값은 반드시 `expires_at`보다 엄격히 이전이어야 합니다. `per_customer_usage_limit`을 사용하면 단일 고객이 code를 사용할 수 있는 횟수를 제한할 수 있습니다. 이는 전체 `usage_limit`을 초과할 수 없는 별도의 한도입니다.

<Info>
  최소 cart 금액은 stack 진행 중간의 누적 합계가 아니라 항상 cart의 원래 가격을 기준으로 계산됩니다. 따라서 stacking 순서가 최소 금액 충족 여부를 바꾸지 않습니다.
</Info>

자세히 알아보기: [Discounts](/features/discount-codes) | [Create Discount](/api-reference/discounts/create-discount)

### 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가 꺼집니다.

<Info>
  이번 변경은 dashboard에만 적용됩니다. 기존 endpoints, signing secrets, signature verification, event names 및 payloads는 모두 변경되지 않았으므로 integration 작업이 필요하지 않습니다.
</Info>

자세히 알아보기: [Webhooks](/developer-resources/webhooks) | [Webhook Events](/developer-resources/webhooks/intents/webhook-events-guide)

### 3. **Subscriptions용 Cash App Pay**

이제 Cash App Pay를 일회성 결제뿐만 아니라 recurring subscription에도 사용할 수 있습니다. 기존 card 옵션과 함께 USD로 청구되는 미국 checkout에서 이용할 수 있습니다.

자세히 알아보기: [Digital Wallets](/features/payment-methods/digital-wallets)

### 4. **SEPA Direct Debit**

이제 Eurozone 전역에서 SEPA Direct Debit을 사용할 수 있어 고객이 card 대신 은행 계좌에서 직접 결제할 수 있습니다. 일회성 결제를 위한 EUR checkout에서 제공됩니다.

<Warning>
  SEPA Direct Debit은 즉시 처리되지 않습니다. 결제가 confirm되는 데 **영업일 기준 6일**이 걸리므로 authorization을 settlement로 간주하지 마세요. 결제가 succeeded 상태가 된 후에만 주문을 처리해야 합니다.
</Warning>

자세히 알아보기: [European Payment Methods](/features/payment-methods/europe)

### 5. **더 명확해진 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)가 올바르지 않은 것 같습니다. 다시 입력한 후 다시 시도해 주세요."*

<Warning>
  사기에 민감한 decline인 경우 — `FRAUDULENT`, `LOST_CARD`, `STOLEN_CARD` 및 `PICKUP_CARD` — 실제 사유가 노출되지 않도록 고객에게는 항상 일반적인 메시지가 표시됩니다. 귀사에는 실제 사유가 표시되지만 공유하지 말라는 경고가 함께 제공됩니다.
</Warning>

자세히 알아보기: [Transaction Failures](/api-reference/transaction-failures) | [Payments](/features/transactions/payments) | [Get Payment Detail](/api-reference/payments/get-payments-1)

### 6. **고객이 직접 Subscriptions를 취소하도록 허용**

이제 **Allow Subscription Cancellation**은 dashboard 설정의 **Subscriptions** 탭에 있는 독립적인 설정이며 전체 흐름에 적용됩니다. 이 설정을 끄면 Customer Portal에서 cancel 버튼이 비활성화되고 API는 고객이 시작한 취소를 `403`과 함께 거부합니다. 즉시 취소와 "다음 청구일에 취소" 흐름 모두에 적용됩니다. 이전에는 이 설정이 버튼만 숨겼기 때문에, 고객이 API를 통해 여전히 취소할 수 있었습니다.

이 설정은 **기본적으로 활성화**되어 있습니다. merchant API 및 dashboard를 통한 귀사의 취소에는 영향을 주지 않으며, 고객은 이미 예약한 취소를 언제든 철회할 수 있습니다.

자세히 알아보기: [Customer Portal](/features/customer-portal) | [Subscriptions](/features/subscription)

### 7. **Payout Webhooks**

이제 자체 payouts에 대한 webhooks를 수신하므로 polling 없이 accounting system에서 이를 조정할 수 있습니다.

| Event                | 발생 시점                                                 |
| -------------------- | ----------------------------------------------------- |
| `payout.created`     | automatic payout cycle 또는 off-cycle을 통해 payout이 생성될 때 |
| `payout.in_progress` | payout due date가 도래하고 처리가 시작될 때                       |
| `payout.on_hold`     | payout이 일시 중지되거나 review 대상이 될 때                       |
| `payout.success`     | 은행 계좌로의 payout이 settlement될 때                         |
| `payout.failed`      | payout이 실패하고 금액과 수수료가 wallet으로 다시 credit될 때           |

<Note>
  `payout.created`은 이전에 `payout.not_initiated`로 전송되었습니다. 기존 endpoint가 `payout.not_initiated`을 필터링하는 경우, 계속 일치하도록 필터를 `payout.created`로 업데이트하세요. payload의 `status` field는 이 단계에서 여전히 `not_initiated`을 보고합니다.
</Note>

자세히 알아보기: [Payout Webhooks](/developer-resources/webhooks/intents/payout) | [Payouts Process](/features/payouts/payout-structure)

### 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이 전송되므로 예상하지 못한 변경이 조용히 진행되지 않습니다.

자세히 알아보기: [My Account](/miscellaneous/accounts)

### 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까지 반환합니다.

자세히 알아보기: [Dashboard Analytics](/features/analytics-and-reporting)

## 개선 사항 및 Bug Fixes

### 10. **통화별 Payments 필터링**

`GET /payments`은 선택적 **`currency`** query parameter를 지원하므로 특정 통화로 settlement된 payment만 조회할 수 있습니다. 예: `GET /payments?currency=EUR`. 동일한 필터를 dashboard의 Payments table에서도 사용할 수 있습니다.

자세히 알아보기: [List Payments](/api-reference/payments/get-payments)

### 11. **Dispute Response Window을 10일로 연장**

이제 dispute가 생성된 후 **10일** 동안 응답할 수 있으며, 기존 4일에서 연장되었습니다. dashboard의 dispute에 표시되는 countdown과 API가 반환하는 response deadline 모두 연장된 기간을 반영합니다.

자세히 알아보기: [Disputes](/features/transactions/disputes)

### 12. **더 명확해진 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](/features/payouts/payout-structure)

### 기타 수정 및 개선 사항

* **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 수정 및 안정성 개선.
