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

# Diskon

> Buat kode promosi untuk meningkatkan konversi, menjalankan kampanye, dan memberi penghargaan kepada pelanggan dengan diskon persentase untuk pembelian satu kali dan langganan.

<Frame>
  <img src="https://mintcdn.com/dodopayments/mOQO5ej_lx0yH9p-/images/discount-codes/discount-code-cover.png?fit=max&auto=format&n=mOQO5ej_lx0yH9p-&q=85&s=57f1a644801ddc5efc506b50541eaaba" alt="Discount codes overview cover" style={{ maxHeight: '500px', width: 'auto' }} width="1200" height="630" data-path="images/discount-codes/discount-code-cover.png" />
</Frame>

Kode diskon memungkinkan Anda menjalankan promosi dan insentif yang ditargetkan. Buat diskon berbasis persentase, atur batas dan kadaluarsa, batasi pada produk, dan terapkan dengan mulus di checkout.

<CardGroup cols={2}>
  <Card title="Checkout Sessions" icon="cart-shopping" href="/developer-resources/checkout-session">
    Terapkan satu atau beberapa kode yang ditumpuk selama checkout yang di-host dengan `discount_codes` dan kontrol UI.
  </Card>

  <Card title="Validate Discount" icon="code" href="/api-reference/discounts/validate-discount">
    Periksa apakah diskon valid berdasarkan ID-nya.
  </Card>

  <Card title="Get Discount by Code" icon="tag" href="/api-reference/discounts/get-discount-by-code">
    Cari dan validasi diskon menggunakan nama kode yang dapat dibaca manusia (misalnya "SAVE20").
  </Card>

  <Card title="Create Discount (API)" icon="code" href="/api-reference/discounts/create-discount">
    Buat kode diskon baru secara programatis.
  </Card>

  <Card title="List & Update Discounts" icon="code" href="/api-reference/discounts/list-discounts">
    Telusuri dan kelola diskon yang ada; perbarui atau hapus sesuai kebutuhan.
  </Card>
</CardGroup>

## Apa Itu Kode Diskon?

Kode diskon adalah token promosi yang mengurangi total pesanan saat checkout. Mereka ideal untuk:

* **Kampanye musiman**: Black Friday, peluncuran produk, atau ulang tahun
* **Tawaran akuisisi**: Insentif pembelian pertama atau hadiah rujukan
* **Retensi**: Hadiah untuk memenangkan kembali atau loyalitas bagi pelanggan yang ada
* **Kesepakatan B2B**: Harga yang dikontrak atau dinegosiasikan melalui kode pribadi

## Manfaat Utama

* **Diskon fleksibel**: Persentase atau jumlah tetap

* **Kontrol terarah**: Batasi berdasarkan produk dan siklus langganan

* **Tata kelola kampanye**: Tanggal kedaluwarsa dan batas penggunaan

* **Checkout yang mulus**: Dukungan UI field dan API melalui sesi checkout

* **Diskon fleksibel**: Diskon berbasis persentase

* **Kode bertumpuk**: Terapkan hingga 20 kode per checkout, pembayaran, atau langganan — gabungkan kampanye (mis. `WELCOME10` + `BLACKFRIDAY20`) tanpa membuat kode khusus

* **Kontrol tertarget**: Batasi berdasarkan produk dan siklus langganan

* **Pengelolaan kampanye**: Tanggal kedaluwarsa dan batas penggunaan

* **Checkout mulus**: Dukungan UI dan API melalui sesi checkout

Buat kode diskon di dasbor Dodo Payments Anda, lalu terapkan di checkout yang dihosting atau melalui API.

### Pengaturan Dasbor

* **Nama Diskon** (wajib): Nama tampilan internal dan dasbor

* **Kode** (wajib): String yang dimasukkan pelanggan saat checkout

* **Tipe & Jumlah** (wajib): Tetapkan nilai persentase atau jumlah tetap, atau buat kode acak menggunakan tombol yang disediakan

* **Tanggal Kedaluwarsa** (opsional): Tanggal setelah kode menjadi tidak valid

* **Batas Penggunaan** (opsional): Total maksimum penukaran di seluruh pelanggan

