> ## 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.99.0 (2026년 5월 25일)

> 스택형 할인 코드(체크아웃, 결제 또는 구독당 최대 20개), 환불 및 구독 lifecycle 이벤트를 위한 신규 고객 알림 이메일 7종, 성공률을 2–3% 높인 체크아웃 결제 페이지 전면 개편, live preview 및 autosave를 지원하는 product form 재작업, Business Settings redesign

## 새로운 기능

### 1. **중첩 할인 코드**

체크아웃 세션, 결제, 구독 및 요금제 변경은 이제 `discount_codes` 배열을 통해 **요청당 최대 20개 할인 코드**를 수용합니다. 코드는 **배열 순서대로** 적용됩니다 — 첫 번째 유효한 코드는 기본 가격을 줄이고, 두 번째 코드는 이미 할인된 가격을 줄이는 식입니다 — 특별한 조합 코드를 생성하지 않고도 캠페인을 중첩할 수 있습니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/stacked-discounts.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=7a2606d7027de6e662cf9be6b7df8213" alt="여러 개의 중첩 할인 코드가 있는 플랜 변경 확인 대화상자" style={{ maxHeight: '500px', width: 'auto' }} width="1132" height="1023" data-path="images/changelog/v1.99.0/stacked-discounts.png" />
</Frame>

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_abc', quantity: 1 }],
  discount_codes: ['WELCOME10', 'BLACKFRIDAY20'], // applied in this order
  customer: { email: 'user@example.com' },
  return_url: 'https://yoursite.com/return'
});
```

**적용 위치**

| 표면      | 필드               | 최대 코드 |
| ------- | ---------------- | ----- |
| 체크아웃 세션 | `discount_codes` | 20    |
| 결제      | `discount_codes` | 20    |
| 구독      | `discount_codes` | 20    |
| 요금제 변경  | `discount_codes` | 20    |

**요금제 변경 동작**

| `discount_codes` 값          | 효과                           |
| --------------------------- | ---------------------------- |
| 제공되지 않음                     | 새로운 제품에 적용할 수 있는 기존 할인은 유지됨  |
| `[]` (빈 배열)                 | 구독에서 모든 기존 할인 제거             |
| `['CODE_A', 'CODE_B', ...]` | 배열 순서로 적용되는 중첩 세트로 기존 할인을 대체 |

**응답 형태**

적용된 할인 전체 세트는 결제 및 구독에서 `discounts` 배열에 반환됩니다 — 각 항목에는 `discount_id`, `position` 및 `cycles_remaining` (구독의 경우)가 포함됩니다. 단일 필드 `discount_id`는 더 이상 사용되지 않지만 하위 호환성을 위해 여전히 존재합니다.

<Info>
  단일 필드 `discount_code`는 **더 이상 사용되지 않지만** 여전히 완전히 지원됩니다 — 기존 통합은 변화 없이 계속 작동합니다. 같은 요청에서 `discount_codes`와 결합할 수 없습니다. 스택을 쌓고 더 풍부한 응답 형태를 활용하기 위해 가능한 한 `discount_codes`로 마이그레이션할 것을 권장합니다.
</Info>

자세히 알아보기: [Discount Codes](/features/discount-codes) | [Checkout Session](/developer-resources/checkout-session) | [Plan Changes](/developer-resources/subscription-upgrade-downgrade)

### 2. **7개의 새로운 고객 알림 이메일**

이제 7개의 새로운 거래 이메일이 자동으로 고객에게 발송되며, 환불 확인, 구독 수명 주기 마일스톤 및 결제 실패를 다룹니다. 각 이메일은 **설정 → 커뮤니케이션**의 **고객 이메일** 섹션에서 독립적으로 전환할 수 있습니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/customer-notification-emails.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=44cad42723269d9728a9dae2a061613b" alt="각 알림 이메일에 대한 전환이 있는 고객 이메일 설정 패널" style={{ maxHeight: '500px', width: 'auto' }} width="1694" height="1020" data-path="images/changelog/v1.99.0/customer-notification-emails.png" />
</Frame>

**옵트인 (기본적으로 활성화됨)**

| 이메일                     | 실행 시점                          |
| ----------------------- | ------------------------------ |
| **환불 성공**               | 환불이 성공적으로 처리되고 고객에게 자금이 반환됨    |
| **구독 체험 종료**            | 체험이 만료되기 전 약 2일 전 첫 번째 청구가 발생함 |
| **즉시 취소된 구독**           | 구독이 즉시 취소됨                     |
| **다음 청구 날짜에 취소 예정인 구독** | 현재 청구 기간 종료 시점에 구독이 취소 예정      |

**옵트아웃 (기본적으로 비활성화됨)**

| 이메일            | 실행 시점                                                |
| -------------- | ---------------------------------------------------- |
| **결제 실패**      | 결제 시도가 실패함 — Dodo Payments가 직접 고객에게 알리기를 원하면 활성화     |
| **구독 갱신 실패**   | 구독 갱신 결제가 실패할 경우 특정 발생; 일반 결제 실패 이메일 대신 (추가로 아님) 실행됨 |
| **다가오는 갱신 알림** | 약 2일 전에 구독이 갱신됨                                      |

<Tip>
  웹훅을 통해 고객 통신을 직접 관리하는 경우, 동일한 이벤트에 대한 중복 알림을 피하기 위해 옵트아웃 이메일을 비활성화 상태로 유지하세요.
</Tip>

<Note>
  고객 이메일은 팀에 발송되는 알림 이메일과 별개입니다. 고객 이메일을 비활성화해도 동일한 이벤트에 대한 팀의 알림에는 영향을 미치지 않습니다.
</Note>

자세히 알아보기: [Communication Preferences](/features/communication-preferences)

## 개선 사항

### 3. **체크아웃 결제 페이지 전면 개편**

체크아웃의 결제 페이지를 처음부터 끝까지 대폭 재작업했습니다. 레이아웃을 더 간결하게 다듬고, 체감 로딩 속도를 높였으며, validation 상태를 더 명확하게 표시하고, 카드 입력 UX를 개선했습니다. 이러한 변경 사항을 종합한 결과, 전 세계 트래픽에서 **관측된 체크아웃 성공률이 약 2–3% 향상**되었습니다.

<div style={{ display: 'flex', gap: '16px', alignItems: 'flex-start', flexWrap: 'wrap' }}>
  <div style={{ flex: '1 1 280px', minWidth: '260px' }}>
    <Frame caption="Before">
      <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/checkout-payment-before.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=cd86eb287a4688e14bb01e836382744f" alt="Previous checkout payment page" width="509" height="695" data-path="images/changelog/v1.99.0/checkout-payment-before.png" />
    </Frame>
  </div>

  <div style={{ flex: '1 1 280px', minWidth: '260px' }}>
    <Frame caption="After">
      <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/checkout-payment-after.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=4eb10926ab5a1a1c97ab4cbf16e78fb2" alt="Redesigned checkout payment page" width="1114" height="1612" data-path="images/changelog/v1.99.0/checkout-payment-after.png" />
    </Frame>
  </div>
</div>

변경 사항:

* **더 원활해진 필드 상호작용** — 카드 form에서 autofocus, 더 효율적인 tab order, 향상된 keyboard navigation을 지원합니다.
* **더 명확해진 오류 및 로딩 상태** — 이전의 전체 form 오류 배너 방식 대신, 고객이 조치를 취해야 하는 정확한 위치에 inline validation이 표시됩니다.
* **더 빠른 화면 렌더링** — skeleton과 progressive hydration을 적용해 느린 네트워크에서 잠시 빈 화면이 깜박이는 현상을 제거했습니다.
* **모바일 완성도 향상** — 이제 대부분의 트래픽이 발생하는 모바일 체크아웃에 맞춰 tap target, 스크롤 동작, keyboard handling을 조정했습니다.

<Tip>
  통합 변경은 필요하지 않습니다. 기존 체크아웃 세션에 새 결제 페이지가 자동으로 적용됩니다.
</Tip>

### 4. **Product Form 재작업**

Product **생성**, **편집**, **복제** flow를 하나의 일관된 form experience를 중심으로 처음부터 다시 구축했습니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/product-form.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=12693e04457400a4aa33063ef0d73221" alt="Unified product form with Basic Details, Media & Description, Pricing, and a live checkout preview side-by-side" style={{ maxHeight: '500px', width: 'auto' }} width="1143" height="959" data-path="images/changelog/v1.99.0/product-form.png" />
</Frame>

주요 내용:

* **Live preview** — 편집하는 동안 form 옆에서 product가 체크아웃 및 Customer Portal에 어떻게 표시되는지 확인할 수 있습니다.
* **Autosave** — draft가 자동으로 저장되므로 페이지를 벗어나거나 tab을 잃어도 작업 내용이 더 이상 사라지지 않습니다.
* **Markdown editor** — 이제 product description에서 live rendering, link preview, inline formatting control을 지원하는 full markdown editor를 사용할 수 있습니다.
* **Duplicate flow parity** — product를 복제하면 간소화된 dialog 대신 동일한 unified form이 미리 채워진 상태로 열립니다. 따라서 복사본을 저장하기 전에 모든 field를 조정할 수 있습니다.

<Tip>
  **Duplicate**를 사용하면 description, metadata 또는 fulfilment configuration을 다시 입력하지 않고도 기존 product의 regional 또는 pricing-tier variant를 만들 수 있습니다.
</Tip>

### 5. **Business Settings 페이지 redesign**

**Settings → Business** 페이지를 재설계하여 configuration을 더 쉽게 훑어보고 빠르게 업데이트할 수 있도록 했습니다. 이제 설정이 더 명확한 섹션으로 그룹화되며, 각 toggle을 전환하기 전에 그 영향 범위를 설명하는 안내 문구가 표시됩니다.

기존 설정의 **동작 변경은 없습니다**. 레이아웃, 그룹화 및 관련 설명만 개선되었습니다.

<Frame>
  <img src="https://mintcdn.com/dodopayments/Ehnri26kKx69Tfxe/images/changelog/v1.99.0/business-settings.png?fit=max&auto=format&n=Ehnri26kKx69Tfxe&q=85&s=7603e02f67bb05a590681400f1e3f4b5" alt="Redesigned Business Settings page with grouped sections for Business Info, Brands, currency, security, and tracking" style={{ maxHeight: '500px', width: 'auto' }} width="1195" height="893" data-path="images/changelog/v1.99.0/business-settings.png" />
</Frame>

## 개선 사항

* **`credits_amount` override가 GET checkout session 및 payment link route에 올바르게 전파됨** — per-checkout `credit_entitlements` override를 사용해 checkout session 또는 payment link를 생성한 경우, GET을 통해 해당 session 또는 link를 조회하면 override된 값이 아닌 product-level 기본 `credits_amount`이 반환되었습니다. 이제 이 문제가 해결되었습니다.
* **전액 환불된 payment의 Refund action 비활성화** — payment가 전액 환불되면 해당 payment의 Refund 버튼이 비활성화되고, 그 이유를 설명하는 tooltip이 표시됩니다. 이전에는 버튼이 계속 활성화되어 있었으며 제출 후에야 오류가 반환되었습니다.
* 플랫폼 전반의 사소한 버그 수정 및 안정성 개선
