Skip to main content

Change Plan API

Full API docs for updating subscriptions.

Plan Change Preview

See charge amounts before changing plans.

Integration Guide

Step-by-step subscription setup.

Apa Itu Upgrade atau Downgrade Subscription?

Ubah plan subscription pelanggan untuk memindahkan mereka antar-tier, menyesuaikan quantity untuk produk berbasis seat, atau memigrasikan mereka ke produk baru. API secara otomatis menghitung prorasi dan biaya berdasarkan billing mode yang Anda pilih.
Plan changes can trigger an immediate charge depending on the proration mode you choose.

Kapan Menggunakan Perubahan Plan

  • Upgrade when a customer needs more features, usage, or seats
  • Downgrade when usage decreases
  • Migrate users to a new product or price without cancelling their subscription

Plan Change Flow

Prerequisites

Before implementing subscription plan changes, ensure you have:
  • A Dodo Payments merchant account with active subscription products
  • API credentials (API key and webhook secret key) from the dashboard
  • An existing active subscription to modify
  • Webhook endpoint configured to handle subscription events
Untuk petunjuk penyiapan terperinci, lihat Integration Guide.

Step-by-Step Implementation Guide

Follow this comprehensive guide to implement subscription plan changes in your application:
1

Understand Plan Change Requirements

Before implementing, determine:
  • Which subscription products can be changed to which others
  • What proration mode fits your business model
  • How to handle failed plan changes gracefully
  • Which webhook events to track for state management
Test plan changes thoroughly in test mode before implementing in production.
2

Choose Your Proration Strategy

Select the billing approach that aligns with your business needs:
Cocok untuk: Aplikasi SaaS yang ingin memberikan kredit untuk waktu yang tidak terpakai pada plan lama.
  • Mengkreditkan bagian yang tidak terpakai dari siklus saat ini, diprorata berdasarkan waktu yang tersisa
  • Kemudian menagih satu siklus penuh pada plan baru — harga plan baru tidak pernah diprorata
  • Biaya bersih = siklus baru penuh − (fraksi yang tersisa × siklus lama penuh)
3

Implement the Change Plan API

Use the Change Plan API to modify subscription details:
string
wajib
The ID of the active subscription to modify.
string
wajib
ID produk baru yang digunakan untuk mengubah langganan.
integer
wajib
Jumlah unit untuk paket baru (untuk produk berbasis seat).
string
wajib
Cara menangani penagihan langsung: prorated_immediately, full_immediately, difference_immediately, atau do_not_bill.
array
Add-on opsional untuk paket baru. Menghilangkan field ini, mengirim null, atau mengirim array kosong akan menghapus add-on yang sudah ada, jadi sertakan add-on saat ini untuk mempertahankannya.
string
Mengontrol perilaku saat pembayaran perubahan paket gagal:
  • prevent_change: Pertahankan langganan pada paket saat ini hingga pembayaran berhasil
  • apply_change (default): Terapkan perubahan paket segera terlepas dari hasil pembayaran
If not specified, uses the business-level default setting.
Kumpulkan jumlah perubahan paket melalui payment link, bukan dengan menagih metode pembayaran tersimpan milik langganan. Pelanggan membayar di halaman checkout yang di-host.Memerlukan capability allow_plan_change_via_payment_link milik bisnis (Settings → Subscriptions → Collect Plan Change Payments by Payment Link), effective_at: immediately, dan on_payment_failure: prevent_change. Lihat Collecting Payment via a Checkout Link. Diabaikan oleh preview route.
string
URL yang menerima pelanggan setelah mereka membayar payment link. Pengalihan menambahkan subscription_id, payment_id, dan status. Memerlukan collect_via_payment_link: true; jika tidak, request gagal dengan 422. Lihat Mengalihkan Pelanggan Setelah Pembayaran.
Batalkan payment link yang belum dibayar untuk perubahan paket yang tertunda, sehingga request ini menggantikannya. Pembayaran yang sudah dibayar atau sedang berlangsung mengembalikan 409. Lihat Mengganti Payment Link yang Tertunda. Diabaikan oleh route preview.
array
Kode diskon stacked opsional untuk diterapkan pada paket baru (maks. 20, diterapkan sesuai urutan array). Perilakunya bergantung pada nilai yang dikirim:
  • Tidak diberikan / null — diskon yang ada dengan preserve_on_plan_change=true dipertahankan jika berlaku untuk produk baru.
  • [] (array kosong) — menghapus semua diskon yang ada dari langganan.
  • ["CODE_A", "CODE_B", ...] — mengganti semua diskon yang ada dengan set stacked ini.