* **Pembatasan Produk** (opsional): Batasi penerapan pada produk yang dipilih

* **Batas Siklus Langganan** (opsional): Jumlah siklus penagihan yang berlaku untuk diskon

* **Nama Diskon** (wajib): Nama tampilan internal dan di dashboard

* **Kode** (wajib): String yang dimasukkan pelanggan saat checkout

* **Tipe & Jumlah** (wajib): Tetapkan nilai persentase (saat ini hanya diskon berbasis persentase yang didukung), atau hasilkan kode acak menggunakan tombol yang disediakan

* **Tanggal Kedaluwarsa** (opsional): Tanggal setelah kode menjadi tidak berlaku

* **Batas Penggunaan** (opsional): Maksimum penebusan total di semua pelanggan

* **Pembatasan Produk** (opsional): Batasi aplikasi ke produk yang dipilih

* **Batas Siklus Langganan** (opsional): Jumlah siklus penagihan dimana diskon berlaku

* **Metadata** (opsional): Lampirkan pasangan kunci-nilai khusus untuk pelacakan internal atau integrasi

## Pengalaman Checkout

1. Pembeli memasukkan kode di field checkout.
2. Diskon yang memenuhi syarat diterapkan dan total diperbarui segera.

<Info>
  Dalam Sesi Checkout, kirim `discount_code` untuk menerapkan kode terlebih dahulu, dan atur `feature_flags.allow_discount_code` untuk menampilkan bidang input.
</Info>

<Info>
  Dalam Sesi Checkout, serahkan `discount_codes` (sebuah array) untuk menerapkan satu atau beberapa kode sebelumnya, dan atur `feature_flags.allow_discount_code` untuk menampilkan bidang input. Kode diterapkan dalam urutan array, dengan maksimum 20.
</Info>

## Menumpuk Kode Diskon

Sesi checkout, pembayaran, dan langganan menerima hingga **20 kode yang ditumpuk** melalui array `discount_codes` (maksimal 20 entri). Kode diterapkan **dalam urutan array**, jadi kode terpilih pertama mengurangi harga dasar terlebih dahulu, kode berikutnya mengurangi harga yang sudah didiskon, dan seterusnya. Set lengkap diskon yang diterapkan dikembalikan dalam respons di bawah `discount_ids` (pada pembayaran/langganan) dan `discounts` (detail per diskon yang lebih kaya, termasuk posisi dan siklus langganan yang tersisa).

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

<Info>
  Bidang tunggal `discount_code` **tidak lagi digunakan** tetapi tetap didukung sepenuhnya untuk kompatibilitas mundur — integrasi yang ada tetap berfungsi tanpa perubahan. Tidak dapat digabungkan dengan `discount_codes` dalam permintaan yang sama. Kami merekomendasikan pengalihan ke `discount_codes` (bentuk array) jika nyaman, meskipun untuk kode tunggal, untuk memanfaatkan penumpukan dan respons yang lebih kaya.
</Info>

## Manajemen API

<AccordionGroup>
  <Accordion title="Create discounts">
    Buat kode diskon secara programatik dengan jenis dan jumlah.

    <Card title="API Reference" icon="code" href="/api-reference/discounts/create-discount">
      Lihat API pembuatan diskon.
    </Card>
  </Accordion>

  <Accordion title="List and retrieve">
    Daftar semua diskon atau ambil detail untuk manajemen dan audit.

    <Card title="API Reference" icon="code" href="/api-reference/discounts/list-discounts">
      Telusuri API daftar dan pengambilan.
    </Card>
  </Accordion>

  <Accordion title="Get discount by code">
    Cari diskon menggunakan kode yang mudah dibaca manusia (misalnya, "SAVE20") alih-alih ID internal.

    <Card title="API Reference" icon="code" href="/api-reference/discounts/get-discount-by-code">
      Ambil diskon berdasarkan nama kode.
    </Card>
  </Accordion>

  <Accordion title="Update discounts">
    Ubah konfigurasi diskon seperti jumlah, kedaluwarsa, atau pembatasan.

    <Card title="API Reference" icon="code" href="/api-reference/discounts/update-discount">
      Pelajari cara memperbarui detail diskon.
    </Card>
  </Accordion>

  <Accordion title="Validate discounts">
    Periksa apakah diskon valid dan dapat diterapkan sebelum menggunakan.

    <Card title="API Reference" icon="code" href="/api-reference/discounts/validate-discount">
      Validasi penggunaan diskon.
    </Card>
  </Accordion>

  <Accordion title="Delete discounts">
    Menonaktifkan atau menghapus diskon yang tidak lagi diperlukan.

    <Card title="API Reference" icon="code" href="/api-reference/discounts/delete-discount">
      Hapus diskon.
    </Card>
  </Accordion>
