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

> Peluncuran hak akses dengan lima integrasi pemenuhan baru (Discord, GitHub, Telegram, Framer, Notion), alasan pembatalan langganan di portal pelanggan, batas minimum e-mandate INR yang dapat dikonfigurasi, pengaturan inklusi biaya mata uang adaptif, aplikasi Dodo Payments Desktop untuk macOS/Windows/Linux, pembayaran stablecoin (USDC/USDP/USDG), impor kunci lisensi yang ada, require_phone_number untuk sesi checkout, dan perbaikan bug

## Fitur Baru

### 1. **Hak Akses**

Dodo Payments sekarang dilengkapi dengan **Hak Akses** terpadu — satu lapisan yang mendukung pengiriman otomatis untuk setiap integrasi pemenuhan. Satu produk dapat mengirimkan beberapa hak akses pada setiap pembelian yang berhasil atau langganan aktif.

<Frame>
  <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=12a326205f64d1e71485bce46114d296" alt="Dasbor hak akses dengan daftar hak akses di kiri dan aktivitas pemberian di kanan" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1195" data-path="images/entitlements/list.png" />
</Frame>

**Lima integrasi platform baru**

Sampai sekarang, Dodo Payments mengirimkan **kunci lisensi** dan **file digital** secara otomatis saat pembelian. Hak akses memperluas cakupan tersebut ke lima platform tambahan — sehingga pelanggan yang membayar dapat diberikan akses ke komunitas Anda, kode Anda, atau konten Anda begitu pembayaran berhasil, tanpa pemenuhan manual di pihak Anda:

| Integrasi    | Apa yang dikirim                                                                                                     | Perilaku pembatalan                                                  |
| ------------ | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| **Discord**  | Memberikan peran yang dipilih di server Discord Anda setelah pelanggan menyelesaikan OAuth                           | Peran dihapus pada pembatalan/pengembalian dana                      |
| **GitHub**   | Menambahkan pelanggan sebagai kolaborator ke repository pribadi dengan tingkat izin yang Anda pilih                  | Kolaborator dihapus pada pembatalan/pengembalian dana                |
| **Telegram** | Mengeluarkan tautan undangan permintaan bergabung satu kali untuk obrolan pribadi atau saluran via bot Telegram Anda | Pelanggan dikeluarkan dari obrolan pada pembatalan/pengembalian dana |
| **Framer**   | Membuka tautan remix template Framer yang dibatasi oleh kode akses                                                   | Kode akses dinonaktifkan pada pembatalan/pengembalian dana           |
| **Notion**   | Menduplicate halaman template Notion ke dalam workspace pelanggan setelah mereka mengotorisasi melalui OAuth         | Halaman yang dikirim diarsipkan pada pembatalan/pengembalian dana    |

Ini bergabung dengan integrasi **Kunci Lisensi** yang sudah ada (kunci unik dengan batas aktivasi dan kedaluwarsa) dan **File Digital** (URL unduhan yang ditandatangani sebelumnya untuk e-book, template, media), semuanya sekarang dikelola melalui siklus hidup pemberian yang sama.

**Apa yang Anda dapatkan dari dalam kotak**

| Kemampuan                                 | Deskripsi                                                                                                                                                                                                        |
| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Template yang dapat digunakan kembali** | Definisikan sekali hak akses (batas aktivasi, bundel file, peran Discord, izin repo, dll.) dan lampirkan ke produk apa pun                                                                                       |
| **Pemberian otomatis**                    | Dikeluarkan pada `payment.succeeded` dan `subscription.active`, idempotent atas pembaruan dan reaktivasi                                                                                                         |
| **Pencabutan yang sadar siklus hidup**    | Dicabut pada `subscription.cancelled`, `subscription.on_hold`, `subscription.expired`, `refund.succeeded`, `subscription.plan_changed`, atau pencabutan manual API/dashboard — dengan `revocation_reason` terisi |
| **OAuth + arus langsung platform**        | OAuth untuk izin pelanggan Discord, GitHub, dan Notion; panggilan langsung platform untuk Telegram, Framer, dan File Digital                                                                                     |
| **Deteksi Drift**                         | Mendeteksi ketika peran Discord, kolaborator GitHub, atau halaman Notion tidak sinkron di tingkat platform dan dicabut dengan `revocation_reason: platform_external`                                             |
| **Enkripsi saat tidak aktif**             | Semua token platform (OAuth, bot, instalasi aplikasi) disimpan dengan AES-256-GCM                                                                                                                                |

