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.

What is a subscription upgrade or downgrade?

Changing plans lets you move a customer between subscription tiers or quantities. Use it to:
  • Align pricing with usage or features
  • Move from monthly to annual (or vice versa)
  • Adjust quantity for seat-based products
Plan changes can trigger an immediate charge depending on the proration mode you choose.

When to use plan changes

  • 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
For detailed setup instructions, see our 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:
Best for: SaaS applications wanting to charge fairly for unused time
  • Calculates exact prorated amount based on remaining cycle time
  • Charges a prorated amount based on unused time remaining in the cycle
  • Provides transparent billing to customers
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
The new product ID to change the subscription to.
integer
wajib
Jumlah unit untuk rencana baru (untuk produk berbasis kursi).
string
wajib
How to handle immediate billing: prorated_immediately, full_immediately, difference_immediately, or do_not_bill.
array
Optional addons for the new plan. Leaving this empty removes any existing addons.
string
Controls behavior when the plan change payment fails:
  • prevent_change: Keep subscription on current plan until payment succeeds
  • apply_change (default): Apply plan change immediately regardless of payment outcome
If not specified, uses the business-level default setting.
Kumpulkan jumlah perubahan paket melalui tautan pembayaran, bukan dengan menagih metode pembayaran tersimpan milik subscription. Customer membayar di halaman checkout yang di-host.Memerlukan capability allow_plan_change_via_payment_link milik business (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.
array
Kode diskon stacked opsional yang diterapkan ke paket baru (maks. 20, diterapkan sesuai urutan array). Perilakunya bergantung pada nilai yang Anda kirim:
  • 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 subscription.
  • ["CODE_A", "CODE_B", ...] — mengganti 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 untuk tanggal penagihan berikutnya. Customer mempertahankan paket saat ini hingga periode penagihan berakhir.
Gunakan next_billing_date untuk downgrade agar customer 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, subscription diperbarui
  • subscription.plan_changed: Paket subscription diubah (upgrade/downgrade/pembaruan addon)
  • subscription.on_hold: Penagihan perubahan paket gagal, renewal dihentikan
  • payment.succeeded: Penagihan segera untuk perubahan paket berhasil
  • payment.failed: Penagihan segera 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 customer dengan detail paket baru
  • Kirim email konfirmasi tentang perubahan paket
  • Catat perubahan billing untuk keperluan audit
6

Test and Monitor

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

Preview Perubahan Paket

Sebelum mengonfirmasi perubahan paket, gunakan Preview API untuk menunjukkan secara tepat kepada customer jumlah yang akan ditagihkan:
Gunakan preview API untuk membuat dialog konfirmasi yang menampilkan jumlah persis yang akan ditagihkan kepada customer sebelum mereka mengonfirmasi perubahan paket.

Change Plan API

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

Contoh quick start

Perubahan paket yang berhasil segera mengembalikan 200 OK — sebelum penagihan apa pun benar-benar diselesaikan. Isi body (ChangePlanResponse) bergantung pada cara perubahan tersebut ditagihkan:
Dalam setiap kasus, response ini bukan hasil pembayaran — response ini hanya menunjukkan bahwa request telah diterima. Response ini tidak menyatakan apakah penagihan segera benar-benar berhasil.Untuk penagihan segera biasa, hasilnya diselesaikan secara off-session, segera setelah pemanggilan.Untuk request collect_via_payment_link, hasilnya diselesaikan kemudian secara asynchronous — response hanya memberikan tautan checkout, subscription tetap menggunakan paket saat ini, dan hasilnya belum diketahui sampai customer menyelesaikan pembayaran melalui tautan tersebut.Bagaimanapun, jangan menyimpulkan hasil dari response ini. Konfirmasikan melalui webhook (payment.succeeded, payment.failed, subscription.plan_changed) atau dengan membaca ulang subscription menggunakan GET /subscriptions/{subscription_id} — lihat What Happens While the Link Is Unpaid khusus untuk kasus payment-link.
Jika penagihan segera gagal, subscription dapat berpindah ke status subscription.on_hold hingga pembayaran berhasil.

Mengumpulkan Pembayaran melalui Tautan Checkout

Secara default, perubahan paket segera menagih metode pembayaran tersimpan milik subscription secara langsung. Atur collect_via_payment_link: true untuk mengarahkan customer ke halaman checkout yang di-host — berguna ketika tidak ada metode pembayaran tersimpan yang boleh Anda tagih secara off-session, atau ketika Anda ingin customer mengonfirmasi harga baru secara aktif.
Hal ini juga menjadi dasar toggle Collect Plan Change Payments by Payment Link di Settings → Subscriptions, yang mengarahkan alur perubahan paket pada Customer Portal bawaan melalui checkout, bukan melalui kartu tersimpan.

Persyaratan

collect_via_payment_link: true hanya berhasil jika semua kondisi berikut terpenuhi — jika tidak, request gagal dengan 422:
  • Business telah 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 karena tidak ada penagihan sampai perubahan diterapkan.
  • on_payment_failure efektif menghasilkan prevent_change. Anda tidak perlu mengirimkannya secara eksplisit — jika default tingkat business (lihat Business & Collection Defaults di bawah) sudah berupa prevent_change, penghilangan field ini juga memenuhi persyaratan. apply_change eksplisit, atau default terselesaikan berupa apply_change, akan gagal dengan 422.
collect_via_payment_link tidak terbatas pada upgrade — ini berlaku untuk perubahan segera apa pun yang menghasilkan penagihan, termasuk downgrade, selama persyaratan di atas terpenuhi.
Jika perubahan menghasilkan nol atau kreditproration_billing_mode: do_not_bill, atau mode lain yang kebetulan menghasilkan jumlah bersih nol pada siklus ini — tidak ada yang dapat dimasukkan ke halaman checkout. Tidak ada payment link yang diterbitkan, payment_link dan lainnya akan mengembalikan null, dan perubahan langsung diterapkan, sama seperti jika collect_via_payment_link tidak digunakan. Ini bukan 422; flag hanya berlaku ketika ada jumlah positif yang perlu dikumpulkan. Jika Anda menetapkan collect_via_payment_link secara umum pada perubahan paket, bukan hanya pada upgrade yang jelas, panggil Preview Plan Change terlebih dahulu dan hanya minta tautan ketika jumlah hasil preview layak dikumpulkan.
Request yang berhasil mengembalikan handle checkout:

Yang Terjadi Selama Tautan Belum Dibayar

  • Subscription tetap menggunakan paket saat iniproduct_id, recurring_pre_tax_amount, dan next_billing_date semuanya tidak berubah sampai tautan dibayar.
  • Request change-plan berikutnya pada subscription yang sama ditolak dengan 409 PendingPlanChangeExists selama tautan masih tertunda. Batalkan perubahan terjadwal dengan DELETE /subscriptions/{subscription_id}/change-plan/scheduled jika diperlukan, tetapi endpoint tersebut tidak membatalkan perubahan payment-link yang tertunda — hanya pembayaran yang berhasil atau masa berlaku yang berakhir yang dapat melakukannya.
  • Customer dapat mencoba kembali menggunakan kartu pada sesi checkout yang sama setelah penolakan; pemanggilan change-plan baru bukan jalur untuk mencoba kembali.
  • Jika tautan tidak pernah dibayar, tautan berhenti berfungsi setelah expires_on — subscription secara otomatis dapat menerima request perubahan paket baru tidak lama kemudian.
  • Jika perubahan terjadwal (next_billing_date) sudah ada dan Anda menggantinya dengan cancel_scheduled_change_plan: true, jadwal awal tetap berlaku selama tautan belum dibayar, dan baru dibatalkan setelah tautan dibayar — dalam transaksi yang sama saat paket baru diterapkan.
Setelah perubahan melalui payment-link segera diterbitkan, setiap request perubahan paket berikutnya pada subscription tersebut — termasuk preview yang tidak memiliki efek samping — diblokir sampai tautan terselesaikan. Jangan menerbitkan tautan yang tidak Anda inginkan untuk segera dibayar customer.

Mengelola Addon

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

Menerapkan Kode Diskon

Anda dapat menerapkan satu atau beberapa kode diskon stacked saat mengubah paket subscription (maks. 20, diterapkan sesuai urutan array). Ini berguna untuk menawarkan harga promosi pada upgrade atau migrasi.

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 diubah. Field ini tidak dapat digabungkan dengan discount_codes dalam request yang sama. Migrasikan ke bentuk array jika sudah siap.
Gunakan Preview Plan Change API dengan discount_codes untuk menunjukkan kepada customer jumlah yang dapat mereka hemat sebelum mengonfirmasi perubahan paket.

Mode Proration

Pilih cara menagih customer saat mengubah paket:

prorated_immediately

  • Menagih selisih sebagian untuk siklus saat ini
  • Jika sedang trial, segera menagih dan beralih ke paket baru
  • Downgrade: dapat menghasilkan kredit prorata yang diterapkan pada renewal mendatang

full_immediately

  • Menagih jumlah penuh paket baru segera
  • Mengabaikan sisa waktu dari paket lama
Kredit yang dibuat oleh downgrade menggunakan difference_immediately memiliki cakupan subscription dan berbeda dari entitlement Credit-Based Billing. Kredit tersebut secara otomatis diterapkan pada renewal mendatang untuk subscription yang sama dan tidak dapat dipindahtangankan antar-subscription.

difference_immediately

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

do_not_bill

  • Tidak ada penagihan atau kredit yang dihitung
  • Customer segera beralih ke paket baru tanpa penyesuaian billing
  • Siklus billing tetap tidak berubah
  • Cocok untuk migrasi sebagai bentuk goodwill, perpindahan ke paket gratis, atau penyerapan perbedaan 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 billing: 30 hari, dimulai pada January 1
  • Perubahan paket terjadi pada January 16 (tersisa 15 hari, 15 hari telah digunakan)

Cara setiap mode memproses billing

Pilih prorated_immediately untuk perhitungan berbasis waktu yang adil; pilih full_immediately untuk memulai ulang billing; gunakan difference_immediately untuk upgrade sederhana dan kredit otomatis saat downgrade; atau gunakan do_not_bill untuk berganti paket tanpa penyesuaian billing apa pun.

Menangani Kegagalan Pembayaran

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

Mode Kegagalan Pembayaran

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

Kapan Menggunakan Setiap Mode

Default Business & Collection

Daripada mengirim parameter proration pada setiap perubahan paket, Anda dapat menetapkan perilaku default upgrade & downgrade sekali di tingkat business. Default ini berlaku untuk semua perubahan paket melalui customer portal dan dapat ditimpa pada setiap product collection. Terdapat default terpisah untuk upgrade dan downgrade: Konfigurasikan default business di Settings → Subscriptions, dan override collection pada setiap product collection. Setiap field collection bersifat independen — biarkan tidak diatur untuk mewarisi dari default business, atau tetapkan nilai untuk menimpanya hanya pada collection tersebut.

Urutan resolusi

Untuk perubahan paket apa pun, setiap pengaturan di-resolve dalam urutan berikut:
Nilai yang dikirim secara eksplisit ke Change Plan API selalu menjadi prioritas. Default business 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 customer membayar selisih dan langsung memperoleh akses, serta pertahankan downgrade pada next_billing_date agar customer tetap menggunakan paket saat ini hingga siklus berakhir.

Menangani webhook

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

Jenis event yang perlu ditangani

  • subscription.active: subscription diaktifkan
  • subscription.plan_changed: paket subscription diubah (upgrade/downgrade/perubahan addon)
  • subscription.on_hold: penagihan gagal, renewal dihentikan
  • subscription.renewed: renewal berhasil
  • payment.succeeded: pembayaran untuk perubahan paket atau renewal berhasil
  • payment.failed: pembayaran gagal
Kami menyarankan agar logika bisnis didorong oleh event subscription, dan event pembayaran digunakan untuk konfirmasi serta rekonsiliasi.

Memverifikasi signature dan menangani intent

Untuk schema payload terperinci, lihat Subscription webhook payloads dan Payment webhook payloads.

Praktik Terbaik

Ikuti rekomendasi berikut untuk perubahan paket subscription yang andal:

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 retry yang tepat
  • Pantau tingkat keberhasilan: Lacak tingkat keberhasilan/kegagalan perubahan paket dan selidiki masalah

Implementasi Webhook

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

User Experience

  • Berkomunikasi dengan jelas: Beri tahu customer tentang perubahan dan waktu billing
  • 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 pada antarmuka aplikasi Anda

Masalah Umum dan Solusi

Atasi masalah umum yang ditemui selama perubahan paket subscription:
Gejala: Pemanggilan API berhasil, tetapi subscription 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 yang kuat dengan logika retry
  • Gunakan operasi idempoten untuk pembaruan state
  • Tambahkan monitoring untuk mendeteksi dan memberi alert atas event webhook yang terlewat
  • Pastikan endpoint webhook dapat diakses dan merespons dengan benar
Gejala: Customer melakukan downgrade tetapi tidak melihat saldo kreditPenyebab umum:
  • Ekspektasi mode proration: downgrade memberikan kredit selisih harga paket penuh dengan difference_immediately, sedangkan prorated_immediately membuat kredit prorata berdasarkan sisa waktu dalam siklus
  • Kredit bersifat spesifik untuk subscription dan tidak berpindah antar-subscription
  • Saldo kredit tidak terlihat di dashboard customer
Solusi:
  • Gunakan difference_immediately untuk downgrade jika Anda menginginkan kredit otomatis
  • Jelaskan kepada customer bahwa kredit berlaku untuk renewal mendatang pada subscription 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:
  • Secret key webhook salah
  • Raw request body diubah sebelum verifikasi signature
  • Algoritma verifikasi signature salah
Solusi:
  • Pastikan Anda menggunakan DODO_WEBHOOK_SECRET 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 subscription atau ID produk tidak valid
  • Subscription tidak dalam state aktif
  • Parameter wajib tidak ada
  • Produk tidak tersedia untuk perubahan paket
Solusi:
  • Pastikan subscription 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 penagihan segera gagalPenyebab umum:
  • Dana pada metode pembayaran customer tidak mencukupi
  • Metode pembayaran kedaluwarsa atau tidak valid
  • Bank menolak transaksi
  • Deteksi fraud memblokir penagihan
Solusi:
  • Tangani event webhook payment.failed dengan tepat
  • Beri tahu customer untuk memperbarui metode pembayaran
  • Terapkan logika retry untuk kegagalan sementara
  • Pertimbangkan untuk mengizinkan perubahan paket meskipun penagihan segera gagal
Gejala: Penagihan perubahan paket gagal dan subscription berpindah ke state on_holdYang terjadi: Ketika penagihan perubahan paket gagal, subscription secara otomatis ditempatkan dalam state on_hold. Subscription tidak akan melakukan renewal secara otomatis sampai metode pembayaran diperbarui.Solusi: Perbarui metode pembayaran untuk mengaktifkan kembali subscriptionUntuk mengaktifkan kembali subscription dari state on_hold setelah perubahan paket gagal:
  1. Perbarui metode pembayaran menggunakan Update Payment Method API
  2. Pembuatan penagihan otomatis: API secara otomatis membuat penagihan untuk jumlah terutang yang tersisa
  3. Pembuatan invoice: Invoice dibuat untuk penagihan tersebut
  4. Pemrosesan pembayaran: Pembayaran diproses menggunakan metode pembayaran baru
  5. Pengaktifan kembali: Setelah pembayaran berhasil, subscription diaktifkan kembali ke state active
Event webhook yang perlu dipantau:
  • subscription.on_hold: Subscription ditahan (diterima saat penagihan perubahan paket gagal)
  • payment.succeeded: Pembayaran untuk jumlah terutang yang tersisa berhasil (setelah metode pembayaran diperbarui)
  • subscription.active: Subscription diaktifkan kembali setelah pembayaran berhasil
Praktik terbaik:
  • Beri tahu customer segera ketika penagihan perubahan paket gagal
  • Berikan instruksi yang jelas tentang cara memperbarui metode pembayaran
  • Pantau event webhook untuk melacak status pengaktifan kembali
  • Pertimbangkan untuk menerapkan logika retry otomatis bagi kegagalan pembayaran sementara

Update Payment Method API Reference

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

Menguji Implementasi Anda

Ikuti langkah-langkah berikut untuk menguji implementasi perubahan paket subscription Anda secara menyeluruh:
1

Set up test environment

  • Gunakan API key test dan produk test
  • Buat subscription 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 billing
  • Uji difference_immediately untuk upgrade dan downgrade
  • Uji full_immediately untuk mengatur ulang siklus billing
  • Uji do_not_bill untuk perpindahan paket tanpa penagihan/kredit
  • Pastikan perhitungan kredit sudah benar
3

Test webhook handling

  • Pastikan 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 subscription 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 customer untuk masalah perubahan paket

Penanganan Error

Tangani error API umum dengan baik dalam implementasi Anda:

HTTP Status Codes

Request perubahan paket berhasil diproses. Body response kosong, kecuali untuk request collect_via_payment_link yang berhasil, yang mengembalikan handle checkout — lihat Collecting Payment via a Checkout Link. Jika on_payment_failure=prevent_change, perubahan paket tetap tertunda sampai pembayaran berhasil.
Parameter request tidak valid. Pastikan semua field wajib diberikan dan diformat dengan benar.
API key tidak valid atau tidak ada. Pastikan DODO_PAYMENTS_API_KEY Anda benar dan memiliki permission yang sesuai.
ID subscription tidak ditemukan atau bukan milik akun Anda.
Perubahan paket yang tertunda sudah ada untuk subscription ini (PendingPlanChangeExists). Untuk perubahan terjadwal, batalkan dengan DELETE /subscriptions/{subscription_id}/change-plan/scheduled sebelum mengirim yang baru. Untuk perubahan payment-link yang tertunda, tidak ada endpoint pembatalan — subscription menerima request perubahan paket baru setelah customer membayar atau tautan kedaluwarsa.
Subscription tidak aktif atau bersifat on-demand, atau request tidak memenuhi syarat untuk collect_via_payment_link — business belum mengaktifkan capability, effective_at bukan immediately, atau on_payment_failure bukan prevent_change. Lihat Requirements.
Terjadi error server. Coba lagi request setelah jeda singkat.

Format Error Response

Langkah berikutnya

Terakhir diubah pada 26 Agustus 2026