string
usang
Deprecated — gunakan discount_codes untuk integrasi baru. Field ini masih berfungsi untuk kompatibilitas mundur, tetapi tidak dapat digabungkan dengan discount_codes dalam request yang sama.
string
default:"immediately"
Kapan perubahan paket diterapkan:
  • immediately (default): Terapkan perubahan paket segera
  • next_billing_date: Jadwalkan perubahan pada tanggal penagihan berikutnya. Pelanggan mempertahankan paket saat ini hingga periode penagihan berakhir. Gunakan ini untuk downgrade agar pelanggan tetap memperoleh manfaat paket saat ini hingga akhir periode penagihan.
4

Handle Webhook Events

Siapkan penanganan webhook untuk melacak hasil perubahan paket:
  • subscription.active: Perubahan paket berhasil, langganan diperbarui
  • subscription.plan_changed: Paket langganan berubah (upgrade/downgrade/pembaruan addon)
  • subscription.on_hold: Tagihan perubahan paket gagal, renewal dihentikan
  • payment.succeeded: Tagihan langsung untuk perubahan paket berhasil
  • payment.failed: Tagihan langsung gagal
Selalu verifikasi signature webhook dan terapkan pemrosesan event yang idempoten.
5

Update Your Application State

Berdasarkan event webhook, perbarui aplikasi Anda:
  • Berikan/cabut fitur berdasarkan paket baru
  • Perbarui dashboard pelanggan dengan detail paket baru
  • Kirim email konfirmasi tentang perubahan paket
  • Catat perubahan penagihan untuk keperluan audit
6

Test and Monitor

Uji implementasi Anda secara menyeluruh:
  • Uji semua mode proration dengan berbagai skenario
  • Verifikasi bahwa penanganan webhook berfungsi dengan benar
  • Pantau tingkat keberhasilan perubahan paket
  • Siapkan alert untuk perubahan paket yang gagal
Implementasi perubahan paket langganan Anda kini siap digunakan di production.

Preview Perubahan Paket

Sebelum menetapkan perubahan paket, gunakan Preview API untuk menunjukkan kepada pelanggan jumlah yang akan ditagihkan secara tepat:
Gunakan preview API untuk membuat dialog konfirmasi yang menampilkan jumlah pasti yang akan ditagihkan kepada pelanggan sebelum mereka mengonfirmasi perubahan paket.
Dalam immediate_charge.summary, customer_credits adalah perubahan bersih pada saldo kredit pelanggan, dalam mata uang yang diberikan oleh customer_credits_currency. Ini adalah mata uang credit wallet pelanggan, yaitu mata uang langganan. Mata uang ini dapat berbeda dari currency pada ringkasan, yang berlaku untuk total_amount dan tax. Misalnya, pelanggan yang membayar dalam INR untuk langganan USD akan melihat kredit dalam USD.

Change Plan API

Gunakan Change Plan API untuk mengubah produk, kuantitas, dan perilaku proration pada langganan aktif.

Contoh Quick Start

Perubahan paket yang berhasil mengembalikan 200 OK segera — sebelum tagihan benar-benar diselesaikan. Isi body (ChangePlanResponse) bergantung pada cara perubahan tersebut ditagihkan:
Response ini mengonfirmasi bahwa request diterima, bukan bahwa tagihan berhasil. Untuk tagihan langsung biasa, hasilnya diselesaikan off-session segera setelah pemanggilan. Untuk request collect_via_payment_link, langganan tetap menggunakan paket saat ini hingga pelanggan menyelesaikan pembayaran.Konfirmasikan hasilnya melalui webhook (payment.succeeded, payment.failed, subscription.plan_changed) atau dengan membaca ulang langganan menggunakan GET /subscriptions/{subscription_id} — lihat Yang Terjadi Saat Link Belum Dibayar untuk kasus payment link.
Jika tagihan langsung gagal, langganan dapat berpindah ke subscription.on_hold hingga pembayaran berhasil.
Secara default, perubahan paket langsung menagih metode pembayaran tersimpan milik langganan. Atur collect_via_payment_link: true untuk mengarahkan pelanggan ke halaman checkout yang di-host — berguna jika tidak ada metode pembayaran tersimpan atau Anda ingin pelanggan mengonfirmasi harga baru secara aktif.
Fitur ini mengaktifkan toggle Collect Plan Change Payments by Payment Link di Settings → Subscriptions, yang mengarahkan alur perubahan paket Customer Portal melalui checkout.

