> ## 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 Mei 2026)

> Kode diskon bertumpuk (hingga 20 per checkout, pembayaran, atau langganan), tujuh email notifikasi pelanggan baru untuk refund dan event siklus langganan, perombakan halaman pembayaran checkout yang meningkatkan tingkat keberhasilan sebesar 2–3%, pengerjaan ulang formulir produk dengan pratinjau langsung dan autosave, serta desain ulang Business Settings

## Fitur Baru

### 1. **Kode Diskon Bertumpuk**

Sesi checkout, pembayaran, langganan, dan perubahan paket sekarang menerima **hingga 20 kode diskon dalam satu permintaan** melalui array `discount_codes`. Kode diterapkan **sesuai urutan array** — kode yang memenuhi syarat pertama kali mengurangi harga dasar, yang kedua mengurangi harga yang sudah di-diskon, dan seterusnya — sehingga Anda dapat melapisi kampanye tanpa membuat kode gabungan khusus.

<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="Dialog Konfirmasi Perubahan Paket dengan beberapa kode diskon bertumpuk" 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'
});
```

**Di mana itu berlaku**

| Permukaan       | Kolom            | Maksimal kode |
| --------------- | ---------------- | ------------- |
| Sesi Checkout   | `discount_codes` | 20            |
| Pembayaran      | `discount_codes` | 20            |
| Langganan       | `discount_codes` | 20            |
| Perubahan Paket | `discount_codes` | 20            |

**Perilaku perubahan paket**

| Nilai `discount_codes`      | Efek                                                                                          |
| --------------------------- | --------------------------------------------------------------------------------------------- |
| Tidak disediakan            | Diskon yang ada dengan `preserve_on_plan_change=true` tetap ada jika berlaku pada produk baru |
| `[]` (array kosong)         | Semua diskon yang ada dihapus dari langganan                                                  |
| `['CODE_A', 'CODE_B', ...]` | Menggantikan diskon yang ada dengan set bertumpuk ini, diterapkan sesuai urutan array         |

**Bentuk respons**

Set lengkap diskon yang diterapkan dikembalikan di bawah array `discounts` pada pembayaran dan langganan — setiap entri termasuk `discount_id`, `position`, dan `cycles_remaining` (untuk langganan). Kolom tunggal `discount_id` yang lama telah dihentikan tetapi masih ada untuk kompatibilitas mundur.

<Info>
  Kolom tunggal `discount_code` **dihentikan** tetapi masih sepenuhnya didukung — integrasi yang ada terus berfungsi tanpa perubahan. Tidak dapat digabungkan dengan `discount_codes` dalam permintaan yang sama. Kami menyarankan untuk bermigrasi ke `discount_codes` saat nyaman, bahkan untuk satu kode, untuk memanfaatkan penumpukan dan bentuk respons yang lebih kaya.
</Info>

Pelajari lebih lanjut: [Kode Diskon](/features/discount-codes) | [Sesi Checkout](/developer-resources/checkout-session) | [Perubahan Paket](/developer-resources/subscription-upgrade-downgrade)

### 2. **Tujuh Email Notifikasi Pelanggan Baru**

Tujuh email transaksi baru sekarang dikirimkan kepada pelanggan Anda secara otomatis, mencakup konfirmasi pengembalian dana, tonggak siklus hidup langganan, dan kegagalan pembayaran. Setiap email dapat diaktifkan secara independen dari **Pengaturan → Komunikasi** di bawah bagian **Email Pelanggan**.

<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="Panel pengaturan Email Pelanggan dengan toggle untuk setiap email notifikasi" style={{ maxHeight: '500px', width: 'auto' }} width="1694" height="1020" data-path="images/changelog/v1.99.0/customer-notification-emails.png" />
</Frame>

**Opt-in (diaktifkan secara default)**

| Email                                                                       | Kapan dipicu                                                                              |
| --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| **Pengembalian Dana Berhasil**                                              | Sebuah pengembalian dana berhasil diproses dan dana dalam perjalanan kembali ke pelanggan |
| **Uji coba Berakhirnya Langganan**                                          | \~2 hari sebelum percobaan berakhir dan biaya penagihan pertama terjadi                   |
| **Langganan Dibatalkan Segera**                                             | Sebuah langganan dibatalkan dengan efek langsung                                          |
| **Langganan Ditetapkan untuk Dibatalkan pada Tanggal Penagihan Berikutnya** | Sebuah langganan dijadwalkan untuk dibatalkan di akhir periode penagihan saat ini         |

**Opt-out (dinonaktifkan secara default)**

| Email                               | Kapan dipicu                                                                                                                                                      |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Pembayaran Gagal**                | Sebuah percobaan pembayaran gagal — aktifkan jika Anda menginginkan Dodo Payments memberitahu pelanggan secara langsung daripada menangani di sistem Anda sendiri |
| **Pembaharuan Langganan Gagal**     | Pembayaran pembaharuan langganan gagal secara spesifik; dipicu menggantikan (bukan selain) email Pembayaran Gagal umum untuk pembayaran pembaharuan               |
| **Pengingat Pembaharuan Mendatang** | \~2 hari sebelum langganan diperbarui                                                                                                                             |

<Tip>
  Jika Anda mengelola komunikasi pelanggan sendiri melalui webhooks, biarkan email opt-out dinonaktifkan untuk menghindari pengiriman notifikasi duplikat kepada pelanggan untuk acara yang sama.
</Tip>

<Note>
  Email pelanggan terpisah dari email notifikasi yang dikirim ke tim Anda. Menonaktifkan email pelanggan tidak mempengaruhi notifikasi tim Anda untuk acara yang sama.
</Note>

Pelajari lebih lanjut: [Preferensi Komunikasi](/features/communication-preferences)

## Peningkatan

### 3. **Perombakan Halaman Pembayaran Checkout**

Halaman pembayaran pada checkout telah dikerjakan ulang secara menyeluruh dari awal hingga akhir — tata letak yang lebih ringkas, waktu muat yang dirasakan lebih cepat, status validasi yang lebih jelas, serta UX input kartu yang disempurnakan. Secara keseluruhan, perubahan ini meningkatkan **tingkat keberhasilan checkout yang teramati sekitar 2–3%** di seluruh traffic global.

<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="Halaman pembayaran checkout sebelumnya" 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="Halaman pembayaran checkout yang didesain ulang" width="1114" height="1612" data-path="images/changelog/v1.99.0/checkout-payment-after.png" />
    </Frame>
  </div>
</div>

Yang berubah:

* **Interaksi field yang lebih lancar** — autofocus, urutan tab yang lebih cerdas, dan navigasi keyboard yang lebih baik pada formulir kartu
* **Status error dan loading yang lebih rapi** — validasi inline ditampilkan tepat di tempat pelanggan perlu melakukan tindakan, menggantikan pola banner error seluruh formulir sebelumnya
* **Render yang lebih cepat** — skeleton dan progressive hydration menghilangkan flicker singkat pada kondisi kosong di jaringan lambat
* **Penyempurnaan mobile** — target ketuk, perilaku scroll, dan penanganan keyboard disesuaikan secara khusus untuk checkout mobile, tempat sebagian besar traffic kini berasal

<Tip>
  Tidak diperlukan perubahan integrasi. Checkout sessions yang ada akan otomatis menggunakan halaman pembayaran baru.
</Tip>

### 4. **Pengerjaan Ulang Formulir Produk**

Alur **create**, **edit**, dan **duplicate** produk telah dibangun ulang dari awal dengan berpusat pada satu pengalaman formulir yang konsisten.

<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="Formulir produk terpadu dengan Basic Details, Media & Description, Pricing, dan pratinjau checkout langsung secara berdampingan" style={{ maxHeight: '500px', width: 'auto' }} width="1143" height="959" data-path="images/changelog/v1.99.0/product-form.png" />
</Frame>

Sorotan:

* **Pratinjau langsung** — lihat tampilan produk Anda pada checkout dan Customer Portal saat mengedit, berdampingan dengan formulir
* **Autosave** — draft disimpan secara otomatis, sehingga berpindah halaman atau kehilangan tab tidak lagi berarti kehilangan pekerjaan Anda
* **Editor Markdown** — deskripsi produk kini mendukung editor markdown lengkap dengan rendering langsung, pratinjau tautan, dan kontrol pemformatan inline
* **Kesetaraan alur duplicate** — menduplikasi produk akan membuka formulir terpadu yang sama dalam keadaan telah terisi, bukan dialog sederhana, sehingga Anda dapat menyesuaikan setiap field sebelum menyimpan salinan

<Tip>
  Gunakan **Duplicate** untuk membuat varian regional atau berdasarkan tingkat harga dari produk yang sudah ada tanpa memasukkan ulang deskripsi, metadata, atau konfigurasi pemenuhan.
</Tip>

### 5. **Desain Ulang Halaman Business Settings**

Halaman **Settings → Business** telah didesain ulang agar konfigurasi lebih mudah dipindai dan lebih cepat diperbarui. Settings kini dikelompokkan ke dalam bagian yang lebih jelas, dengan teks penjelasan yang menerangkan dampak setiap toggle sebelum Anda mengaktifkannya.

Tidak ada **perubahan perilaku** pada settings yang ada — hanya tata letak, pengelompokan, dan penjelasan di sekitarnya yang telah ditingkatkan.

<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="Halaman Business Settings yang didesain ulang dengan bagian-bagian yang dikelompokkan untuk Business Info, Brands, currency, security, dan tracking" style={{ maxHeight: '500px', width: 'auto' }} width="1195" height="893" data-path="images/changelog/v1.99.0/business-settings.png" />
</Frame>

## Peningkatan

* **`credits_amount` override kini diteruskan dengan benar ke rute GET checkout session dan payment link** — ketika checkout session atau payment link dibuat dengan override `credit_entitlements` per-checkout, pengambilan session atau link tersebut melalui GET mengembalikan `credits_amount` default tingkat produk, bukan nilai yang dioverride. Masalah ini kini telah diperbaiki.
* **Tindakan refund dinonaktifkan untuk pembayaran yang telah sepenuhnya direfund** — tombol Refund pada pembayaran kini dinonaktifkan setelah pembayaran sepenuhnya direfund, dengan tooltip yang menjelaskan alasannya. Sebelumnya, tombol tersebut tetap aktif dan baru menampilkan error setelah dikirimkan.
* Perbaikan bug minor dan peningkatan stabilitas di seluruh platform
