Prasyarat
Sebelum memulai, Anda memerlukan:- Akun merchant Dodo Payments
- API key dari Developer → API Keys di dashboard, disimpan di
DODO_PAYMENTS_API_KEY - Secret webhook dari Developer → Webhooks, disimpan di
DODO_PAYMENTS_WEBHOOK_KEY - Setidaknya satu produk subscription yang dibuat di Products
Integrasi API
Checkout Sessions
Buat subscription dengan membangun checkout session menggunakan produk subscription Anda. Pelanggan mengotorisasi metode pembayaran dan subscription aktif setelah mereka menyelesaikan checkout.- Node.js SDK
- Python SDK
- REST API
API Response
Respons mencakupcheckout_url:
Webhooks
Webhooks memberi tahu server Anda ketika event subscription terjadi. Siapkan endpoint Anda di Developer → Webhooks pada dashboard. Untuk menyiapkan endpoint webhook, lihat Webhooks.Jenis Event Subscription
Lacak event berikut untuk mengelola siklus subscription:subscription.active— Subscription diaktifkansubscription.updated— Sebuah field pada subscription berubahsubscription.on_hold— Charge renewal atau perubahan plan gagalsubscription.failed— Pembuatan subscription gagal (terminal; pelanggan harus melakukan subscription ulang)subscription.renewed— Charge berulang berhasilsubscription.past_due— Renewal gagal dan grace period dimulai; pelanggan tetap memiliki akses hinggapast_due_ends_atsubscription.plan_changed— Plan di-upgrade, di-downgrade, atau diubahsubscription.cancelled— Subscription dibatalkansubscription.expired— Subscription mencapai akhir masa berlakunya
paused, unpaused, dan update_payment_method, lihat Subscription Webhooks.
Skenario Pembayaran
Alur Pembayaran Berhasil Urutan webhook bergantung pada apakah subscription memiliki trial. Penagihan langsung (0 hari trial):subscription.active: mandate diotorisasi dan subscription diaktifkan.payment.succeeded: mengonfirmasi charge pertama. Harapkan event ini dalam 2–10 menit setelah checkout.
- Saat trial dimulai (checkout):
subscription.activedipicu setelah payment method diotorisasi. Belum ada charge berulang yang dilakukan. Charge pertama yang sebenarnya ditunda hingga trial berakhir. - Saat trial berakhir: jumlah berulang ditagihkan, dan Anda menerima
payment.succeededbersama dengansubscription.renewed.
subscription.renewed: dipicu pada setiap siklus penagihan saat pembayaran renewal dipotong, selalu bersamapayment.succeeded. Event ini juga membawanext_billing_dateyang 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 siklus berikutnya.- Kegagalan Subscription
subscription.failed- Pembuatan subscription gagal karena pembuatan mandate gagal.payment.failed- Menunjukkan pembayaran gagal.
- Subscription Ditangguhkan
subscription.on_hold- Subscription ditangguhkan karena pembayaran renewal atau charge perubahan plan gagal. Jika bisnis Anda memiliki grace period, renewal yang gagal pertama-tama memindahkan subscription kepast_due(subscription.past_due), lalu memindahkannya keon_hold(ataucancelled, bergantung pada pengaturan grace period Anda) hanya setelah grace period berakhir. Lihat Subscription States.- Saat subscription ditangguhkan, subscription tidak akan diperbarui secara otomatis hingga payment method diperbarui.
Praktik Terbaik: Untuk menyederhanakan implementasi, kami menyarankan agar Anda terutama melacak event subscription untuk mengelola siklus subscription.
subscription.failed vs. subscription.on_hold
Kedua event ini mudah tertukar, tetapi memerlukan penanganan yang sangat berbeda:
Menangani Subscription yang Ditangguhkan
Saat subscription memasuki statuson_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 charge berulang
Mengaktifkan Kembali Subscription yang Ditangguhkan
Untuk mengaktifkan kembali subscription dari statuson_hold, gunakan Update Payment Method API. API ini secara otomatis:
- Membuat charge untuk saldo terutang
- Membuat invoice untuk charge tersebut
- Memproses pembayaran menggunakan payment method baru
- Mengaktifkan kembali subscription ke status
activesetelah pembayaran berhasil
1
Handle subscription.on_hold webhook
Saat menerima webhook
subscription.on_hold, perbarui status aplikasi Anda dan beri tahu pelanggan:2
Update payment method
Saat pelanggan siap memperbarui payment method, panggil Update Payment Method API:
Anda juga dapat menggunakan payment method ID yang sudah ada jika pelanggan memiliki payment method tersimpan:
3
Monitor webhook events
Setelah memperbarui payment method, pantau event webhook berikut:
payment.succeeded- Charge untuk saldo terutang berhasilsubscription.active- Subscription telah diaktifkan kembali
Contoh Payload Event Subscription
Mengubah Plan Subscription
Anda dapat meng-upgrade atau men-downgrade plan subscription menggunakan endpoint change plan API. Ini memungkinkan Anda mengubah produk, kuantitas, dan menangani proration subscription.Change Plan API Reference
Untuk informasi mendetail tentang perubahan plan subscription, silakan lihat dokumentasi Change Plan API kami.
Opsi Proration
Saat mengubah plan subscription, Anda memiliki empat opsi untuk menangani charge langsung:1. prorated_immediately
- Memberikan kredit untuk bagian yang tidak terpakai dari siklus penagihan saat ini, diprorata berdasarkan waktu yang tersisa. Kredit mencakup base plan, kuantitas, dan add-on apa pun
- Kemudian menagihkan siklus penuh pada plan, kuantitas, dan add-on baru. Charge itu sendiri tidak pernah diprorata
- Charge langsung bersih = (siklus baru penuh) dikurangi (fraksi tersisa x siklus lama penuh). Jika kredit lebih besar, selisihnya disimpan sebagai kredit yang berlaku untuk subscription untuk renewal berikutnya
- Selama periode trial, opsi ini langsung mengalihkan pengguna ke plan baru dan langsung menagih pelanggan
2. full_immediately
- Menagih pelanggan sejumlah penuh subscription untuk plan baru tanpa kredit untuk siklus sebelumnya
- Baik saat upgrade maupun downgrade, pelanggan membayar seluruh harga plan baru dari awal
- Berguna ketika Anda ingin menagih jumlah penuh tanpa memedulikan berapa banyak waktu yang tersisa pada plan lama
3. difference_immediately
- Pelanggan hanya membayar selisih antara harga plan lama dan harga plan baru
- Jumlahnya tidak bergantung pada kapan perubahan dilakukan dalam siklus. Upgrade yang sama memiliki biaya yang sama pada hari ke-1 maupun hari ke-29
- Saat upgrade, pelanggan langsung ditagih sejumlah selisihnya. Contoh, $30/bulan → $80/bulan = $50 ditagihkan secara langsung
- Saat downgrade, selisih harga disimpan sebagai kredit yang berlaku untuk subscription dan diterapkan secara otomatis pada renewal berikutnya. Contoh, $50/bulan → $20/bulan = $30 disimpan sebagai kredit
4. do_not_bill
- Menerapkan perubahan plan secara langsung tetapi tidak menagih apa pun saat perubahan dilakukan. Plan, kuantitas, dan add-on baru dapat langsung digunakan
- Karena tidak ada tagihan saat ini, upgrade memberikan plan yang lebih tinggi secara gratis kepada pelanggan selama sisa siklus saat ini. Downgrade berlaku langsung tanpa kredit untuk bagian siklus yang belum digunakan dan telah dibayar
- Add-on yang diberikan melalui
do_not_billtidak dikreditkan pada perubahan plan berikutnya karena add-on tersebut tidak pernah ditagihkan. Perubahan berikutnya menagihkan kuantitas add-on baru secara penuh - Plan yang diperbarui (beserta kuantitas/add-on) ditagihkan pada renewal terjadwal berikutnya, dan tanggal penagihan awal tetap dipertahankan
Perilaku
- Saat Anda memanggil API ini, Dodo Payments langsung memulai charge berdasarkan opsi proration yang dipilih
- Dengan
prorated_immediately, kredit untuk bagian siklus saat ini yang tidak terpakai dihitung pada setiap perubahan, baik upgrade maupun downgrade. Jika kredit tersebut melebihi charge siklus baru, sisa kredit ditambahkan ke saldo kredit subscription. Kredit ini khusus untuk subscription tersebut dan hanya digunakan untuk mengimbangi pembayaran berulang di masa mendatang pada subscription yang sama - Dengan
difference_immediately, nilai bersih selalu sama persis dengan selisih harga. Untuk downgrade, kelebihannya disimpan sebagai kredit yang berlaku untuk subscription, sama sepertiprorated_immediately - Opsi
full_immediatelymengabaikan perhitungan kredit dan menagihkan jumlah penuh plan baru - Opsi
do_not_billmenerapkan perubahan secara langsung tetapi menunda penagihan hingga tanggal renewal berikutnya, yang tetap dipertahankan
Pemrosesan Charge
- Charge langsung yang dimulai saat perubahan plan biasanya selesai diproses dalam waktu kurang dari 2 menit
- Jika charge langsung ini gagal karena alasan apa pun, subscription secara otomatis ditangguhkan hingga masalah teratasi
Subscription On-Demand
Subscription on-demand memungkinkan Anda menagih pelanggan secara fleksibel, bukan hanya berdasarkan jadwal tetap. Fitur ini tersedia untuk semua akun.
subscription_data.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 pelanggan untuk transaksi tersebut.
Untuk panduan lengkap langkah demi langkah (termasuk contoh request/response, kebijakan retry yang aman, dan penanganan webhook), lihat On-Demand Subscriptions Guide.
Hal Penting yang Perlu Diketahui tentang Penagihan Subscription
Trial melakukan otorisasi $0, bukan charge. Saat subscription memiliki trial, dimulainya trial membuat otorisasi mandate $0 untuk menyimpan kartu; charge pertama yang sebenarnya dilakukan saat trial berakhir. Dalam daftar pembayaran, subscription dalam free trial menampilkan tepat satu pembayaran dengan
total_amount sebesar 0. Paid trial menagihkan trial_amount di muka.Siklus subscription:
past_due = renewal gagal dan grace period sedang berlangsung (pelanggan tetap memiliki akses). on_hold = renewal gagal (dapat dipulihkan: minta pelanggan memperbarui payment method; retry dunning berlaku). expired = masa berlaku berakhir tanpa renewal dan tidak dapat diaktifkan kembali. Pelanggan harus melakukan subscription ulang. cancelled = diakhiri oleh pelanggan atau merchant. Sebagian besar kegagalan renewal adalah penolakan dari pihak issuer (dana tidak mencukupi, kartu ditolak), bukan error Dodo.Referensi API Terkait
Create Subscription (Deprecated)
API lama untuk membuat subscription secara langsung. Gunakan Checkout Sessions untuk integrasi baru
Change Subscription Plan
Referensi API untuk meng-upgrade, men-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