Persyaratan

collect_via_payment_link: true hanya berhasil jika semua kondisi berikut terpenuhi — jika tidak, request gagal dengan 422:
  • Bisnis mengaktifkan capability allow_plan_change_via_payment_link (Settings → Subscriptions → Collect Plan Change Payments by Payment Link).
  • effective_at adalah immediately (default). Perubahan terjadwal (next_billing_date) tidak pernah memerlukan halaman checkout.
  • Request menetapkan on_payment_failure: prevent_change. apply_change yang eksplisit gagal dengan 422.
collect_via_payment_link berlaku untuk setiap perubahan langsung yang menghasilkan tagihan, termasuk downgrade, selama persyaratan di atas terpenuhi.
Jika perubahan menghasilkan nilai nol atau kredit, payment link tidak diterbitkan: payment_link dan field checkout lainnya dikembalikan sebagai null, dan perubahan diterapkan segera. Ini bukan 422. Panggil Preview Plan Change terlebih dahulu untuk memeriksa jumlah sebelum meminta link.
Request yang berhasil mengembalikan handle checkout:
  • Langganan tetap menggunakan paket saat ini — product_id, recurring_pre_tax_amount, dan next_billing_date semuanya tidak berubah hingga link dibayar.
  • Request change-plan berikutnya ditolak dengan 409 PendingPlanChangeExists saat link masih tertunda. Untuk mengganti perubahan yang tertunda, kirim request baru dengan cancel_older_payment_link: true. Lihat Mengganti Payment Link yang Tertunda.
  • Untuk mencoba lagi setelah pembayaran ditolak, panggil kembali change-plan untuk mendapatkan link baru.
  • Jika link tidak pernah dibayar, link berhenti berfungsi setelah expires_on — langganan secara otomatis menjadi bebas untuk menerima request perubahan paket baru tidak lama setelahnya.
  • Jika perubahan terjadwal sudah ada dan Anda menggantinya dengan cancel_scheduled_change_plan: true, jadwal asli tetap berlaku saat link belum dibayar dan baru dibatalkan setelah link dibayar — dalam transaksi yang sama saat paket baru diterapkan.
Setelah perubahan melalui payment link langsung diterbitkan, setiap request perubahan paket berikutnya pada langganan tersebut — termasuk preview tanpa efek samping — diblokir hingga link diselesaikan. Request change-plan dapat mengganti link dengan menetapkan cancel_older_payment_link: true. Preview mengabaikan field ini, sehingga preview tetap diblokir.

Mengalihkan Pelanggan Setelah Pembayaran

Atur return_url untuk mengarahkan pelanggan kembali ke situs Anda setelah mereka membayar link:
Setelah checkout, pelanggan diarahkan ke return_url dengan parameter query berikut: Jika pembayaran gagal, langganan tetap aktif pada paket saat ini. Paket baru dapat diterapkan tidak lama setelah pengalihan, ketika webhook pembayaran tiba, jadi baca kembali langganan sebelum menampilkan paket baru. return_url memerlukan collect_via_payment_link: true. Tanpanya, request gagal dengan 422. Jika pelanggan meninggalkan checkout tanpa membayar, tetapkan cancel_older_payment_link: true pada request change-plan berikutnya. Dodo Payments membatalkan link yang belum dibayar, dan perubahan paket baru menggantikan perubahan yang tertunda. Link yang dibatalkan tidak lagi menerima pembayaran, bahkan pada halaman checkout yang sudah terbuka.
Request divalidasi sebelum link dibatalkan, sehingga request yang tidak valid mempertahankan link pelanggan. Link hanya dibatalkan jika pelanggan belum mulai membayar: Setiap request change-plan menerbitkan invoice sendiri. Perubahan paket yang diganti dan invoicenya dibatalkan. Jika tidak ada perubahan paket yang tertunda, cancel_older_payment_link tidak berpengaruh.
Pemeriksaan yang berjalan setelah validasi, misalnya jumlah tagihan minimum, tetap dapat gagal setelah link dibatalkan. Langganan kemudian tetap menggunakan paket saat ini tanpa link yang terbuka. Kirim kembali request untuk menerbitkan link baru.

