# Change a service's plan

> Move a service to another plan of the same product, such as another billing cycle, and see what the switch costs before you apply it.

Source: https://docs.coritan.com/billing/change-plan/

A service's *plan* is its price and how often you pay it. Each product in the catalogue has one plan for each billing cycle it sells, such as `RX-2 (Monthly)` and `RX-2 (Annually)`, so changing plan moves a service to another billing cycle of the same product. The size, and everything that comes with it, stays the same. Coritan prices the switch for the whole days left in your current billing cycle.

To move to another size, order the new size and cancel the old service once you have moved across. [Change an instance's plan or cancel it](/cloud-compute/billing/#get-a-different-size) shows how for a Cloud Compute instance.

## Before you begin

- The service must be `active`. A suspended service changes plan only after you pay its open invoice ([Failed payments and suspended services](/billing/failed-payments/)).
- A switch can raise an invoice. Coritan pays it from your credit first, so [add credit](/billing/add-credit/) or keep a [payment method](/billing/payment-methods/) ready.
- Read the warning under [How the switch is billed](#how-the-switch-is-billed) before you move to a longer billing cycle or away from hourly billing.

## Change the plan

1. Open the service: in the sidebar, select **Services** and then the service, or open it from its product's page. Select the **Billing** tab.
2. On the **Current plan** card, select **Change plan…**.
3. In **New plan**, choose the plan you want. Each plan in the list shows its price.
4. Select **Preview**. The preview says whether the switch is an `Upgrade` or a `Downgrade`, how many days are left in this cycle, and what the switch costs today ([What the preview shows](#what-the-preview-shows)).
5. Select **Apply change**. On a Cloud Compute instance, the dashboard first checks that the host can take the new plan.

## What the preview shows

**Credit for unused time**
: The value of the whole days left on your current plan: its price divided by the days in the current billing cycle, times the days left. The day in progress counts as used.

**Charge for the new plan**
: The new plan's price for the same days, divided over the days in the new plan's billing cycle.

**Due now**
: The charge less the credit. It is below zero when the new plan costs less per day.

**Credit you receive**
: Shown for a downgrade. The part of the difference that reaches your credit balance. By default, Coritan keeps back one day, so the preview shows the number of creditable days beside it.

## How the switch is billed

Coritan bills a switch by comparing the two plans' prices for one billing cycle.

The new plan has a higher price
: Coritan raises an invoice, due at once, and pays as much of it as your credit covers. The new plan applies when the invoice is paid. The invoice is for **Due now** when that is above zero. When **Due now** is zero or less, the invoice is for the new plan's full price, with a line such as `Plan upgrade (first 30 days)`. That happens when you move to a longer billing cycle, which costs less per day, and when less than one day of the cycle is left. The preview shows such a switch as a `Downgrade`.

The new plan has the same or a lower price
: The new plan applies at once. When **Due now** is below zero, the difference goes into your credit balance, less one day by default (**Credit you receive**). When **Due now** is above zero, which happens when you move to a shorter billing cycle, Coritan raises an invoice for it that you pay yourself.

Your renewal date stays the same. From that date, each renewal invoice is for the new plan's price, and the service renews on the new plan's billing cycle.

> [!WARNING]
> Moving to a longer billing cycle, or from hourly billing to a monthly or longer plan, charges the new plan's full price now and leaves the renewal date where it was. The renewal invoice that follows, on the old date, is for the full new price as well. For an hourly service, whose renewal date has already passed, it follows within a day. [Contact support](/support/conversations/) before you make such a switch.

A service you move to hourly billing is charged from your credit by the hour from then on ([How hourly billing works](/billing/hourly-billing/)). It has no monthly cap: Coritan sets a cap only on a service ordered on an hourly plan.

## Result

A message confirms the change: `Plan changed.` when the new plan applies at once, or `Pay the upgrade invoice to apply the plan change` when an invoice waits for payment. [Pay the invoice](/billing/invoices/) on the **Invoices** tab under **Billing**, and the new plan applies as soon as it is paid.

Once the new plan applies, the **Current plan** card shows it and the **Activity** table lists the change.

> [!IMPORTANT]
> An invoice from a plan change counts as any other unpaid invoice. If you leave it unpaid, the service is suspended one day after the invoice date by default, and later deleted ([Failed payments and suspended services](/billing/failed-payments/)). Pay it, or ask [support](/support/conversations/) to cancel it.

## Troubleshooting

`No other plan to switch to`
: The product has no other plan on sale, so **Change plan…** does not appear. To move to another size, order it as a new service.

`Service is not active`
: The service is suspended, still being set up, or has ended. Pay its open invoice to lift a suspension, then try again.

**Could not preview the change**
: The preview failed. The message under it gives the reason, such as `Pricing tier not found` when the plan is no longer on sale. Choose another plan.

**Could not change the plan**
: The change failed. The message under it gives the reason. `Already on this plan` means the service is on that plan now. On a Cloud Compute instance, `The host cannot apply this plan:` followed by a reason means the host refused the size, and `Could not check that the host can take the new plan. Try again in a moment.` means the check did not get an answer.

The preview shows a credit, but applying raises an invoice
: The new plan has a higher price for one billing cycle, so Coritan bills it as described under [How the switch is billed](#how-the-switch-is-billed).

You paid the invoice, but the plan did not change
: The service was suspended when the payment arrived, so the plan stayed as it was. [Contact support](/support/conversations/) with the invoice number.

## Related

- [Cancel a service](/billing/cancel-a-service/)
- [Pay an invoice](/billing/invoices/)
- [How hourly billing works](/billing/hourly-billing/)
- [Change an instance's plan or cancel it](/cloud-compute/billing/)

## With the API

`service_ref` is the service ID, or the UUID of the instance, server or floating IP behind it. The plans a service can move to are the other entries in its product's `pricing` list: read `product_id` from [`GET /services/{service_ref}`](/api/reference/client/services/#op-get-api-v1-services-service-ref), then read the product with [`GET /products/{product_id}`](/api/reference/client/catalog/#op-get-api-v1-products-product-id). Each entry's `id` is a `new_pricing_id`.

### Preview a switch

[`GET /services/{service_ref}/upgrade-preview`](/api/reference/client/services/#op-get-api-v1-services-service-ref-upgrade-preview) takes the plan as the query parameter `new_pricing_id`:

```bash
curl "https://api.coritan.com/api/v1/services/311/upgrade-preview?new_pricing_id=42" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

This service is on a $4.99 monthly plan with 15 of 30 days left, and plan `42` is the same size at $13.47 a quarter:

```json
{
  "credit_amount": 2.49,
  "charge_amount": 2.2,
  "net_amount": -0.29,
  "credit_estimate": 0.27,
  "creditable_days": 14,
  "days_remaining": 15,
  "days_in_cycle": 30,
  "change_type": "downgrade"
}
```

`credit_amount`, `charge_amount` and `net_amount` are **Credit for unused time**, **Charge for the new plan** and **Due now**. `credit_estimate` is the credit a downgrade pays out over `creditable_days`. `change_type` follows the sign of `net_amount`, so it can say `downgrade` for a switch that is billed as an upgrade, as it does here.

### Apply a switch

[`POST /services/{service_ref}/change-plan`](/api/reference/client/services/#op-post-api-v1-services-service-ref-change-plan) takes `new_pricing_id` in the body:

```bash
curl -X POST https://api.coritan.com/api/v1/services/311/change-plan \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"new_pricing_id": 42}'
```

The quarterly plan has the higher price, so Coritan raised an invoice for its full price, $13.47, and the account's credit did not cover it:

```json
{
  "change_type": "upgrade",
  "net_amount": -0.29,
  "credit_amount": 2.49,
  "charge_amount": 2.2,
  "credit_issued": 0.0,
  "days_remaining": 15,
  "invoice_id": 5120,
  "status": "payment_required",
  "message": "Pay the upgrade invoice to apply the plan change"
}
```

`status` is `applied` when the new plan applies now, and `payment_required` when it waits for the invoice in `invoice_id`. Read the amount owed from [`GET /billing/invoices/{invoice_id}`](/api/reference/client/billing/#op-get-api-v1-billing-invoices-invoice-id) and pay it as [Pay an invoice](/billing/invoices/#with-the-api) describes. `credit_issued` is the credit a downgrade added to your balance, in US dollars.

While a plan-change invoice is open, asking again for the same plan returns that invoice. Asking for another plan with a higher price cancels it and raises a new one.

| Status | `detail` | Cause |
| --- | --- | --- |
| `400` | `Service is not active` | The service is not `active`. |
| `400` | `Already on this plan` | `new_pricing_id` is the current plan. |
| `400` | `New pricing must belong to the same product` | The plan belongs to another product. |
| `400` | `Plan changes must stay within the same hardware tier` | The plan belongs to a product on another hardware tier. |
| `404` | `Pricing tier not found` | No plan has that ID. |
| `404` | `Target product not found` | The plan's product no longer exists. |

## API

- `GET /api/v1/services/{service_ref}/upgrade-preview`: Preview plan change (https://docs.coritan.com/api/reference/client/services/#op-get-api-v1-services-service-ref-upgrade-preview)
- `POST /api/v1/services/{service_ref}/change-plan`: Change plan (https://docs.coritan.com/api/reference/client/services/#op-post-api-v1-services-service-ref-change-plan)
