Skip to main content

Prasyarat

Untuk mengintegrasikan API Dodo Payments, Anda memerlukan:
  • Akun pedagang Dodo Payments
  • Kredensial API (kunci API dan kunci rahasia webhook) dari dasbor
Untuk panduan yang lebih rinci tentang prasyarat, periksa bagian ini.

Integrasi API

Sesi Checkout

Gunakan Checkout Sessions untuk menjual produk langganan dengan checkout yang aman dan dihosting. Sertakan produk langganan Anda di product_cart dan alihkan pelanggan ke checkout_url.
Mixed Checkout: Anda dapat menggabungkan produk langganan dengan produk satu kali dalam sesi checkout yang sama. Ini memungkinkan kasus penggunaan seperti biaya penyiapan dengan langganan, paket perangkat keras dengan SaaS, dan lainnya. Lihat Checkout Sessions guide untuk contoh.

Respons API

Berikut adalah contoh respons:
Alihkan pelanggan ke checkout_url.

Webhook

Saat mengintegrasikan langganan, Anda akan menerima webhook untuk melacak siklus hidup langganan. Webhook ini membantu Anda mengelola status langganan dan skenario pembayaran dengan efektif. Untuk mengatur endpoint webhook Anda, silakan ikuti Panduan Integrasi Rinci.

Jenis Acara Langganan

Berikut adalah acara webhook yang melacak perubahan status langganan:
  1. subscription.active - Langganan berhasil diaktifkan.
  2. subscription.updated - Objek langganan diperbarui (dipicu pada setiap perubahan bidang).
  3. subscription.on_hold - Langganan ditangguhkan karena pembaruan gagal.
  4. subscription.failed - Pembuatan langganan gagal selama pembuatan mandat.
  5. subscription.renewed - Langganan diperbarui untuk periode penagihan berikutnya.
Untuk manajemen siklus hidup langganan yang andal, kami merekomendasikan untuk melacak acara langganan ini.
Gunakan subscription.updated untuk mendapatkan pemberitahuan waktu nyata tentang perubahan langganan apa pun, menjaga status aplikasi Anda tetap sinkron tanpa harus memanggil API secara berkala.

Skenario Pembayaran

Webhook yang Anda terima dan waktunya bergantung pada apakah produk memiliki masa uji coba. Penagihan langsung (0 hari uji coba):
  1. subscription.active: mandate diotorisasi dan subscription diaktifkan.
  2. payment.succeeded: mengonfirmasi charge pertama. Ini biasanya terjadi dalam 2–10 menit setelah checkout.
Dengan masa uji coba:
  1. Saat uji coba dimulai (checkout): subscription.active dipicu setelah payment method diotorisasi. Belum ada recurring charge yang diambil. Charge pertama yang sebenarnya ditunda hingga uji coba berakhir.
  2. Saat uji coba berakhir: jumlah berulang ditagihkan, dan Anda menerima payment.succeeded bersama dengan subscription.renewed.
Setiap renewal berikutnya:
  • subscription.renewed: dipicu pada setiap billing cycle saat pembayaran renewal dipotong, selalu bersama payment.succeeded. Event ini juga membawa next_billing_date yang telah diperbarui.
Setiap kali uang benar-benar dipotong untuk produk subscription, Anda mendapatkan subscription.renewed dan payment.succeeded. Gunakan subscription.renewed (bukan hanya payment.succeeded) sebagai sinyal untuk memperpanjang akses ke cycle berikutnya.
Skenario Kegagalan Pembayaran
  1. Kegagalan Subscription
  • subscription.failed - Subscription gagal dibuat karena kegagalan membuat mandate.
  • payment.failed - Menunjukkan pembayaran gagal.
  1. Subscription Ditangguhkan
  • subscription.on_hold - Subscription ditangguhkan karena pembayaran renewal atau charge perubahan plan gagal.
  • Saat subscription ditangguhkan, subscription tidak akan diperbarui secara otomatis sampai payment method diperbarui.
Praktik Terbaik: Untuk menyederhanakan implementasi, kami menyarankan agar Anda terutama melacak event subscription untuk mengelola lifecycle subscription.
Untuk panduan lengkap tentang cara membaca error_code/error_message, menentukan kapan harus mencoba lagi, dan menampilkan kegagalan kepada customer, lihat Menangani Kegagalan Pembayaran.

subscription.failed vs. subscription.on_hold

Kedua event ini mudah tertukar, tetapi memerlukan penanganan yang sangat berbeda:
subscription.failed bersifat terminal. Subscription tidak dapat diaktifkan kembali. Customer harus membuat subscription baru. Jangan pernah memberikan entitlements saat event ini dipicu.

Menangani Subscription yang Ditangguhkan