Mengelola Addon

Saat mengubah paket langganan, Anda juga dapat mengubah addon:
Addon disertakan dalam penghitungan proration dan akan ditagihkan sesuai mode proration yang dipilih.

Menerapkan Kode Diskon

Terapkan satu atau beberapa kode diskon stacked saat mengubah paket langganan (maks. 20, diterapkan sesuai urutan array):

Perilaku Diskon Saat Perubahan Paket

Field tunggal discount_code pada endpoint ini deprecated, tetapi masih berfungsi untuk kompatibilitas mundur — integrasi yang ada tidak perlu segera berubah. Field ini tidak dapat digabungkan dengan discount_codes dalam request yang sama. Migrasikan ke bentuk array jika sudah memungkinkan.
Gunakan Preview Plan Change API dengan discount_codes untuk menunjukkan kepada pelanggan jumlah yang dapat mereka hemat secara tepat sebelum mengonfirmasi perubahan paket.

Mode Proration

Pilih cara menagih pelanggan saat mengubah paket:

prorated_immediately

  • Mengkreditkan bagian yang tidak digunakan dari siklus saat ini — paket dasar, kuantitas, dan addon — secara prorata berdasarkan sisa waktu
  • Kemudian menagihkan siklus penuh pada paket, kuantitas, dan addon baru. Tagihan itu sendiri tidak pernah diprorata
  • Tagihan langsung bersih = (siklus baru penuh) − (fraksi tersisa × siklus lama penuh)
  • Jika kredit melebihi tagihan siklus baru (umum pada downgrade), selisihnya disimpan sebagai kredit berskala langganan untuk renewal mendatang
  • Jika sedang trial, tagih segera dan beralih ke paket baru sekarang

full_immediately

  • Menagihkan jumlah penuh paket baru segera
  • Mengabaikan waktu tersisa dari paket lama — tidak ada kredit untuk siklus saat ini
Kredit yang dibuat oleh prorated_immediately dan oleh downgrade menggunakan difference_immediately berskala langganan dan berbeda dari entitlement Credit-Based Billing. Kredit tersebut otomatis diterapkan pada renewal mendatang untuk langganan yang sama dan tidak dapat dipindahkan antar-langganan.

difference_immediately

  • Upgrade: segera menagihkan selisih harga antara paket lama dan baru
  • Downgrade: menambahkan nilai tersisa sebagai kredit internal ke langganan dan menerapkannya otomatis pada renewal

do_not_bill

  • Tidak ada tagihan atau kredit yang dihitung
  • Pelanggan segera beralih ke paket baru tanpa penyesuaian penagihan
  • Siklus penagihan tetap tidak berubah
  • Cocok untuk migrasi sebagai bentuk layanan, perpindahan ke paket gratis, atau menyerap selisih biaya

Skenario Contoh

Gunakan angka kanonis berikut secara konsisten:
  • Paket saat ini: Basic seharga $30/bulan
  • Target upgrade: Pro seharga $80/bulan
  • Target downgrade (dari Pro): Starter seharga $20/bulan
  • Siklus penagihan: 30 hari, dimulai pada 1 Januari
  • Perubahan paket terjadi pada 16 Januari (tersisa 15 hari, 15 hari telah digunakan)

Cara Setiap Mode Memproses Penagihan

Pilih prorated_immediately untuk mengkreditkan waktu yang tidak digunakan pada paket lama sambil menagihkan satu siklus penuh paket baru; pilih full_immediately untuk memulai ulang penagihan; gunakan difference_immediately untuk upgrade sederhana dan kredit otomatis saat downgrade; atau gunakan do_not_bill untuk berpindah paket tanpa penyesuaian penagihan apa pun.

Menangani Kegagalan Pembayaran

Kontrol apa yang terjadi saat pembayaran perubahan paket gagal menggunakan parameter on_payment_failure.

