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

> Mã giảm giá nay hỗ trợ giảm theo số tiền, lên lịch, quy tắc điều kiện khách hàng và tùy chọn theo từng loại tiền tệ, cùng với trải nghiệm webhooks native được xây dựng lại và cảnh báo qua email — ngoài ra còn có Cash App Pay cho các gói đăng ký, SEPA Direct Debit cho các khoản thanh toán EUR một lần, thông báo lỗi thanh toán dễ hiểu hơn cho khách hàng, payout webhooks, thay đổi email đăng nhập tự phục vụ, cài đặt cho phép khách hàng tự hủy gói đăng ký và bộ lọc tiền tệ trên danh sách payments.

## Tính năng mới

### 1. **Mã giảm giá: Giảm theo số tiền, lên lịch và quy tắc điều kiện**

Mã giảm giá không còn chỉ hỗ trợ theo phần trăm. Giờ đây, một mã có thể trừ một số tiền cố định, bắt đầu theo lịch, có mức giá khác nhau theo từng loại tiền tệ và giới hạn đối tượng được phép sử dụng.

**Giảm theo số tiền**

Đặt `type` thành `flat` để trừ một số tiền cố định thay vì một phần trăm. Khoản giảm được phân bổ trên toàn bộ giỏ hàng thay vì áp dụng cho từng mục hàng.

| Loại      | Giá trị API  | Cách hoạt động                                                  |
| --------- | ------------ | --------------------------------------------------------------- |
| Phần trăm | `percentage` | Giảm giá theo phần trăm, có thể giới hạn theo từng loại tiền tệ |
| Số tiền   | `flat`       | Trừ một số tiền cố định, phân bổ trên toàn bộ giỏ hàng          |

<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="Trình chỉnh sửa mã giảm giá với loại Số tiền được chọn, hiển thị khoản giảm cố định 500 INR" style={{ maxHeight: '500px', width: 'auto' }} width="3474" height="1968" data-path="images/discount-codes/discount-flat-discount-option.png" />
</Frame>

**Tùy chọn theo từng loại tiền tệ**

`currency_options` cho phép một mã hoạt động chính xác trên mọi loại tiền tệ bạn bán. Mỗi mục thiết lập cho một loại tiền tệ duy nhất mức giảm tối đa (bản thân khoản trừ đối với mã Số tiền, mức giới hạn đối với mã Phần trăm) và giá trị giỏ hàng tối thiểu. Mã giảm theo số tiền yêu cầu ít nhất một tùy chọn tiền tệ có giá trị mặc định có thể xác định; tùy chọn tiền tệ vẫn là không bắt buộc đối với mã giảm theo phần trăm.

**Điều kiện khách hàng**

`customer_eligibility` kiểm soát những ai được phép sử dụng mã:

| Giá trị      | Ai có thể sử dụng                                            |
| ------------ | ------------------------------------------------------------ |
| `any`        | Bất kỳ khách hàng nào. Đây là mặc định.                      |
| `first_time` | Khách hàng chưa từng mua hàng của bạn.                       |
| `existing`   | Khách hàng đã từng mua hàng của bạn.                         |
| `specific`   | Chỉ những khách hàng bạn thêm vào danh sách cho phép của mã. |

<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="Menu thả xuống về điều kiện khách hàng, hiển thị các tùy chọn Bất kỳ, Lần đầu, Hiện tại và Khách hàng cụ thể" style={{ maxHeight: '500px', width: 'auto' }} width="2832" height="830" data-path="images/discount-codes/discount-restriction.png" />
</Frame>

Quản lý danh sách cho phép từ dashboard hoặc bằng các endpoint mới: `GET /discounts/{discount_id}/customers` để liệt kê các khách hàng được liên kết, `POST /discounts/{discount_id}/customers` để liên kết họ và `DELETE /discounts/{discount_id}/customers/{customer_id}` để hủy liên kết một khách hàng.

<Warning>
  Mã `specific` bắt đầu với **không có** khách hàng đủ điều kiện và từ chối mọi lần sử dụng cho đến khi bạn liên kết khách hàng với mã đó.
</Warning>

**Lên lịch và giới hạn theo từng khách hàng**

Đặt `starts_at` để lên lịch phát hành mã trong tương lai — để trống sẽ giữ mã hoạt động ngay lập tức và giá trị này phải sớm hơn `expires_at` một cách nghiêm ngặt. Sử dụng `per_customer_usage_limit` để giới hạn số lần một khách hàng có thể sử dụng mã, đây là giới hạn riêng và không được vượt quá `usage_limit` tổng thể.