Saat subscription memasuki status on_hold, Anda perlu memperbarui payment method untuk mengaktifkannya kembali. Bagian ini menjelaskan kapan subscription ditangguhkan dan cara menanganinya.

Kapan Subscription Ditangguhkan

Subscription ditangguhkan ketika:
  • Pembayaran renewal gagal: Charge renewal otomatis gagal karena dana tidak mencukupi, kartu kedaluwarsa, atau penolakan bank
  • Charge perubahan plan gagal: Charge langsung selama upgrade/downgrade plan gagal
  • Otorisasi payment method gagal: Payment method tidak dapat diotorisasi untuk recurring charges
Subscription dalam status on_hold tidak akan diperbarui secara otomatis. Anda harus memperbarui payment method untuk mengaktifkan kembali subscription.

Mengaktifkan Kembali Subscription yang Ditangguhkan

Untuk mengaktifkan kembali subscription dari status on_hold, gunakan Update Payment Method API. API ini secara otomatis:
  1. Membuat charge untuk jumlah yang masih harus dibayar
  2. Membuat invoice untuk charge tersebut
  3. Memproses pembayaran menggunakan payment method baru
  4. Mengaktifkan kembali subscription ke status active setelah pembayaran berhasil
1

Handle subscription.on_hold webhook

Saat menerima webhook subscription.on_hold, perbarui state aplikasi Anda dan beri tahu customer:
2

Update payment method

Saat customer siap memperbarui payment method, panggil Update Payment Method API:
Anda juga dapat menggunakan payment method ID yang sudah ada jika customer telah menyimpan payment method:
3

Monitor webhook events

Setelah memperbarui payment method, pantau event webhook berikut:
  1. payment.succeeded - Charge untuk jumlah yang masih harus dibayar berhasil
  2. subscription.active - Subscription telah diaktifkan kembali

Contoh payload event Subscription


Mengubah Plan Subscription

Anda dapat melakukan upgrade atau downgrade plan subscription menggunakan endpoint change plan API. Ini memungkinkan Anda mengubah produk, kuantitas, dan menangani proration subscription.

Change Plan API Reference

Untuk informasi terperinci tentang perubahan plan subscription, lihat dokumentasi Change Plan API kami.

Opsi Proration

Saat mengubah plan subscription, Anda memiliki dua opsi untuk menangani charge langsung:

1. prorated_immediately

  • Menghitung jumlah prorata berdasarkan sisa waktu dalam billing cycle saat ini
  • Menagih customer hanya untuk selisih antara plan lama dan baru
  • Selama masa uji coba, opsi ini akan langsung memindahkan user ke plan baru dan langsung menagih customer

2. full_immediately

  • Menagih customer seluruh jumlah subscription untuk plan baru
  • Mengabaikan sisa waktu atau kredit dari plan sebelumnya
  • Berguna jika Anda ingin mengatur ulang billing cycle atau menagih jumlah penuh tanpa memperhatikan proration

3. difference_immediately

  • Saat melakukan upgrade, customer langsung ditagih sebesar selisih antara kedua jumlah plan.
  • Misalnya, jika plan saat ini 30 Dolar dan customer melakukan upgrade ke plan 80 Dolar, mereka langsung ditagih $50.
  • Saat melakukan downgrade, jumlah yang tidak terpakai dari plan saat ini ditambahkan sebagai kredit internal dan secara otomatis digunakan untuk renewal subscription berikutnya.
  • Misalnya, jika plan saat ini 50 Dolar dan customer beralih ke plan 20 Dolar, sisa $30 dikreditkan dan digunakan untuk billing cycle berikutnya.

4. do_not_bill

  • Menerapkan perubahan plan secara langsung tetapi tidak menagih apa pun saat perubahan dilakukan.
  • Plan yang diperbarui (beserta quantity/add-ons) ditagihkan pada renewal terjadwal berikutnya, dan tanggal billing asli dipertahankan.
Ketiga mode “charge now” mengatur ulang billing cycle. prorated_immediately, difference_immediately, dan full_immediately memindahkan next_billing_date subscription ke tanggal perubahan. Hanya do_not_bill yang mempertahankan tanggal renewal asli, tetapi tidak menerapkan charge langsung.

Perilaku

  • Saat Anda memanggil API ini, Dodo Payments segera memulai charge berdasarkan opsi proration yang Anda pilih
  • Jika perubahan plan merupakan downgrade dan Anda menggunakan prorated_immediately, kredit akan dihitung secara otomatis dan ditambahkan ke saldo kredit subscription. Kredit ini khusus untuk subscription tersebut dan hanya akan digunakan untuk mengimbangi recurring payments mendatang dari subscription yang sama
  • Opsi full_immediately melewati penghitungan kredit dan menagih jumlah lengkap plan baru