Mode Kegagalan Pembayaran

Jika tidak ditentukan, parameter on_payment_failure menggunakan pengaturan default tingkat bisnis yang dikonfigurasi di dashboard.

Kapan Menggunakan Setiap Mode

Default Bisnis & Collection

Atur perilaku default upgrade dan downgrade di tingkat bisnis melalui Settings → Subscriptions. Default ini berlaku untuk semua perubahan paket melalui customer portal dan dapat ditimpa per product collection. Default terpisah tersedia untuk upgrade dan downgrade: Konfigurasikan default bisnis melalui Settings → Subscriptions, dan override collection pada setiap product collection. Setiap field collection bersifat independen — biarkan tidak diatur untuk mewarisi default bisnis, atau tetapkan nilai untuk menimpanya.

Urutan Resolusi

Untuk perubahan paket apa pun, setiap pengaturan ditentukan dalam urutan berikut:
Nilai yang dikirim secara eksplisit ke Change Plan API selalu memiliki prioritas. Default bisnis dan collection hanya berlaku jika tidak ada nilai eksplisit yang diberikan — seperti pada semua perubahan paket yang dimulai dari customer portal.
Konfigurasi umum: pertahankan upgrade pada immediately + difference_immediately agar pelanggan membayar selisih dan langsung memperoleh akses, serta pertahankan downgrade pada next_billing_date agar pelanggan tetap menggunakan paket saat ini hingga siklus berakhir.

Menangani Webhook

Lacak status langganan melalui webhook untuk mengonfirmasi perubahan paket dan pembayaran.

Jenis Event yang Ditangani

  • subscription.active: langganan diaktifkan
  • subscription.plan_changed: paket langganan berubah (upgrade/downgrade/perubahan addon)
  • subscription.on_hold: tagihan gagal, renewal dihentikan
  • subscription.renewed: renewal berhasil
  • payment.succeeded: pembayaran untuk perubahan paket atau renewal berhasil
  • payment.failed: pembayaran gagal
Jalankan logika bisnis berdasarkan event langganan dan gunakan event pembayaran untuk konfirmasi serta rekonsiliasi.

Memverifikasi Signature dan Menangani Intent

Untuk skema payload terperinci, lihat payload webhook Subscription dan payload webhook Payment.

Praktik Terbaik

Strategi Perubahan Paket

  • Uji secara menyeluruh: Selalu uji perubahan paket dalam test mode sebelum production
  • Pilih proration dengan cermat: Pilih mode proration yang sesuai dengan model bisnis Anda
  • Tangani kegagalan dengan baik: Terapkan penanganan error dan logika percobaan ulang yang tepat
  • Pantau tingkat keberhasilan: Lacak tingkat keberhasilan/kegagalan perubahan paket dan selidiki masalah

Implementasi Webhook

  • Verifikasi signature: Selalu validasi signature webhook untuk memastikan keasliannya
  • Terapkan idempotensi: Tangani event webhook duplikat dengan baik
  • Proses secara asynchronous: Jangan memblokir response webhook dengan operasi berat
  • Catat semuanya: Simpan log terperinci untuk debugging dan keperluan audit

User Experience

  • Berkomunikasi dengan jelas: Informasikan pelanggan tentang perubahan dan waktu penagihan
  • Berikan konfirmasi: Kirim konfirmasi email untuk perubahan paket yang berhasil
  • Tangani kasus khusus: Pertimbangkan periode trial, proration, dan pembayaran yang gagal
  • Perbarui UI segera: Tampilkan perubahan paket di interface aplikasi Anda

Masalah Umum dan Solusi

Atasi masalah umum yang ditemukan selama perubahan paket langganan:
Gejala: Panggilan API berhasil tetapi langganan tetap menggunakan paket lamaPenyebab umum:
  • Pemrosesan webhook gagal atau tertunda
  • State aplikasi tidak diperbarui setelah menerima webhook
  • Masalah transaksi database saat memperbarui state
Solusi:
  • Terapkan penanganan webhook dengan logika percobaan ulang
  • Gunakan operasi idempoten untuk pembaruan state
  • Tambahkan monitoring untuk mendeteksi dan memberi alert atas event webhook yang terlewat
  • Verifikasi endpoint webhook dapat diakses dan merespons dengan benar
