Upgrade or downgrade
Upgrade or downgrade subscriptions by replacing items on a subscription.
Depending on your billing model, you might let customers upgrade or downgrade their plan. This could mean:
- Customers want to change their base plan, for example going from Pro to Enterprise
- Customers want to change their billing frequency, for example going from monthly to annual
Add items to charge for new users, modules, or other addons
Adding or removing users, modules, one-off fees, or other addons typically involves adding or removing items. For example, you might offer a module called "Advanced Reporting" across all plans. See: Add or remove items
You can't make changes to a subscription if the next billing period is within 30 minutes, or the subscription status is
past_due
.
How it works
In Paddle, there's no rigid hierarchy of products. This means there's no formal distinction between products that you consider base plans and products that you consider addons.
When customers upgrade or downgrade, they're technically replacing items on their subscription. For example, if a customer moves from Pro to Enterprise, you'd remove the Pro product and replace it with the Enterprise one. You can do this in one API call, or on one screen in the Paddle dashboard.
Customers might also say that they're upgrading or downgrading when they change their billing frequency. For example, a customer might say that they'd like to "upgrade to the annual plan." In this case, you'd swap all monthly prices for annual prices.
When you make changes to items, you can determine how Paddle should bill for those changes. This is called proration. Paddle's subscription billing engine calculates proration to the minute, allowing for precise billing.
Recurring items on a subscription must have the same billing interval. For example, you can't have a subscription with some prices that are billed monthly and some products that are billed annually.
Get existing items
If you're working with the API, you'll need to get existing items on a subscription first.
This is because when updating subscription items, Paddle expects the complete list of items that you want to be on the subscription — including existing items. If you don't include an existing item, it's removed from the subscription.
Send a GET
request to the /subscriptions/{subscription_id}
endpoint.
Paddle ID of the subscription to get.
API
List subscriptions by making a GET request to the /subscriptions
endpoint. Work your way through the results to find the subscriptions that you want to work with.
Use the customer_id
parameter to return only subscriptions for a specific customer.
Paddle ID of the customer to get subscriptions for.
Customers may have more than one subscription, so check the details of each returned subscription to find the one you want to pause.
Paddle dashboard
Head to Paddle > Customers, and find the customer whose subscription you want to change.
Find the subscription under the Subscriptions heading, then click the … menu and choose Copy ID from the menu.
Response
Paddle returns the complete subscription entity for the ID you specified.
Extract the price IDs and quantities from the price
object for each item
in the items array. Keep those for the next step.
12345678910111213141516171819201{
2 "data": {
3 "id": "sub_01gvne45dvdhg5gdxrz6hh511r",
4 "status": "active",
5 "customer_id": "ctm_01gvcz30f4d77tfnn60snnyxfd",
6 "address_id": "add_01gvczbeepz72bfgsvbcmy1vpg",
7 "business_id": null,
8 "currency_code": "USD",
9 "created_at": "2023-03-16T14:45:30.683934Z",
10 "updated_at": "2023-03-16T14:45:30.683934Z",
11 "started_at": "2023-03-16T14:45:30.683929Z",
12 "first_billed_at": "2023-03-16T14:45:30.683929Z",
13 "next_billed_at": "2023-04-16T14:45:30.683929Z",
14 "paused_at": null,
15 "canceled_at": null,
16 "collection_mode": "manual",
17 "billing_details": {
18 "enable_checkout": false,
19 "purchase_order_number": "",
20 "additional_information": "",
Change base plan
Change the base plan when customers want to move from one plan to another. For example, from Pro to Enterprise.
You can choose any proration billing mode.
Build a request that includes an array of price IDs. Remove the price ID for the existing base plan, then add:
- Existing items that you want to keep on the subscription, like any addons.
- The price ID for the new base plan.
API
List prices by making a GET request to the /prices
endpoint. Work your way through the results to find the price that you'd like to work with.
Paddle dashboard
Head to Paddle > Catalog > Products, click on a product in the list, then click the … menu next to a price and choose Copy ID.
Send a PATCH request to the /subscriptions/{subscription_id}
endpoint that includes the new items
array.
Paddle ID of the subscription to update.
Request
In the request:
- Include
proration_billing_mode
to tell Paddle how to handle billing for changes. items
should include aprice_id
andquantity
for each item.- New items must include a
quantity
. - You may omit
quantity
for existing items if you're not making changes. - Optionally include
on_payment_failure
to tell Paddle how to handle this change if payment fails.
1234567891{
2 "proration_billing_mode": "prorated_immediately",
3 "items": [
4 {
5 "price_id": "pri_01gvne87kv8vbqa9jkfbmgtsed",
6 "quantity": 1
7 }
8 ]
9}
Response
If successful, Paddle returns a copy of the updated subscription entity. The items
list contains complete objects for items on the subscription, including billing information and information about the related price.
12345678910111213141516171819201{
2 "data": {
3 "id": "sub_01gvne45dvdhg5gdxrz6hh511r",
4 "status": "active",
5 "customer_id": "ctm_01gvcz30f4d77tfnn60snnyxfd",
6 "address_id": "add_01gvczbeepz72bfgsvbcmy1vpg",
7 "business_id": null,
8 "currency_code": "USD",
9 "created_at": "2023-03-16T14:45:30.683934Z",
10 "updated_at": "2023-03-16T14:45:30.683934Z",
11 "started_at": "2023-03-16T14:45:30.683929Z",
12 "first_billed_at": "2023-03-16T14:45:30.683929Z",
13 "next_billed_at": "2023-04-16T14:45:30.683929Z",
14 "paused_at": null,
15 "canceled_at": null,
16 "collection_mode": "manual",
17 "billing_details": {
18 "enable_checkout": false,
19 "purchase_order_number": "",
20 "additional_information": "",
Change billing frequency
Change the billing frequency when customers want to change from paying in one interval to another. For example, from monthly to annually.
When you change billing frequency, you may need to replace multiple items — including addons — so they all have the same frequency. For example, if customers can purchase a Premium Support addon for $200 a month, replace this with a price for Premium Support that bills yearly when moving to an annual base plan.
You can use prorated_immediately
, full_immediately
, and do_not_bill
when changing billing frequency.
Build a request that includes an array of price IDs. Remove the price ID for the existing base plan and any recurring addons, then add:
- Existing items that you want to keep on the subscription, like one-time charges.
- The price ID for the new base plan.
- The price IDs for any new addons.
API
List prices by making a GET request to the /prices
endpoint. Work your way through the results to find the price that you'd like to work with.
Paddle dashboard
Head to Paddle > Catalog > Products, click on a product in the list, then click the … menu next to a price and choose Copy ID.
Send a PATCH request to the /subscriptions/{subscription_id}
endpoint that includes the new items
array.
Paddle ID of the subscription to update.
Request
In the request:
- Include
proration_billing_mode
to tell Paddle how to handle billing for changes. items
should include aprice_id
andquantity
for each item.- New items must include a
quantity
. - You may omit
quantity
for existing items if you're not making changes. - Optionally include
on_payment_failure
to tell Paddle how to handle this change if payment fails.
1234567891{
2 "proration_billing_mode": "prorated_immediately",
3 "items": [
4 {
5 "price_id": "pro_01gsz4vmqbjk3x4vvtafffd540",
6 "quantity": 1
7 }
8 ]
9}
Response
If successful, Paddle returns a copy of the updated subscription entity. The items
list contains complete objects for items on the subscription, including billing information and information about the related price.
12345678910111213141516171819201{
2 "data": {
3 "id": "sub_01gvne45dvdhg5gdxrz6hh511r",
4 "status": "active",
5 "customer_id": "ctm_01gvcz30f4d77tfnn60snnyxfd",
6 "address_id": "add_01gvczbeepz72bfgsvbcmy1vpg",
7 "business_id": null,
8 "currency_code": "USD",
9 "created_at": "2023-03-16T14:45:30.683934Z",
10 "updated_at": "2023-03-16T14:45:30.683934Z",
11 "started_at": "2023-03-16T14:45:30.683929Z",
12 "first_billed_at": "2023-03-16T14:45:30.683929Z",
13 "next_billed_at": "2023-04-16T14:45:30.683929Z",
14 "paused_at": null,
15 "canceled_at": null,
16 "collection_mode": "manual",
17 "billing_details": {
18 "enable_checkout": false,
19 "purchase_order_number": "",
20 "additional_information": "",
Events
subscription.updated | Occurs when you update items on a subscription. |
transaction.created | Occurs when you choose a proration billing mode that bills the customer for changes. |