<Info>
  Giá trị giỏ hàng tối thiểu luôn được tính dựa trên giá gốc của giỏ hàng, không dựa trên tổng tạm tính giữa chừng trong một chuỗi áp dụng mã. Vì vậy, thứ tự áp dụng mã không bao giờ thay đổi việc có đạt mức tối thiểu hay không.
</Info>

Tìm hiểu thêm: [Discounts](/features/discount-codes) | [Create Discount](/api-reference/discounts/create-discount)

### 2. **Trải nghiệm Webhooks được xây dựng lại**

Phần webhooks trong dashboard đã được xây dựng lại thành trải nghiệm native, thay thế portal nhúng. Giờ đây, mọi thứ đều nằm trong dashboard với các bảng, bộ lọc và điều hướng nhất quán, đồng thời hoạt động chính xác trên thiết bị di động.

* **Endpoints** — tạo và chỉnh sửa endpoint trong bảng bên, chọn các loại sự kiện từ cây có thể tìm kiếm và xem nhanh tỷ lệ lỗi trong 24 giờ qua.
* **Hoạt động và nhật ký** — theo dõi các lần thử gửi theo thời gian trên biểu đồ **Hoạt động gửi**, duyệt các message đã gửi và mở trang **chi tiết message** để kiểm tra payload cùng mọi lần thử gửi, bao gồm response code và thời lượng. Bạn có thể replay từng lần thử ngay tại đó.
* **Danh mục sự kiện** — duyệt mọi loại sự kiện mà Dodo Payments gửi, cùng schema và payload mẫu.
* **Tổng quan endpoint** — thống kê gửi trong 24 giờ qua, signing secret để xem hoặc xoay vòng và **Lịch sử replay**.
* **Kiểm thử** — gửi một sự kiện mẫu đến endpoint để xác minh receiver trước khi đưa vào hoạt động.
* **Nâng cao** — giới hạn tốc độ gửi, quản lý custom headers được gửi trong mọi request đến endpoint đó và chỉnh sửa transformation của endpoint.
* **Replay hàng loạt** — trên một endpoint, khôi phục các message không gửi được, replay những message chưa từng được gửi hoặc replay một phạm vi đã lọc.
* **Cảnh báo qua email** — tab **Settings** mới, nơi bạn có thể liệt kê các địa chỉ sẽ nhận email khi việc gửi đến một endpoint bắt đầu thất bại. Phân tách nhiều địa chỉ bằng dấu phẩy và để trống để tắt cảnh báo.

<Info>
  Đây chỉ là thay đổi trên dashboard. Các endpoint, signing secret, xác minh chữ ký, tên sự kiện và payload hiện có của bạn đều không thay đổi — không cần thực hiện công việc tích hợp nào.
</Info>

Tìm hiểu thêm: [Webhooks](/developer-resources/webhooks) | [Webhook Events](/developer-resources/webhooks/intents/webhook-events-guide)

### 3. **Cash App Pay cho các gói đăng ký**

Giờ đây Cash App Pay có thể hỗ trợ một gói đăng ký định kỳ, không chỉ thanh toán một lần. Phương thức này có sẵn trên các checkout tại Hoa Kỳ được tính phí bằng USD, cùng với các tùy chọn thẻ hiện có.

Tìm hiểu thêm: [Digital Wallets](/features/payment-methods/digital-wallets)

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

SEPA Direct Debit hiện có sẵn trên toàn khu vực Eurozone, cho phép khách hàng thanh toán trực tiếp từ tài khoản ngân hàng thay vì sử dụng thẻ. Phương thức này được cung cấp trên checkout EUR cho các khoản thanh toán một lần.

<Warning>
  SEPA Direct Debit không có hiệu lực ngay lập tức. Một khoản thanh toán mất **6 ngày làm việc** để được xác nhận, vì vậy không được xem việc ủy quyền là quyết toán — chỉ thực hiện fulfillment sau khi payment chuyển sang trạng thái succeeded.
</Warning>

Tìm hiểu thêm: [European Payment Methods](/features/payment-methods/europe)

### 5. **Thông báo lỗi thanh toán rõ ràng hơn**

Khi một khoản thanh toán thất bại, bạn và khách hàng giờ đây sẽ thấy nội dung được viết rõ ràng thay vì văn bản thô từ processor. Mỗi lỗi được phân loại qua **46 error code thống nhất**, mỗi mã được ánh xạ cho hai nhóm đối tượng:

* **Bạn** thấy tiêu đề cùng hành động được đề xuất trên payment, để biết nên yêu cầu khách hàng thử lại, liên hệ ngân hàng hay sử dụng thẻ khác. `error_message` trên đối tượng Payment giờ đây chứa nội dung này bất cứ khi nào `error_code` là một mã thống nhất được nhận diện.
* **Khách hàng của bạn** thấy phần giải thích bằng ngôn ngữ đơn giản trên màn hình lỗi checkout, trong Customer Portal và trong email dunning — ví dụ: *"Mã bảo mật của thẻ (CVC) có vẻ không chính xác. Vui lòng nhập lại và thử lần nữa."*