Gejala: Pelanggan melakukan downgrade tetapi tidak melihat saldo kreditPenyebab umum:
  • Ekspektasi mode proration: downgrade mengkreditkan seluruh selisih harga paket dengan difference_immediately, sedangkan prorated_immediately mengkreditkan waktu yang tidak digunakan pada siklus lama lalu menagihkan satu siklus penuh pada paket baru — sehingga saldo kredit hanya tersisa jika kredit tersebut melebihi harga paket baru
  • Kredit bersifat spesifik untuk langganan dan tidak dapat dipindahkan antar-langganan
  • Saldo kredit tidak terlihat di dashboard pelanggan
Solusi:
  • Gunakan difference_immediately untuk downgrade saat Anda menginginkan kredit otomatis
  • Jelaskan kepada pelanggan bahwa kredit berlaku untuk renewal mendatang pada langganan yang sama
  • Implementasikan customer portal untuk menampilkan saldo kredit
  • Periksa preview invoice berikutnya untuk melihat kredit yang diterapkan
Gejala: Event webhook ditolak karena signature tidak validPenyebab umum:
  • Webhook secret key salah
  • Raw request body diubah sebelum verifikasi signature
  • Algoritma verifikasi signature salah
Solusi:
  • Verifikasi bahwa Anda menggunakan DODO_PAYMENTS_WEBHOOK_KEY yang benar dari dashboard
  • Baca raw request body sebelum middleware parsing JSON apa pun
  • Gunakan library verifikasi webhook standar untuk platform Anda
  • Uji verifikasi signature webhook di environment development
Gejala: API mengembalikan error 422 Unprocessable EntityPenyebab umum:
  • ID langganan atau ID produk tidak valid
  • Langganan tidak dalam status aktif
  • Parameter wajib tidak ada
  • Produk tidak tersedia untuk perubahan paket
Solusi:
  • Verifikasi langganan ada dan aktif
  • Periksa ID produk valid dan tersedia
  • Pastikan semua parameter wajib diberikan
  • Tinjau dokumentasi API untuk persyaratan parameter
Gejala: Perubahan paket dimulai tetapi tagihan langsung gagalPenyebab umum:
  • Dana tidak mencukupi pada metode pembayaran pelanggan
  • Metode pembayaran kedaluwarsa atau tidak valid
  • Bank menolak transaksi
  • Deteksi fraud memblokir tagihan
Solusi:
  • Tangani event webhook payment.failed dengan tepat
  • Beri tahu pelanggan untuk memperbarui metode pembayaran
  • Terapkan logika percobaan ulang untuk kegagalan sementara
  • Pertimbangkan untuk mengizinkan perubahan paket dengan tagihan langsung yang gagal
Gejala: Tagihan perubahan paket gagal dan langganan berpindah ke status on_holdYang terjadi: Saat tagihan perubahan paket gagal, langganan otomatis ditempatkan dalam status on_hold. Langganan tidak akan diperbarui secara otomatis hingga metode pembayaran diperbarui.Solusi: Perbarui metode pembayaran untuk mengaktifkan kembali langgananUntuk mengaktifkan kembali langganan dari status on_hold setelah perubahan paket gagal:
  1. Perbarui metode pembayaran menggunakan Update Payment Method API
  2. Pembuatan tagihan otomatis: API otomatis membuat tagihan untuk iuran yang tersisa
  3. Pembuatan invoice: Invoice dibuat untuk tagihan tersebut
  4. Pemrosesan pembayaran: Pembayaran diproses menggunakan metode pembayaran baru
  5. Reaktivasi: Setelah pembayaran berhasil, langganan diaktifkan kembali ke status active
Event webhook yang perlu dipantau:
  • subscription.on_hold: Langganan ditangguhkan (diterima saat tagihan perubahan paket gagal)
  • payment.succeeded: Pembayaran iuran tersisa berhasil (setelah metode pembayaran diperbarui)
  • subscription.active: Langganan diaktifkan kembali setelah pembayaran berhasil
Praktik terbaik:
  • Beri tahu pelanggan segera saat tagihan perubahan paket gagal
  • Berikan instruksi yang jelas tentang cara memperbarui metode pembayaran
  • Pantau event webhook untuk melacak status reaktivasi
  • Pertimbangkan untuk menerapkan logika percobaan ulang otomatis untuk kegagalan pembayaran sementara