Pilih opsi proration dengan hati-hati: Gunakan prorated_immediately untuk penagihan yang adil dan memperhitungkan waktu yang tidak terpakai, atau full_immediately jika Anda ingin menagih jumlah lengkap plan baru tanpa memperhatikan billing cycle saat ini.

Pemrosesan Charge

  • Charge langsung yang dimulai setelah perubahan plan biasanya selesai diproses dalam waktu kurang dari 2 menit
  • Jika charge langsung ini gagal karena alasan apa pun, subscription secara otomatis ditangguhkan sampai masalah teratasi

Subscription On-Demand

Create Subscription

Referensi API untuk membuat produk langganan dan mengelola siklus hidup langganan

Change Subscription Plan

Referensi API untuk meningkatkan, menurunkan, atau mengubah paket langganan dengan opsi prorata

Update Payment Method

Referensi API untuk memperbarui metode pembayaran dan mengaktifkan kembali langganan yang ditunda

Patch Subscription

Referensi API untuk memperbarui detail dan konfigurasi langganan
Untuk membuat subscription on-demand: Untuk membuat subscription on-demand, gunakan endpoint API POST /subscriptions dan sertakan field on_demand dalam request body Anda. Ini memungkinkan Anda mengotorisasi payment method tanpa charge langsung, atau menetapkan harga awal khusus. Untuk menagih subscription on-demand: Untuk charge berikutnya, gunakan endpoint POST /subscriptions//charge dan tentukan jumlah yang akan ditagihkan kepada customer untuk transaksi tersebut.
Untuk panduan lengkap langkah demi langkah (termasuk contoh request/response, kebijakan retry yang aman, dan penanganan webhook), lihat Panduan Subscription On-Demand.

Hal Penting yang Perlu Diketahui tentang Penagihan Subscription

Atur periode subscription lebih panjang daripada frekuensi pembayaran. Jika periode subscription sama dengan frekuensi pembayaran (misalnya period = 1 month, frequency = 1 month), subscription berlaku selama satu cycle lalu berpindah ke expired, bukan melakukan renewal. Untuk plan bulanan yang berkelanjutan, tetapkan periode subscription yang panjang (misalnya 20 tahun) dengan frekuensi pembayaran bulanan.
Currency dikunci pada charge pertama yang berhasil. Selalu kirim billing_currency dan billing_address.country secara eksplisit saat membuat checkout. Jika tidak disertakan, keduanya terdeteksi dari IP customer (Adaptive Currency), dan setelah subscription menerima charge pertamanya, currency ditetapkan untuk seluruh masa berlakunya. Customer yang kemudian bepergian tidak dapat mengubahnya.
Trial menggunakan otorisasi $0, bukan charge. Saat subscription memiliki trial, dimulainya trial membuat otorisasi mandate $0 untuk menyimpan kartu; charge pertama yang sebenarnya terjadi saat trial berakhir. Dalam daftar payments, subscription yang sedang trial menampilkan tepat satu payment dengan amount: 0.
Lifecycle subscription: on_hold = renewal gagal (dapat dipulihkan: minta customer memperbarui payment method; dunning retries berlaku). expired = masa berlaku berakhir tanpa renewal dan tidak dapat diaktifkan kembali. Customer harus berlangganan kembali. cancelled = diakhiri oleh customer atau merchant. Sebagian besar kegagalan renewal adalah penolakan dari pihak issuer (dana tidak mencukupi, kartu ditolak), bukan kesalahan Dodo.
Kartu India menggunakan RBI e-mandate. Charge off-session (renewal dan charge perubahan plan) dapat memerlukan waktu hingga sekitar 48 jam untuk diselesaikan, dan auto-debit berulang di atas ₹15.000 memerlukan autentikasi customer baru (sehingga upgrade yang melewati batas tersebut tidak dapat menggunakan mandate yang ada). Saat satu charge masih berstatus processing, charge kedua pada subscription yang sama gagal dengan “Cannot create new charge as previous payment is not successful yet.” Kartu non-India dikonfirmasi hampir seketika.
Charge subscription memiliki minimum $1 (atau ekuivalen dalam currency). Jumlah $0.01–$0.99 ditolak dengan product_price: value out of range; hanya $0 yang diizinkan, melalui setup mandate_only on-demand.

Referensi API Terkait

Create Subscription

Referensi API untuk membuat produk subscription dan mengelola lifecycle subscription

Change Subscription Plan

Referensi API untuk melakukan upgrade, downgrade, atau mengubah plan subscription dengan opsi proration

Update Payment Method

Referensi API untuk memperbarui payment method dan mengaktifkan kembali subscription yang ditangguhkan

Patch Subscription

Referensi API untuk memperbarui detail dan konfigurasi subscription
Terakhir diubah pada 31 Juli 2026