<Warning>
  Đối với các khoản từ chối nhạy cảm về gian lận — `FRAUDULENT`, `LOST_CARD`, `STOLEN_CARD` và `PICKUP_CARD` — khách hàng luôn thấy một thông báo chung để lý do thực sự không bị tiết lộ. Bạn vẫn thấy lý do thật, kèm cảnh báo không được chia sẻ lý do đó.
</Warning>

Tìm hiểu thêm: [Transaction Failures](/api-reference/transaction-failures) | [Payments](/features/transactions/payments) | [Get Payment Detail](/api-reference/payments/get-payments-1)

### 6. **Cho phép khách hàng tự hủy gói đăng ký**

**Allow Subscription Cancellation** giờ đây là một cài đặt chính thức trong tab **Subscriptions** của phần cài đặt dashboard và được thực thi xuyên suốt. Khi tắt cài đặt này, Customer Portal sẽ vô hiệu hóa nút hủy và API từ chối yêu cầu hủy do khách hàng khởi tạo với một `403` — áp dụng cho cả luồng hủy ngay lập tức và luồng "hủy vào ngày thanh toán tiếp theo". Trước đây, cài đặt này chỉ ẩn nút, vì vậy khách hàng vẫn có thể hủy qua API nếu cố ý thực hiện.

Cài đặt này được **bật theo mặc định**. Các lần hủy của chính bạn qua merchant API và dashboard không bị ảnh hưởng, đồng thời khách hàng luôn có thể thu hồi một yêu cầu hủy mà họ đã lên lịch.

Tìm hiểu thêm: [Customer Portal](/features/customer-portal) | [Subscriptions](/features/subscription)

### 7. **Payout Webhooks**

Giờ đây bạn nhận được webhooks cho các khoản payout của chính mình, nhờ đó có thể đối soát trong hệ thống kế toán mà không cần polling.

| Sự kiện              | Kích hoạt khi                                                      |
| -------------------- | ------------------------------------------------------------------ |
| `payout.created`     | Một payout được tạo, bởi chu kỳ payout tự động hoặc ngoài chu kỳ   |
| `payout.in_progress` | Đến hạn payout và quá trình xử lý bắt đầu                          |
| `payout.on_hold`     | Payout bị tạm dừng hoặc được đưa vào diện xem xét                  |
| `payout.success`     | Payout đến tài khoản ngân hàng của bạn được quyết toán             |
| `payout.failed`      | Payout thất bại, số tiền và phí được ghi có trở lại wallet của bạn |

<Note>
  `payout.created` trước đây được phát ra dưới dạng `payout.not_initiated`. Nếu một endpoint hiện có lọc theo `payout.not_initiated`, hãy cập nhật bộ lọc thành `payout.created` để tiếp tục khớp. Trường `status` trong payload vẫn báo cáo `not_initiated` ở giai đoạn này.
</Note>

Tìm hiểu thêm: [Payout Webhooks](/developer-resources/webhooks/intents/payout) | [Payouts Process](/features/payouts/payout-structure)

### 8. **Thay đổi email đăng nhập từ dashboard**

Giờ đây bạn có thể thay đổi địa chỉ email dùng để đăng nhập mà không cần liên hệ bộ phận hỗ trợ. Tab Account đã được thiết kế lại và có thêm phần **Change Email**, với nút **Change email** để bắt đầu quy trình.

Quy trình xác minh gồm hai bước: chúng tôi gửi một mã đến địa chỉ **hiện tại** để xác nhận đó là bạn, sau đó gửi mã thứ hai đến địa chỉ **mới** để xác nhận bạn kiểm soát địa chỉ đó. Sau khi cả hai địa chỉ được xác minh:

* Từ đó, đăng nhập bằng địa chỉ mới. Địa chỉ cũ sẽ không còn hoạt động với mật khẩu, magic link và mã được gửi qua email.
* Mọi identity provider được liên kết, chẳng hạn như đăng nhập Google hoặc GitHub, sẽ bị hủy liên kết và phải được kết nối lại.
* Mật khẩu, businesses, quyền truy cập team và trạng thái xác minh của bạn không thay đổi.
* Một thông báo sẽ được gửi đến địa chỉ cũ để một thay đổi bất ngờ không bao giờ diễn ra trong im lặng.

Tìm hiểu thêm: [My Account](/miscellaneous/accounts)

### 9. **Analytics: Widget mới và các tinh chỉnh**

