Change Plan API
Plan Change Preview
Integration Guide
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
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
Step-by-Step Implementation Guide
Follow this comprehensive guide to implement subscription plan changes in your application:Understand Plan Change Requirements
- 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
Choose Your Proration Strategy
- prorated_immediately
- difference_immediately
- full_immediately
- do_not_bill
- 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
Implement the Change Plan API
prorated_immediately, full_immediately, difference_immediately, or do_not_bill.prevent_change: Keep subscription on current plan until payment succeedsapply_change(default): Apply plan change immediately regardless of payment outcome
preserve_on_plan_change=true, mã giảm giá hiện có sẽ được giữ lại (nếu áp dụng cho sản phẩm mới).immediately(mặc định): Áp dụng thay đổi kế hoạch ngay lập tứcnext_billing_date: Lên lịch thay đổi cho ngày thanh toán tiếp theo. Khách hàng giữ lại kế hoạch hiện tại cho đến khi kết thúc kỳ thanh toán.
next_billing_date cho các nâng cấp xuống để khách hàng giữ lại lợi ích của kế hoạch hiện tại cho đến khi kết thúc kỳ thanh toán.Handle Webhook Events
subscription.active: Thay đổi kế hoạch thành công, gói đăng ký được cập nhậtsubscription.plan_changed: Gói đăng ký thay đổi (nâng cấp/giảm cấp/cập nhật addon)subscription.on_hold: Thay đổi kế hoạch tính phí thất bại, tạm dừng gói đăng kýpayment.succeeded: Tính phí ngay lập tức cho thay đổi kế hoạch thành côngpayment.failed: Tính phí ngay lập tức thất bại
Update Your Application State
- Cấp/phủ nhận tính năng dựa trên kế hoạch mới
- Cập nhật bảng điều khiển khách hàng với chi tiết kế hoạch mới
- Gửi email xác nhận về thay đổi kế hoạch
- Ghi lại thay đổi thanh toán cho mục đích kiểm toán
Test and Monitor
- Kiểm tra tất cả các chế độ tỷ lệ ứng với các kịch bản khác nhau
- Xác minh xử lý webhook hoạt động chính xác
- Giám sát tỷ lệ thành công của thay đổi kế hoạch
- Thiết lập cảnh báo cho những thay đổi kế hoạch thất bại
Xem trước Thay đổi Kế hoạch
Trước khi cam kết thay đổi kế hoạch, sử dụng API Xem Trước để hiển thị chính xác những gì khách hàng sẽ bị tính phí:- Node.js SDK
- Python SDK
API Thay đổi Kế hoạch
Sử dụng API Thay đổi Kế hoạch để thay đổi sản phẩm, số lượng và hành vi tỷ lệ của một gói đăng ký đang hoạt động.Ví dụ bắt đầu nhanh
- Node.js SDK
- Python SDK
- Go SDK
- HTTP
invoice_id và payment_id chỉ được trả về khi một khoản phí và/hoặc hóa đơn được tạo trong quá trình thay đổi kế hoạch. Luôn dựa vào các sự kiện webhook (ví dụ: payment.succeeded, subscription.plan_changed) để xác nhận kết quả.Quản lý Addons
Khi thay đổi gói đăng ký, bạn cũng có thể điều chỉnh addons:Áp dụng Mã Giảm Giá
Bạn có thể áp dụng mã giảm giá khi thay đổi gói đăng ký. Điều này hữu ích để cung cấp giá khuyến mãi cho nâng cấp hoặc di chuyển.- Node.js SDK
- Python SDK
- HTTP
Hành vi mã giảm giá khi thay đổi kế hoạch
| Kịch bản | Hành vi |
|---|---|
discount_code được cung cấp | Xác thực và áp dụng giảm giá cho kế hoạch mới. |
Không có mã cung cấp, mã giảm giá hiện có với preserve_on_plan_change=true | Mã giảm giá hiện có được tự động giữ nguyên nếu áp dụng cho sản phẩm mới. |
| Không có mã cung cấp, không có mã giảm giá bảo lưu | Không có mã giảm giá nào được áp dụng cho kế hoạch mới. |
Chế độ tính tỷ lệ
Chọn cách để thanh toán khách hàng khi thay đổi gói:prorated_immediately
- Tính phí cho sự chênh lệch phần còn lại trong chu kỳ hiện tại
- Nếu đang trong giai đoạn thử nghiệm, tính phí ngay và chuyển sang gói mới ngay lập tức
- Hạ cấp: có thể tạo ra một khoản tín dụng tỷ lệ áp dụng cho các gia hạn tương lai
full_immediately
- Tính phí đầy đủ cho gói mới ngay lập tức
- Bỏ qua thời gian còn lại từ gói cũ
difference_immediately là thuộc phạm vi gói đăng ký và khác biệt với các quyền lợi Thanh toán dựa trên tín dụng. Chúng tự động áp dụng cho các gia hạn tương lai của cùng một gói đăng ký và không thể chuyển giữa các gói đăng ký.difference_immediately
- Nâng cấp: tính phí ngay lập tức chênh lệch giá giữa gói cũ và mới
- Hạ cấp: thêm giá trị còn lại dưới dạng tín dụng nội bộ vào gói đăng ký và tự động áp dụng cho các lần gia hạn
do_not_bill
- Không tính phí hoặc tín dụng
- Khách hàng chuyển ngay sang gói mới mà không cần điều chỉnh thanh toán
- Chu kỳ thanh toán không thay đổi
- Tốt cho các lần di chuyển lịch sự, chuyển đổi gói miễn phí, hoặc hấp thụ chênh lệch chi phí
| Tính năng | prorated_immediately | difference_immediately | full_immediately | do_not_bill |
|---|---|---|---|---|
| Phí nâng cấp | Chênh lệch tỷ lệ cho các ngày còn lại | Chênh lệch giá đầy đủ giữa các kế hoạch | Giá đầy đủ cho gói mới | Không tính phí |
| Tín dụng hạ cấp | Tín dụng tỷ lệ cho các ngày còn lại | Chênh lệch giá đầy đủ dưới dạng tín dụng | Không có tín dụng | Không có tín dụng |
| Chu kỳ thanh toán | Không thay đổi | Không thay đổi | Đặt lại vào hôm nay | Không thay đổi |
| Hành vi thử nghiệm | Kết thúc thử nghiệm, tính phí ngay | Kết thúc thử nghiệm, tính phí ngay | Kết thúc thử nghiệm, tính phí đầy đủ | Kết thúc thử nghiệm, không tính phí |
| Tốt nhất cho | Thanh toán công bằng theo thời gian | Tính toán nâng cấp/hạ cấp đơn giản | Đặt lại chu kỳ thanh toán | Di chuyển miễn phí hoặc chuyển đổi lịch sự |
| Phức tạp | Trung bình (tính toán ngày) | Thấp (trừ đơn giản) | Thấp (tính phí đầy đủ) | Không |
Kịch bản ví dụ
Sử dụng các con số tiêu chuẩn này nhất quán:- Gói hiện tại: Basic với $30/tháng
- Mục tiêu nâng cấp: Pro với $80/tháng
- Mục tiêu hạ cấp (từ Pro): Starter với $20/tháng
- Chu kỳ thanh toán: 30 ngày, bắt đầu vào ngày 1 tháng 1
- Thay đổi kế hoạch diễn ra vào ngày 16 tháng 1 (15 ngày còn lại, 15 ngày đã sử dụng)
Upgrade: Basic ($30) → Pro ($80) with prorated_immediately
Upgrade: Basic ($30) → Pro ($80) with prorated_immediately
Downgrade: Pro ($80) → Starter ($20) with prorated_immediately
Downgrade: Pro ($80) → Starter ($20) with prorated_immediately
Upgrade: Basic ($30) → Pro ($80) with difference_immediately
Upgrade: Basic ($30) → Pro ($80) with difference_immediately
Downgrade: Pro ($80) → Starter ($20) with difference_immediately
Downgrade: Pro ($80) → Starter ($20) with difference_immediately
Upgrade: Basic ($30) → Pro ($80) with full_immediately
Upgrade: Basic ($30) → Pro ($80) with full_immediately
Mid-cycle upgrade with add-ons using prorated_immediately
Mid-cycle upgrade with add-ons using prorated_immediately
Cách mỗi chế độ xử lý thanh toán
Xử lý sự cố Thanh toán
Kiểm soát những gì xảy ra khi thanh toán thay đổi kế hoạch thất bại bằng cách sử dụng tham sốon_payment_failure.
Chế độ Xử lý Sự cố Thanh toán
- prevent_change (Recommended for critical upgrades)
- apply_change (Default)
- Thay đổi kế hoạch được đánh dấu là “đang chờ xử lý”
- Khách hàng giữ quyền truy cập vào kế hoạch hiện tại
- Gói đăng ký chuyển sang trạng thái
activechỉ sau khi thanh toán thành công - Hữu ích khi bạn muốn đảm bảo thanh toán trước khi cấp quyền truy cập nâng cấp
on_payment_failure sử dụng cài đặt mặc định của cấp doanh nghiệp của bạn được cấu hình trong bảng điều khiển.Khi nào nên Sử dụng Mỗi Chế độ
| Kịch bản | Chế độ Khuyến nghị | Lý do |
|---|---|---|
| Nâng cấp lên các tính năng cao cấp | prevent_change | Đảm bảo thanh toán trước khi cấp quyền truy cập |
| Tăng số lượng (nhiều chỗ ngồi hơn) | prevent_change | Ngăn chặn sử dụng mà không thanh toán |
| Hạ cấp kế hoạch | apply_change | Khách hàng đang giảm chi tiêu |
| Khách hàng doanh nghiệp tin cậy | apply_change | Rủi ro không thanh toán thấp hơn |
| Chuyển đổi từ thử nghiệm sang trả phí | prevent_change | Thời điểm thanh toán quan trọng |
Xử lý webhook
Theo dõi trạng thái gói đăng ký thông qua webhook để xác nhận thay đổi kế hoạch và thanh toán.Các loại sự kiện cần xử lý
subscription.active: gói đăng ký được kích hoạtsubscription.plan_changed: gói đăng ký đã thay đổi (nâng cấp/hạ cấp/thay đổi addon)subscription.on_hold: tính phí thất bại, gói đăng ký tạm dừngsubscription.renewed: gia hạn thành côngpayment.succeeded: thanh toán cho thay đổi kế hoạch hoặc gia hạn thành côngpayment.failed: thanh toán thất bại
Xác nhận chữ ký và xử lý ý định
- Next.js Route Handler
- Express.js
Các Thực tiễn Tốt nhất
Thực hiện các lời khuyên sau để đảm bảo thay đổi kế hoạch đăng ký đáng tin cậy:Chiến lược Thay đổi Kế hoạch
- Kiểm tra kỹ lưỡng: Luôn kiểm tra các thay đổi kế hoạch trong chế độ kiểm tra trước khi triển khai vào sản xuất
- Chọn chế độ tỷ lệ cẩn thận: Chọn chế độ tỷ lệ phù hợp với mô hình kinh doanh của bạn
- Xử lý lỗi một cách linh hoạt: Triển khai xử lý lỗi đúng cách và logic thử lại
- Giám sát tỷ lệ thành công: Theo dõi tỷ lệ thành công/thất bại của thay đổi kế hoạch và điều tra các vấn đề
Triển khai Webhook
- Xác nhận chữ ký: Luôn xác thực chữ ký webhook để đảm bảo tính xác thực
- Triển khai idempotency: Xử lý các sự kiện webhook trùng lặp một cách linh hoạt
- Xử lý không đồng bộ: Không chặn phản hồi webhook với các hoạt động nặng
- Ghi đè mọi thứ: Duy trì log chi tiết để gỡ lỗi và kiểm toán
Trải nghiệm Người dùng
- Giao tiếp rõ ràng: Thông báo cho khách hàng về các thay đổi thanh toán và thời gian
- Cung cấp xác nhận: Gửi email xác nhận cho những thay đổi kế hoạch thành công
- Xử lý các trường hợp biên: Xem xét thời gian thử nghiệm, các tỷ lệ và thanh toán thất bại
- Cập nhật giao diện ngay lập tức: Phản ánh các thay đổi kế hoạch trong giao diện ứng dụng của bạn
Các sự cố Phổ biến và Giải pháp
Giải quyết các vấn đề thường gặp trong quá trình thay đổi kế hoạch đăng ký:Charge created but subscription not updated
Charge created but subscription not updated
- Xử lý webhook thất bại hoặc bị chậm trễ
- Trạng thái ứng dụng không được cập nhật sau khi nhận webhook
- Vấn đề giao dịch cơ sở dữ liệu trong quá trình cập nhật trạng thái
- Triển khai xử lý webhook mạnh mẽ với logic thử lại
- Sử dụng các hoạt động idempotent để cập nhật trạng thái
- Thêm giám sát để phát hiện và cảnh báo về những sự kiện webhook bị thiếu
- Xác minh endpoint webhook có thể truy cập và phản hồi chính xác
Credits not applied after downgrade
Credits not applied after downgrade
- Kỳ vọng chế độ tỷ lệ: hạ cấp tín dụng toàn bộ sự chênh lệch giá kế hoạch với
difference_immediately, trong khiprorated_immediatelytạo ra một tín dụng tỷ lệ dựa trên thời gian còn lại trong chu kỳ - Các tín dụng là riêng cho từng gói đăng ký và không chuyển giữa các gói đăng ký
- Số dư tín dụng không hiển thị trong bảng điều khiển khách hàng
- Sử dụng
difference_immediatelycho hạ cấp khi bạn muốn tín dụng tự động - Giải thích với khách hàng rằng tín dụng áp dụng cho các lần gia hạn tương lai của cùng một gói đăng ký
- Triển khai cổng thông tin khách hàng để hiển thị số dư tín dụng
- Kiểm tra bản xem trước hóa đơn tiếp theo để xem tín dụng đã áp dụng
Webhook signature verification fails
Webhook signature verification fails
- Khóa bí mật webhook sai
- Yêu cầu raw body đã bị sửa đổi trước khi xác minh chữ ký
- Sai thuật toán xác minh chữ ký
- Xác thực rằng bạn đang sử dụng đúng
DODO_WEBHOOK_SECRETtừ bảng điều khiển - Đọc body yêu cầu raw trước bất kỳ trình xử lý trung gian phân tích JSON nào
- Sử dụng thư viện xác minh webhook tiêu chuẩn cho nền tảng của bạn
- Kiểm tra xác minh chữ ký webhook trong môi trường phát triển
Plan change fails with 422 error
Plan change fails with 422 error
- ID đăng ký không hợp lệ hoặc ID sản phẩm
- Gói đăng ký không ở trạng thái hoạt động
- Thiếu các tham số yêu cầu
- Sản phẩm không khả dụng cho thay đổi kế hoạch
- Xác minh gói đăng ký tồn tại và đang hoạt động
- Kiểm tra ID sản phẩm hợp lệ và có sẵn
- Đảm bảo mọi tham số yêu cầu đã được cung cấp
- Xem lại tài liệu API để biết các yêu cầu về tham số
Immediate charge fails during plan change
Immediate charge fails during plan change
- Không đủ tiền trên phương thức thanh toán của khách hàng
- Phương thức thanh toán hết hạn hoặc không hợp lệ
- Ngân hàng từ chối giao dịch
- Phát hiện gian lận đã chặn khoản phí
- Xử lý sự kiện webhook
payment.failedmột cách thích hợp - Thông báo cho khách hàng để cập nhật phương thức thanh toán
- Triển khai logic thử lại cho các lỗi tạm thời
- Cân nhắc cho phép thay đổi kế hoạch với các khoản phí ngay lập tức không thành công
Subscription on hold after plan change
Subscription on hold after plan change
on_holdĐiều gì xảy ra:
Khi một thay đổi kế hoạch phí thất bại, gói đăng ký tự động được đặt vào trạng thái on_hold. Gói đăng ký sẽ không tự động gia hạn cho đến khi phương thức thanh toán được cập nhật.Giải pháp: Cập nhật phương thức thanh toán để kích hoạt gói đăng ký lạiĐể kích hoạt lại một gói đăng ký từ trạng thái on_hold sau khi thay đổi kế hoạch thất bại:- Cập nhật phương thức thanh toán sử dụng API Cập nhật Phương thức Thanh toán
- Tạo khoản phí tự động: API tự động tạo một khoản phí cho các khoản phải trả còn lại
- Tạo hóa đơn: Một hóa đơn được tạo cho khoản phí
- Xử lý thanh toán: Thanh toán được xử lý bằng phương thức thanh toán mới
- Kích hoạt lại: Sau khi thanh toán thành công, gói đăng ký được kích hoạt lại về trạng thái
active
subscription.on_hold: Gói đăng ký bị giữ lại (được nhận khi thay đổi kế hoạch phí thất bại)payment.succeeded: Thanh toán cho các khoản nợ còn lại thành công (sau khi cập nhật phương thức thanh toán)subscription.active: Gói đăng ký được kích hoạt lại sau khi thanh toán thành công
- Thông báo ngay cho khách hàng khi thay đổi kế hoạch phí thất bại
- Cung cấp hướng dẫn rõ ràng về cách cập nhật phương thức thanh toán của họ
- Giám sát sự kiện webhook để theo dõi trạng thái kích hoạt lại
- Cân nhắc triển khai logic thử lại tự động cho các lỗi thanh toán tạm thời
Update Payment Method API Reference
Thử nghiệm Triển khai của Bạn
Thực hiện các bước sau để thử nghiệm kỹ lưỡng triển khai thay đổi kế hoạch đăng ký của bạn:Set up test environment
- Sử dụng khóa API thử nghiệm và sản phẩm thử nghiệm
- Tạo gói đăng ký thử nghiệm với các loại kế hoạch khác nhau
- Cấu hình endpoint webhook thử nghiệm
- Thiết lập giám sát và ghi log
Test different proration modes
- Kiểm tra
prorated_immediatelyvới các vị trí chu kỳ thanh toán khác nhau - Kiểm tra
difference_immediatelycho nâng cấp và hạ cấp - Kiểm tra
full_immediatelyđể đặt lại chu kỳ thanh toán - Kiểm tra
do_not_billcho các chuyển đổi kế hoạch không tính phí/không có tín dụng - Xác minh tính toán tín dụng là chính xác
Test webhook handling
- Xác minh tất cả các sự kiện webhook liên quan được nhận
- Kiểm tra xác minh chữ ký webhook
- Xử lý sự kiện webhook trùng lặp một cách linh hoạt
- Kiểm tra kịch bản xử lý thất bại webhook
Test error scenarios
- Kiểm tra với ID đăng ký không hợp lệ
- Kiểm tra với phương thức thanh toán hết hạn
- Kiểm tra lỗi mạng và thời gian chờ
- Kiểm tra với số tiền không đủ
Xử lý Lỗi
Xử lý các lỗi API phổ biến một cách linh hoạt trong triển khai của bạn:Mã Trạng thái HTTP
200 OK
200 OK
400 Bad Request
400 Bad Request
401 Unauthorized
401 Unauthorized
404 Not Found
404 Not Found
422 Unprocessable Entity
422 Unprocessable Entity
500 Internal Server Error
500 Internal Server Error
Định dạng Phản hồi Lỗi
Bước tiếp theo
- Xem lại API Thay đổi Kế hoạch
- Khám phá Thanh toán Dựa trên Tín dụng
- Triển khai cảnh báo cho
subscription.on_hold - Xem hướng dẫn Tích hợp Webhook