Update Payment Method API Reference

Lihat dokumentasi API lengkap untuk memperbarui metode pembayaran dan mengaktifkan kembali langganan.

Menguji Implementasi Anda

Uji implementasi perubahan paket langganan Anda secara menyeluruh:
1

Set up test environment

  • Gunakan API key test dan produk test
  • Buat langganan test dengan berbagai jenis paket
  • Konfigurasikan endpoint webhook test
  • Siapkan monitoring dan logging
2

Test different proration modes

  • Uji prorated_immediately dengan berbagai posisi dalam siklus penagihan
  • Uji difference_immediately untuk upgrade dan downgrade
  • Uji full_immediately untuk mengatur ulang siklus penagihan
  • Uji do_not_bill untuk perpindahan paket tanpa tagihan/kredit
  • Verifikasi penghitungan kredit sudah benar
3

Test webhook handling

  • Verifikasi semua event webhook yang relevan diterima
  • Uji verifikasi signature webhook
  • Tangani event webhook duplikat dengan baik
  • Uji skenario kegagalan pemrosesan webhook
4

Test error scenarios

  • Uji dengan ID langganan yang tidak valid
  • Uji dengan metode pembayaran yang kedaluwarsa
  • Uji kegagalan jaringan dan timeout
  • Uji dengan dana yang tidak mencukupi
5

Monitor in production

  • Siapkan alert untuk perubahan paket yang gagal
  • Pantau waktu pemrosesan webhook
  • Lacak tingkat keberhasilan perubahan paket
  • Tinjau tiket dukungan pelanggan terkait masalah perubahan paket

Penanganan Error

Tangani error API umum dengan baik dalam implementasi Anda:

HTTP Status Codes

Request perubahan paket berhasil diproses. Body response adalah ChangePlanResponse dengan payment_id, payment_link, client_secret, dan expires_on. Keempatnya nullable, sehingga body diserialisasikan sebagai {} untuk perubahan off-session biasa; semuanya terisi untuk request collect_via_payment_link yang berhasil, yang mengembalikan handle checkout — lihat Mengumpulkan Pembayaran melalui Checkout Link. Jika on_payment_failure=prevent_change, perubahan paket tetap tertunda hingga pembayaran berhasil.
Parameter request tidak valid. Periksa bahwa semua field wajib diberikan dan diformat dengan benar.
API key tidak valid atau tidak ada. Verifikasi bahwa DODO_PAYMENTS_API_KEY Anda benar dan memiliki permission yang sesuai.
Perubahan paket yang tertunda sudah ada untuk langganan ini (PendingPlanChangeExists). Untuk perubahan terjadwal, batalkan dengan DELETE /subscriptions/{subscription_id}/change-plan/scheduled sebelum mengirimkan perubahan baru. Untuk perubahan payment-link yang tertunda, kirim request baru dengan cancel_older_payment_link: true untuk menggantinya. Lihat Mengganti Payment Link yang Tertunda.Dengan cancel_older_payment_link: true, 409 berarti pelanggan sedang membayar link sebelumnya (PLAN_CHANGE_PAYMENT_IN_PROGRESS) atau sudah membayarnya (PLAN_CHANGE_PAYMENT_ALREADY_COMPLETED).
Dengan cancel_older_payment_link: true, payment link sebelumnya tidak dapat dibatalkan (PLAN_CHANGE_LINK_CANCEL_FAILED). Tidak ada yang berubah, sehingga Anda dapat mencoba kembali request tersebut.
Langganan tidak aktif atau on-demand, atau request tidak memenuhi syarat untuk collect_via_payment_link — bisnis tidak mengaktifkan capability tersebut, effective_at bukan immediately, atau on_payment_failure bukan prevent_change. Lihat Persyaratan. ID langganan yang tidak ada atau bukan milik akun Anda mengembalikan 404 dengan code NOT_FOUND.
Terjadi error server. Coba lagi request setelah jeda singkat.

Format Error Response

Error mengembalikan body JSON dengan code dan message yang dapat dibaca manusia:
Lihat Error Codes untuk daftar lengkap.

Langkah Berikutnya

Terakhir diubah pada 28 September 2026