**Webhooks**

Empat acara siklus hidup baru dipicu untuk setiap pemberian:

| Acara                         | Dipicu ketika                                                                 |
| ----------------------------- | ----------------------------------------------------------------------------- |
| `entitlement_grant.created`   | Pemberian baru dibuat untuk pelanggan                                         |
| `entitlement_grant.delivered` | Pemberian akses pelanggan                                                     |
| `entitlement_grant.failed`    | Pengiriman tidak dapat diselesaikan; periksa `error_code` dan `error_message` |
| `entitlement_grant.revoked`   | Akses dicabut; periksa `revocation_reason`                                    |

<Tip>
  Untuk integrasi baru, dengarkan `entitlement_grant.delivered` daripada `payment.succeeded`. Keberhasilan pembayaran tidak berarti pengiriman selesai, terutama untuk integrasi berbasis OAuth.
</Tip>

Pelajari lebih lanjut: [Entitlements](/features/entitlements/introduction) | [Entitlement Grant Webhooks](/developer-resources/webhooks/intents/entitlement-grant)

### 2. **Alasan Pembatalan Langganan di Portal Pelanggan**

Saat pelanggan membatalkan langganan dari Portal Pelanggan, mereka sekarang diminta untuk berbagi **mengapa mereka membatalkan** sebelum mengonfirmasi. Alasan yang ditangkap disimpan di langganan sebagai `cancellation_feedback`, muncul di payload API dan webhook, dan tersedia di dasbor sehingga Anda dapat melihat pola churn secara sekilas.

<Frame>
  <img src="https://mintcdn.com/dodopayments/RlXcM7JO-E_w40Np/images/customer-portal/cancellation-reasons.png?fit=max&auto=format&n=RlXcM7JO-E_w40Np&q=85&s=979394da2a9aa3907cbf9f4e225f9a4b" alt="Modal pembatalan Portal Pelanggan dengan dropdown 'Mengapa Anda membatalkan?' yang menunjukkan alasan seperti Terlalu mahal, Fitur yang hilang, dan Lainnya" style={{ maxHeight: '500px', width: 'auto' }} width="2880" height="1564" data-path="images/customer-portal/cancellation-reasons.png" />
</Frame>

**Opsi alasan**

| Nilai              | Label yang dihadapi pelanggan     |
| ------------------ | --------------------------------- |
| `too_expensive`    | Terlalu mahal                     |
| `missing_features` | Fitur yang hilang                 |
| `switched_service` | Beralih ke layanan lain           |
| `unused`           | Tidak menggunakannya cukup sering |
| `customer_service` | Layanan pelanggan yang buruk      |
| `low_quality`      | Kualitas rendah                   |
| `too_complex`      | Terlalu kompleks                  |
| `other`            | Lainnya                           |

**Di mana itu muncul**

* **Subscription object**: Kolom `cancellation_feedback` baru (salah satu nilai di atas) dan `cancellation_comment` (teks bebas opsional), diisi saat pelanggan membatalkan
* **`subscription.cancelled` webhook**: Kedua kolom disertakan dalam payload
* **API**: Teruskan `cancellation_feedback` dan `cancellation_comment` ke `PATCH /subscriptions/{subscription_id}` saat menjadwalkan atau menjalankan pembatalan secara terprogram

```typescript theme={null}
// Reading the captured feedback
const subscription = await client.subscriptions.retrieve('sub_123');
console.log(subscription.cancellation_feedback); // e.g., "too_expensive"
console.log(subscription.cancellation_comment);  // e.g., "Switching to a competitor"
```

<Tip>
  Gabungkan `cancellation_feedback` dengan [Subscription Dunning](/features/recovery/subscription-dunning) untuk menyesuaikan email win-back Anda — misalnya, kirim kode diskon ke `too_expensive` pembatal dan survei "apa yang hilang?" ke `missing_features` pembatal.