</AccordionGroup>

## Kasus Penggunaan Umum

* **Penawaran intro**: Promosi peluncuran waktu terbatas untuk produk baru
* **Bulk atau B2B**: Diskon kontrak untuk set produk tertentu
* **Pemutaran retensi**: Kode menangkan kembali dalam alur kerja pencegahan churn
* **Kampanye musiman**: Promosi berbasis liburan atau acara

## Contoh Integrasi

### Buat diskon dengan metadata

Lampirkan pasangan kunci–nilai kustom untuk pelacakan internal.

```typescript theme={null}
const discount = await client.discounts.create({
  type: 'percentage',
  amount: 1500, // 15%
  code: 'SUMMER2025',
  metadata: {
    campaign: 'summer_promo',
    source: 'email_blast'
  }
});
```

<Tip>
  Gunakan metadata untuk memberi tag diskon berdasarkan kampanye, sumber, atau ID referensi internal sehingga Anda dapat merekonsiliasi penggunaan dan mengukur ROI kemudian.
</Tip>

### Terapkan diskon dalam Sesi Checkout

Terapkan satu atau lebih diskon yang ditumpuk terlebih dahulu dan tampilkan UI input kode.

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  discount_codes: ['BLACKFRIDAY2024', 'NEWUSER5'], // stacked in array order
  customer: { email: 'user@example.com', name: 'Jane Doe' },
  return_url: 'https://yoursite.com/return'
});
```

### Terapkan diskon selama perubahan paket

Tawarkan harga promosi ketika pelanggan meningkatkan atau menurunkan langganan mereka.

```typescript theme={null}
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_pro',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  discount_codes: ['UPGRADE20']
});
```

| `discount_codes` nilai                  | Perilaku pada perubahan paket                                                                       |
| --------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `undefined` / `null` (tidak disediakan) | Diskon yang ada dengan `preserve_on_plan_change=true` dipertahankan jika berlaku untuk produk baru. |
| `[]` (array kosong)                     | **Semua** diskon yang ada dihapus dari langganan.                                                   |
| `['CODE_A', 'CODE_B', ...]`             | Menggantikan diskon yang ada dengan set bertumpuk ini, diterapkan dalam urutan array.               |

<Info>
  Baca semua diskon yang diterapkan dari langganan melalui array `discounts` baru pada respons langganan. Setiap entri menyertakan `discount_id`, `position`, `cycles_remaining` (untuk langganan), dan kode asli.
</Info>

### Aktifkan entri diskon tanpa menerapkan sebelumnya

Biarkan pelanggan memasukkan kode saat checkout tanpa menyerahkan satu pun terlebih dahulu.

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  feature_flags: {
    allow_discount_code: true
  },
  return_url: 'https://yoursite.com/return'
});
```

## Praktik Terbaik

* **Nama dengan jelas**: Gunakan kode yang mudah dikenali yang sesuai dengan nama kampanye
* **Batasi waktu**: Tambahkan kedaluwarsa untuk mendorong urgensi dan mencegah penyalahgunaan
* **Tetapkan dengan bijak**: Batasi ke produk tertentu untuk menghindari kebocoran margin
* **Validasi lebih awal**: Periksa penerapan kode sebelum checkout dikonfirmasi
* **Pantau dampak**: Lacak penggunaan dan konversi berdasarkan kampanye

<Info>
  Kode diskon adalah alat yang kuat untuk akuisisi dan retensi. Mulailah dengan penawaran yang sederhana dan jelas, validasikan secara menyeluruh, dan iterasikan berdasarkan kinerja.
</Info>
