> ## 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 (25 tháng 5, 2026)

> Mã giảm giá được áp dụng cộng dồn (tối đa 20 mã cho mỗi checkout, payment hoặc subscription), bảy email thông báo khách hàng mới cho các sự kiện hoàn tiền và vòng đời subscription, cải tổ trang payment của checkout giúp tăng tỷ lệ thành công thêm 2–3%, cải tiến product form với bản xem trước trực tiếp và tính năng tự động lưu, cùng với thiết kế lại Business Settings

## Tính năng mới

### 1. **Mã Giảm Giá Xếp Chồng**

Các phiên thanh toán, thanh toán, đăng ký và thay đổi gói giờ đây chấp nhận **tối đa 20 mã giảm giá trong một yêu cầu duy nhất** thông qua mảng `discount_codes`. Mã được áp dụng **theo thứ tự trong mảng** — mã đầu tiên đủ điều kiện giảm giá cơ bản, mã thứ hai giảm giá đã được giảm, và cứ tiếp tục như vậy — vì vậy bạn có thể xếp lớp các chiến dịch mà không cần tạo mã kết hợp riêng biệt.

<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="Xác nhận thay đổi gói với nhiều mã giảm giá xếp chồng" 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'
});
```

**Nơi áp dụng**

| Bề mặt           | Trường           | Tối đa mã |
| ---------------- | ---------------- | --------- |
| Phiên thanh toán | `discount_codes` | 20        |
| Thanh toán       | `discount_codes` | 20        |
| Đăng ký          | `discount_codes` | 20        |
| Thay đổi gói     | `discount_codes` | 20        |

**Hành vi thay đổi gói**

| Giá trị `discount_codes`    | Hiệu quả                                                                                 |
| --------------------------- | ---------------------------------------------------------------------------------------- |
| Không cung cấp              | Giữ các giảm giá hiện có với `preserve_on_plan_change=true` nếu áp dụng cho sản phẩm mới |
| `[]` (mảng rỗng)            | Tất cả các giảm giá hiện có bị loại bỏ khỏi đăng ký                                      |
| `['CODE_A', 'CODE_B', ...]` | Thay thế bất kỳ giảm giá hiện có bằng bộ xếp chồng này, áp dụng theo thứ tự trong mảng   |

**Dạng phản hồi**

Toàn bộ bộ giảm giá được áp dụng được trả về dưới mảng `discounts` trên các thanh toán và đăng ký — mỗi mục bao gồm `discount_id`, `position`, và `cycles_remaining` (cho đăng ký). Trường `discount_id` đơn lẻ đời cũ bị bỏ đi nhưng vẫn có mặt để tương thích ngược.

<Info>
  Trường `discount_code` đơn lẻ **bị loại bỏ** nhưng vẫn được hỗ trợ hoàn toàn — các tích hợp hiện tại vẫn hoạt động mà không cần thay đổi. Không thể kết hợp với `discount_codes` trong cùng một yêu cầu. Chúng tôi khuyến nghị chuyển sang `discount_codes` khi tiện, ngay cả đối với mã đơn, để tận dụng khả năng xếp chồng và dạng phản hồi phong phú hơn.
</Info>

Tìm hiểu thêm: [Mã Giảm Giá](/features/discount-codes) | [Phiên Thanh Toán](/developer-resources/checkout-session) | [Thay Đổi Gói](/developer-resources/subscription-upgrade-downgrade)

### 2. **Bảy Email Thông Báo Khách Hàng Mới**

Bảy email giao dịch mới hiện được gửi tự động cho khách hàng của bạn, bao gồm xác nhận hoàn tiền, các mốc vòng đời đăng ký và lỗi thanh toán. Mỗi email có thể được tắt riêng từ **Cài đặt → Giao tiếp** dưới phần **Email Khách Hàng**.

<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="Bảng cài đặt Email Khách Hàng với công tắc bật/tắt cho mỗi email thông báo" style={{ maxHeight: '500px', width: 'auto' }} width="1694" height="1020" data-path="images/changelog/v1.99.0/customer-notification-emails.png" />
</Frame>

**Tùy chọn (bật theo mặc định)**

| Email                                             | Khi nào kích hoạt                                                    |
| ------------------------------------------------- | -------------------------------------------------------------------- |
| **Hoàn Tiền Thành Công**                          | Hoàn tiền được xử lý thành công và tiền đang quay lại cho khách hàng |
| **Thời Gian Dùng Thử Kết Thúc**                   | \~2 ngày trước khi thử nghiệm hết hạn và bắt đầu tính phí đầu tiên   |
| **Hủy Đăng Ký Ngay Lập Tức**                      | Đăng ký bị hủy với hiệu lực ngay lập tức                             |
| **Đặt Hủy Đăng Ký Vào Ngày Thanh Toán Tiếp Theo** | Đăng ký được đặt để hủy vào cuối kỳ thanh toán hiện tại              |

**Tùy chọn (tắt theo mặc định)**

| Email                        | Khi nào kích hoạt                                                                                                                  |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Thanh Toán Thất Bại**      | Nỗ lực thanh toán thất bại — bật nếu bạn muốn Dodo Payments thông báo trực tiếp cho khách hàng thay vì xử lý trên hệ thống của bạn |
| **Gia Hạn Đăng Ký Thất Bại** | Thanh toán gia hạn đăng ký thất bại; kích hoạt thay cho (không bổ sung vào) email Thanh Toán Thất Bại cho thanh toán gia hạn       |
| **Nhắc Gia Hạn Sắp Tới**     | \~2 ngày trước khi gia hạn đăng ký                                                                                                 |

<Tip>
  Nếu bạn tự quản lý giao tiếp khách hàng qua webhooks, hãy để các email tùy chọn tắt để tránh gửi thông báo trùng lặp cho cùng một sự kiện.
</Tip>

<Note>
  Email khách hàng riêng biệt với các email thông báo gửi cho đội ngũ của bạn. Việc tắt một email khách hàng không ảnh hưởng đến thông báo cho đội ngũ của bạn về cùng một sự kiện.
</Note>

Tìm hiểu thêm: [Tùy chọn Giao tiếp](/features/communication-preferences)

## Cải tiến

### 3. **Cải tổ trang Payment của Checkout**

Trang payment trong checkout đã được cải tiến toàn diện — bố cục gọn gàng hơn, thời gian tải cảm nhận nhanh hơn, trạng thái validation rõ ràng hơn và UX nhập thông tin thẻ được tinh chỉnh. Nhìn chung, những thay đổi này đã giúp **tăng tỷ lệ checkout thành công quan sát được khoảng 2–3%** trên toàn bộ lưu lượng toàn cầu.

<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>

Các thay đổi:

* **Tương tác với trường mượt mà hơn** — tự động focus, thứ tự tab thông minh hơn và khả năng điều hướng bằng bàn phím được cải thiện trên biểu mẫu thẻ
* **Trạng thái lỗi và tải rõ ràng hơn** — validation nội tuyến được hiển thị chính xác tại nơi khách hàng cần thao tác, thay thế kiểu banner lỗi trên toàn bộ form trước đây
* **Hiển thị nhanh hơn** — skeleton và progressive hydration loại bỏ hiện tượng nhấp nháy trạng thái trống trong thời gian ngắn trên mạng chậm
* **Tối ưu trên mobile** — vùng chạm, hành vi cuộn và cách xử lý bàn phím được tinh chỉnh riêng cho checkout trên mobile, nơi hiện chiếm phần lớn lưu lượng

<Tip>
  Không cần thay đổi integration. Các checkout session hiện có sẽ tự động sử dụng trang payment mới.
</Tip>

### 4. **Cải tiến Product Form**

Các flow **create**, **edit** và **duplicate** product đã được xây dựng lại hoàn toàn dựa trên một trải nghiệm form nhất quán.

<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>

Điểm nổi bật:

* **Bản xem trước trực tiếp** — xem product của bạn hiển thị như thế nào trên checkout và Customer Portal trong khi chỉnh sửa, hiển thị song song với form
* **Tự động lưu** — bản nháp được lưu tự động, vì vậy việc rời khỏi trang hoặc mất tab không còn khiến bạn mất công việc đang thực hiện
* **Trình chỉnh sửa Markdown** — phần mô tả product hiện hỗ trợ trình chỉnh sửa markdown đầy đủ với khả năng hiển thị trực tiếp, xem trước liên kết và các điều khiển định dạng nội tuyến
* **Tương đương trong flow duplicate** — khi duplicate product, form thống nhất tương tự sẽ mở ra với các trường được điền sẵn, thay vì một dialog rút gọn, để bạn có thể điều chỉnh mọi trường trước khi lưu bản sao

<Tip>
  Sử dụng **Duplicate** để nhanh chóng tạo các biến thể theo khu vực hoặc cấp giá của một product hiện có mà không cần nhập lại mô tả, metadata hoặc cấu hình fulfilment.
</Tip>

### 5. **Thiết kế lại trang Business Settings**

Trang **Settings → Business** đã được thiết kế lại để việc xem nhanh cấu hình và cập nhật trở nên dễ dàng hơn. Các setting hiện được nhóm thành những phần rõ ràng hơn, kèm theo nội dung giải thích tác động của từng toggle trước khi bạn bật hoặc tắt.

**Không có thay đổi về hành vi** đối với các setting hiện có — chỉ bố cục, cách nhóm và phần giải thích xung quanh được cải thiện.

<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>

## Cải tiến

* **Giá trị override của `credits_amount` hiện được truyền chính xác đến các route GET checkout session và payment link** — khi checkout session hoặc payment link được tạo với override `credit_entitlements` riêng cho checkout, việc lấy session hoặc link đó qua GET trước đây trả về giá trị mặc định `credits_amount` ở cấp product thay vì giá trị đã override. Lỗi này hiện đã được khắc phục.
* **Vô hiệu hóa thao tác hoàn tiền đối với payment đã được hoàn tiền toàn bộ** — nút Refund trên payment hiện bị vô hiệu hóa sau khi payment được hoàn tiền toàn bộ, kèm tooltip giải thích lý do. Trước đây, nút này vẫn hoạt động và chỉ trả về lỗi sau khi gửi.
* Các bản sửa lỗi nhỏ và cải thiện độ ổn định trên toàn platform