</Tip>

Pelajari lebih lanjut: [Portal Pelanggan](/features/customer-portal#cancelling-a-subscription) | [Subscription Webhooks](/developer-resources/webhooks/intents/subscription)

### 3. **Jumlah Minimum Mandate yang Dapat Dikonfigurasi untuk E-Mandates INR**

Anda sekarang dapat mengonfigurasi **mandate floor** untuk e-mandate INR pada langganan berulang kartu India. Sebelumnya, setiap langganan kartu India di bawah ₹15,000 menggunakan mandate on-demand tetap ₹15,000. Sekarang Anda dapat mengesampingkan lantai ini di tingkat pedagang — dan per sesi checkout atau langganan jika diperlukan.

Jumlah mandate yang terdaftar dengan bank pelanggan adalah `max(mandate_min_amount_inr_paise, billing_amount)`, jadi nilai ini bertindak sebagai **plafon otorisasi** yang dihadapi pelanggan setiap kali penagihan lebih rendah dari floor.

```typescript theme={null}
// Per-subscription override
const subscription = await client.subscriptions.create({
  product_id: 'pdt_inr_monthly',
  customer: { email: 'customer@example.in' },
  billing: { country: 'IN' /* ... */ },
  mandate_min_amount_inr_paise: 2_000_000 // ₹20,000 ceiling for this subscription
});

// Or via a checkout session
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_inr_monthly', quantity: 1 }],
  mandate_min_amount_inr_paise: 2_000_000,
  return_url: 'https://yoursite.com/return'
});
```

**Prioritas resolusi**

1. Override per permintaan (`mandate_min_amount_inr_paise` pada sesi checkout, pembayaran, atau langganan)
2. Pengaturan tingkat pedagang dalam pengaturan bisnis
3. Sistem default sebesar **₹15,000** (1,500,000 paise)

| Field                          | Jenis                 | Rentang | Berlaku untuk                                         |
| ------------------------------ | --------------------- | ------- | ----------------------------------------------------- |
| `mandate_min_amount_inr_paise` | `integer` (INR paise) | `>= 1`  | Langganan INR kartu India pada konektor non-Airwallex |

<Info>
  Pengaturan ini hanya memengaruhi e-mandate yang terdaftar untuk kartu yang diterbitkan di India (Visa, Mastercard, RuPay) pada langganan INR. Langganan UPI mengikuti aliran AutoPay mereka sendiri dan tidak terpengaruh.
</Info>

Pelajari lebih lanjut: [Metode Pembayaran India](/features/payment-methods/india#mandate-types) | [Langganan dengan Mandate RBI](/features/subscription#subscriptions-with-rbi-compliant-mandates)

### 4. **Pengaturan Bisnis Inklusif Biaya Mata Uang Adaptif**

Mata Uang Adaptif adalah fitur yang memungkinkan Anda mengenakan biaya kepada pelanggan dalam mata uang lokal mereka. Secara default, **2–4% biaya mata uang adaptif** ditanggung oleh pelanggan dan ditambahkan di atas harga yang ditampilkan. Dengan pengaturan baru **Biaya Inklusif**, Anda dapat membalik ini: menjaga harga yang ditampilkan tidak berubah untuk pelanggan dan menanggung biaya sendiri.

**Di mana mengonfigurasinya**

Pergi ke **Pengaturan → Bisnis**, pastikan **Penetapan Harga Adaptif** diaktifkan, dan toggle **Biaya Inklusif** di bagian Mata Uang Adaptif.

**Override per permintaan**

Anda juga dapat mengganti default merchant untuk pembayaran individual, biaya langganan sesuai permintaan, dan perubahan paket menggunakan boolean `adaptive_currency_fees_inclusive`:

```typescript theme={null}
const payment = await client.payments.create({
  product_cart: [{ product_id: 'pdt_abc', quantity: 1 }],
  customer: { customer_id: 'cus_123' },
  billing: { country: 'US' },
  adaptive_currency_fees_inclusive: true, // override business default
  return_url: 'https://yoursite.com/return'
});
```

\| Mode | Yang dilihat pelanggan | Pedagang menyelesaikan |
\|------|-------------- ---|------------------|
\| Eksklusif (default) | Harga lokal + biaya 2–4% di atasnya | Harga dasar penuh |
\| Inklusif | Harga lokal (tidak berubah) | Harga dasar dikurangi biaya 2–4% |

<Info>
  Transaksi INR → INR selalu diperlakukan sebagai inklusif terlepas dari pengaturan bisnis atau override per permintaan.
</Info>

Pelajari lebih lanjut: [Mata Uang Adaptif](/features/adaptive-currency)

### 5. **Aplikasi Dodo Payments Desktop**

Aplikasi resmi **Dodo Payments Desktop** sekarang tersedia secara umum untuk **macOS, Windows, dan Linux**. Jalankan dasbor pembayaran Anda sebagai aplikasi asli yang cepat — tidak diperlukan tab peramban.

| Platform                             | Download                                              |
| ------------------------------------ | ----------------------------------------------------- |
| macOS (Apple Silicon)                | `Dodo.Payments_<version>_aarch64.dmg`                 |
| macOS (Intel)                        | `Dodo.Payments_<version>_x64.dmg`                     |
| Windows                              | `Dodo.Payments_<version>_x64-setup.exe` (atau `.msi`) |
| Linux (Debian/Ubuntu)                | `Dodo.Payments_<version>_amd64.deb`                   |
| Linux (Fedora/RHEL)                  | `Dodo.Payments-<version>-1.x86_64.rpm`                |
| Linux (AppImage, pembaruan otomatis) | `Dodo.Payments_<version>_amd64.AppImage`              |

**Apa yang ada di dalamnya**

* **Binary asli kecil** — dibangun dengan Tauri pada tampilan web asli sistem, total \~5 MB (tidak ada Chromium yang disertakan)
* **Ditandatangani dan dinotariskan** — build macOS ditandatangani dengan Apple Developer ID dan dinotariskan, jadi tidak ada peringatan Gatekeeper
* **Pembaruan otomatis** — memeriksa setiap 4 jam dan menerapkan pembaruan yang ditandatangani secara otomatis dari GitHub Releases (berfungsi di macOS, Windows, dan Linux AppImage)
* **System tray + menu bar** — hide-to-tray di macOS, menu penuh File/Edit/View/Help dengan pintasan keyboard (`⌘⇧H` pergi ke dasbor, `⌘L` salin URL saat ini, `⌘⌥I` alat dev)
* **Dukungan deep-link** — tautan otentikasi magic-link terbuka langsung di aplikasi
* **Multi-window** — buka beberapa dasbor berdampingan

<Tip>
  Ambil installer terbaru untuk platform Anda dari halaman [Desktop App Releases](https://github.com/dodopayments/dodo-desktop/releases/latest). Reponya sepenuhnya open source.
</Tip>

### 6. **Pembayaran Stablecoin (USDC, USDP, USDG)**

Terima **pembayaran stablecoin secara global** dengan penyelesaian USD. Pelanggan membayar dari dompet stablecoin pilihan mereka di jaringan pilihan mereka; Anda menerima fiat USD tanpa eksposur ke volatilitas kripto, tidak ada chargeback, dan tidak ada infrastruktur perbankan yang diperlukan di pihak pelanggan.

**Mata uang dan jaringan yang didukung**

| Stablecoin | Jaringan                        |
| ---------- | ------------------------------- |
| **USDC**   | Ethereum, Solana, Polygon, Base |
| **USDP**   | Ethereum, Solana                |
| **USDG**   | Ethereum                        |

**Cakupan**

| Detail               | Nilai                                       |
| -------------------- | ------------------------------------------- |
| Mata uang penagihan  | USD                                         |
| Negara yang didukung | Global (tidak termasuk India)               |
| Langganan            | Tidak didukung (hanya pembayaran satu kali) |
| Jumlah minimum       | \$0.50                                      |
| Penyelesaian         | USD                                         |

**Konfigurasi**

Lewati `crypto_currency` dalam `allowed_payment_method_types` saat membuat sesi checkout:

```javascript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_123', quantity: 1 }],
  allowed_payment_method_types: ['crypto_currency', 'credit', 'debit'],
  return_url: 'https://example.com/success'
});
```

Pelanggan ditunjukkan alamat dompet dan kode QR dengan jumlah stablecoin yang dihitung pada kurs real-time; setelah transaksi dikonfirmasi oleh blockchain, webhook `payment.succeeded` Anda dipicu dan pelanggan diarahkan ke halaman sukses Anda.

<Info>
  Pembayaran stablecoin tidak dapat dibatalkan secara desain — tidak ada chargeback. Kami merekomendasikan selalu menawarkan `credit` dan `debit` sebagai metode cadangan untuk pelanggan tanpa dompet stablecoin.
</Info>

Pelajari lebih lanjut: [Pembayaran Stablecoin](/features/payment-methods/stablecoins)

### 7. **Impor Kunci Lisensi yang Ada**

Anda sekarang dapat **mengimpor kunci lisensi dari sistem lain** ke Dodo Payments menggunakan [Create License Key API](/api-reference/licenses/create-license-key). Ini membuka migrasi tanpa gangguan dari penyedia kunci lisensi eksternal mana pun, sehingga pelanggan Anda yang ada dapat terus mengaktifkan, memvalidasi, dan menonaktifkan kunci mereka di Dodo Payments tanpa penerbitan ulang.

```typescript theme={null}
const licenseKey = await client.licenseKeys.create({
  customer_id: 'cus_abc123',
  product_id: 'pdt_456',
  key: 'YOUR-EXISTING-LICENSE-KEY',
  activations_limit: 5,
  expires_at: '2026-12-31T23:59:59Z',
});
```

Kunci yang diimpor diberi tag dengan `source: "import"` (dibandingkan dengan `source: "auto"` untuk kunci yang dihasilkan secara otomatis saat pembayaran), sehingga Anda dapat membedakan inventaris yang dimigrasi dari kunci yang dikeluarkan secara organik saat mengquery `GET /license_keys`. `payment_id` pada kunci yang diimpor adalah `null` karena mereka tidak terikat pada transaksi Dodo Payments.

<Warning>
  Kunci lisensi yang dibuat atau diperbarui melalui API tidak memicu notifikasi email kepada pelanggan. Jika Anda perlu memberi tahu pelanggan tentang kunci yang diimpor, tangani itu secara terpisah dalam aplikasi Anda.
</Warning>

<Tip>
  Bermigrasi dari Polar.sh atau Lemon Squeezy? [`dodo-migrate` CLI](/migrate-to-dodo) mengotomatiskan impor produk, pelanggan, diskon, dan kunci lisensi secara massal dalam satu perintah.
</Tip>

Pelajari lebih lanjut: [Kunci Lisensi](/features/license-keys#import-existing-license-keys-via-api) | [Create License Key API](/api-reference/licenses/create-license-key)

### 8. **`require_phone_number` untuk Sesi Checkout**

Memaksa pelanggan untuk memberikan nomor telepon saat checkout dengan mengatur `feature_flags.require_phone_number: true` saat membuat sesi checkout. Nomor telepon menjadi field wajib di formulir checkout, dengan validasi formulir yang menampilkan "Nomor telepon diperlukan" jika pelanggan membiarkannya kosong.

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

| Flag                            | Default | Perilaku                                      |
| ------------------------------- | ------- | --------------------------------------------- |
| `allow_phone_number_collection` | `true`  | Menampilkan field nomor telepon saat checkout |
| `require_phone_number`          | `false` | Membuat field nomor telepon wajib             |

<Warning>
  `require_phone_number: true` memerlukan `allow_phone_number_collection: true`. API menolak sesi di mana `require_phone_number` true saat pengumpulan nomor telepon dinonaktifkan.
</Warning>

<Tip>
  Berguna untuk SaaS B2B, industri yang diatur, atau aliran apa pun di mana Anda memerlukan saluran kontak yang terverifikasi untuk dukungan, tinjauan penipuan, atau kepatuhan.
</Tip>

Pelajari lebih lanjut: [Fitur Checkout](/features/checkout) | [Create Checkout Session API](/api-reference/checkout-sessions/create)

## Perbaikan Bug & Peningkatan

* Perbaikan bug minor dan peningkatan stabilitas di seluruh platform