Dựa trên bản xây dựng lại của Analytics v3, bản phát hành này bổ sung các hình ảnh trực quan mới và cải thiện những hình ảnh hiện có.

* **Doanh thu theo quốc gia giờ đây là bản đồ choropleth toàn chiều rộng**, với danh sách quốc gia được xếp hạng bên cạnh; card này cũng có thể chia sẻ như các card khác.
* **Biểu đồ xu hướng được vẽ lại** với crosshair khi di chuột, pill ngày cuộn trên trục x và tooltip nhỏ gọn.
* **Preset ngày mới** — **Last 30 days** thay thế Last 4 weeks và **Last 6 months** được thêm vào danh sách.
* **Bộ lọc của bạn được duy trì.** Preset ngày và chế độ so sánh giờ đây được lưu theo từng business và đồng bộ trên các thiết bị, thay vì đặt lại về mặc định trong mỗi phiên.
* **Khách hàng hàng đầu được xác định theo tên**, nếu không có thì dùng email.
* Doanh thu theo quốc gia giờ đây trả về tối đa **150 quốc gia hàng đầu**.

Tìm hiểu thêm: [Dashboard Analytics](/features/analytics-and-reporting)

## Cải tiến và sửa lỗi

### 10. **Lọc Payments theo tiền tệ**

`GET /payments` chấp nhận query parameter **`currency`** tùy chọn, nhờ đó bạn chỉ có thể liệt kê các payments được quyết toán bằng một loại tiền tệ cụ thể — ví dụ `GET /payments?currency=EUR`. Bộ lọc tương tự cũng có trên bảng Payments trong dashboard.

Tìm hiểu thêm: [List Payments](/api-reference/payments/get-payments)

### 11. **Kéo dài thời hạn phản hồi tranh chấp lên 10 ngày**

Giờ đây bạn có **10 ngày** để phản hồi tranh chấp sau khi tranh chấp được tạo, tăng từ 4 ngày. Đồng hồ đếm ngược trên tranh chấp trong dashboard và thời hạn phản hồi do API trả về đều phản ánh khoảng thời gian dài hơn.

Tìm hiểu thêm: [Disputes](/features/transactions/disputes)

### 12. **Biểu mẫu tài khoản ngân hàng nhận payout rõ ràng hơn**

Việc thêm tài khoản ngân hàng nhận payout giờ đây ít gây nhầm lẫn hơn. Nhãn trường, mô tả và tooltip tự động điều chỉnh theo loại hình business, nhờ đó tên chủ tài khoản và tên người thụ hưởng không còn hiển thị như các mục trùng lặp đối với doanh nghiệp tư nhân. Khi chọn **Other** làm ngân hàng, bạn có thể tự do nhập tên; mã ngân hàng nội địa Trung Quốc được gắn nhãn là **CNAPS**; và trang payouts vẫn hiển thị trong chế độ test để bạn có thể truy cập các tài khoản đã liên kết từ cả hai chế độ.

Tìm hiểu thêm: [Payouts Process](/features/payouts/payout-structure)

### Các bản sửa lỗi và cải tiến khác

* **Credit do thay đổi plan được hoàn lại khi payment thất bại.** Credit proration được cấp trong lúc thay đổi plan đăng ký không còn bị giữ lại nếu payment phát sinh không thành công.
* **Invoice của trial có tính phí hiển thị khoản phí trial**, không phải mức giá định kỳ thông thường.
* **Giảm giá theo phần trăm tuân thủ giá trị giỏ hàng tối thiểu**, được tính theo giá cơ sở thay vì tổng tạm tính; timeout khóa giảm giá giờ đây trả về một error code riêng thay vì `503` chung.
* **Xóa payment method đã bị xóa trước đó giờ đây thành công** thay vì trả về lỗi, giúp request có tính idempotent an toàn.
* **Đã sửa loại tiền tệ được sử dụng cho mức sàn mandate tại Ấn Độ** khi cập nhật payment method của subscription.
* **Các mục trong credit ledger vượt quá giới hạn cho phép** bị từ chối với một `400` có kiểu rõ ràng thay vì thất bại ở giai đoạn sau.
* **Sản phẩm Pay-what-you-want hỗ trợ số tiền cố định** trong shared checkout links và entitlement ID được hiển thị trong panel chi tiết entitlement.
* Các bản sửa lỗi Analytics: chuỗi lifetime value, add-on được tính trong MRR, không so sánh kỳ trên các phạm vi all-time, chuỗi dừng ở bucket hiện tại và nhãn phạm vi cũng như so sánh rõ ràng hơn.
* Các bản sửa lỗi nhỏ và cải thiện độ ổn định trên toàn platform.
