---
title: Plans and pricing
description: Create and price VM plans: sizes, hourly and monthly prices, billing cycles, custom plans, cloning, and what a price change does to running VMs.
url: https://nexcmp.com/docs/catalog/plans/
applies_to: NexCMP 1.6.1
updated: 2026-11-02
---

# Plans and pricing

> **Where in the admin:** Services › Virtual Machines › Plans & pricing (`/vm/catalog`), with the tabs Plan, Custom plan, Cycle and Offering CloudStack. Templates are on the separate page Services › Virtual Machines › Template (`/vm/templates`).

## What it does

A **plan** is a size customers can buy: vCPU, RAM, root disk and a price, in a zone, from one source (CloudStack or a Proxmox VE cluster). The customer chooses a plan, an operating system and a **billing cycle** (hourly, monthly or a longer prepaid term). Plans are sold in the customer portal, through the API and in resellers' sites.

## Requirements

| Item | Requirement |
|---|---|
| Source | CloudStack connected (a plan points at a CloudStack service offering) or a Proxmox VE cluster attached to the zone. See [CloudStack](https://nexcmp.com/docs/infrastructure/cloudstack/) and [Proxmox VE](https://nexcmp.com/docs/infrastructure/proxmox/). |
| Zone | A zone that sells virtual machines. See [Zones](https://nexcmp.com/docs/infrastructure/zones/). |
| Templates | At least one enabled, ready template. See [OS templates](https://nexcmp.com/docs/infrastructure/templates/). |
| Exchange rate | Only if you enter prices in VND. See [Currency and exchange rates](https://nexcmp.com/docs/catalog/currency-and-exchange-rates/). |
| Permissions | An administrator; every price change asks for a reason. |

## Prepare the infrastructure

- **CloudStack:** create the service offerings you want to sell (public, or shared with the NexCMP domain). A plan points at one offering. The **Offering CloudStack** tab lists the offerings and disk offerings live from CloudStack (cached for 60 seconds). When the plans table is empty, the worker creates six plans from your real offerings automatically.
- **Proxmox VE:** nothing in Proxmox; a plan carries its own CPU, RAM and disk. The disk must not be smaller than the template's disk.

## Connect in NexCMP

### How prices are stored

NexCMP stores every price as **micro-dollars per hour** (µ$/hour; 1 µ$ is 1/1,000,000 USD). You can type the price in the unit you prefer and the form converts it:

| Unit | Notes |
|---|---|
| USD / hour (6 decimals) | Stored as is. |
| USD / month | Divided by the hours-per-month setting (730). |
| VND / month | Converted once at the current exchange rate, then stored in µ$/hour. Appears only when a rate exists. |

The form shows the result: µ$/hour, USD/hour, the monthly price and every billing cycle. **Monthly price = hourly price × 730**; a longer cycle is **monthly price × months × (1 − discount)**.

### Add a plan

1. Open **Services › Virtual Machines › Plans & pricing** and click **Add plan**.
2. Fill in the form:

   | Field | Example value |
   |---|---|
   | Plan name | `VM-2-4` |
   | Slug | empty: made from the name |
   | Zone | your default zone |
   | Infrastructure source | empty for CloudStack, or a Proxmox cluster |
   | Service offering CloudStack (live) | pick one (shown only for CloudStack) |
   | CPU (core), RAM (MB), Root disk (GB) | `2`, `4096`, `40` |
   | Disk offering | optional, for a custom root size |
   | Enter price by / Price | `USD / month`, `12` |
   | Short description | `2 vCPU, 4 GB RAM, 40 GB NVMe` |
   | Order | `10` |
   | Active | On: customers can buy |
   | Visibility | Visible in catalog |
   | Price change reason | `initial price` |


3. Click **OK**. The plan appears in the table with its hourly and monthly price and a cell for every enabled cycle.

      ![Plans table with hourly, monthly and per-cycle prices](https://nexcmp.com/docs/images/catalog/plans-02-list.webp)

### Billing cycles

Open the **Cycle** tab to set which cycles customers can choose and their discounts.

| Cycle | Default | Notes |
|---|---|---|
| Hourly | always on | Charged hour by hour. |
| Monthly | on, 0% | |
| 1 year | on, 10% | |
| 2 years | on, 15% | |
| 3 years | on, 20% | |

You can rename a cycle, change its discount (0 to 90%) and switch it on or off. A change applies to VMs bought or renewed **after** you save; running VMs keep their locked price.

![Cycle tab with discounts per billing cycle](https://nexcmp.com/docs/images/catalog/plans-03-cycles.webp)

### Set a base plan and derive the others

**Set base plan + derive other plans** reprices the whole table from one price. Choose the base plan and its price, then either keep the **current price ratios** between plans or compute from **component prices** (µ$/hour per vCPU, per GB RAM and per GB NVMe, with an optional bundle discount of 0 to 50%). A preview table shows old and new prices before anything is written. Click **Apply**, and give a reason.

When you apply new prices: running **hourly** VMs get a **lower** price from the next billing hour, and prepaid VMs get it at renewal. If a price **goes up**, running VMs keep their old price.

### Custom plans

The **Custom plan** tab lets customers choose their own vCPU, RAM and NVMe size. Set the hourly unit price for one vCPU, one GB of RAM and one GB of NVMe (leave empty to derive from a percentage discount), the minimum, maximum and step for each, and which billing cycles apply. A **custom** plan should cost more than a fixed plan of the same size, otherwise customers would skip the fixed plan; the page flags rows where custom is cheaper. Turn on **Enable custom plans for customers** to sell them; off shows "Coming soon" in the portal. Each custom VM gets its own hidden plan row; those rows cannot be edited or deleted while the VM exists.


### Change, hide, clone, delete

| Action | What it does |
|---|---|
| **Edit** | Changes name, description, order, price, active state and visibility. |
| **On/Off** | **Off**: customers cannot buy; running VMs are unaffected. |
| **Hide / Show** | A hidden plan is not in the catalog but existing VMs keep it and an administrator can assign it. |
| **Clone** | Creates a new plan in the same zone with a new source, size or price, optionally hiding the old one. To sell the same configuration from CloudStack and Proxmox, clone it and choose the other source. |
| **Move up/down** | Changes the order. |
| **Delete** | Removes the plan from sale and from the table. VMs that already use it keep it. |

::: warning Plans in use are locked
Once a plan has VMs, its **zone, offering, CPU, RAM, disk and source** are locked so running VMs are not changed silently. Use **Clone** to create the new configuration; the old plan keeps its VMs.
:::

## Verify

1. The plan appears in the table with the expected hourly and monthly price.
2. In the customer portal, start an order: the zone offers the plan and the cycle prices match the **Cycle** tab.
3. Place a test order, check the wallet charge against the price shown, and delete the VM.

## Limits and notes

- A plan belongs to **one** zone and **one** source.
- Prices are stored in µ$/hour; the VND price shown is derived and rounded by the **VND rounding step** (see currency page). The wallet is always in USD.
- Resellers get a wholesale and retail price derived from the list price; changing a price for an existing plan does not copy custom reseller prices to a clone whose configuration you changed.
- Min, max and step limits of custom plans are checked against CloudStack's own limits; a maximum disk above CloudStack's `storage.max.volume.size` makes deploys fail and refund.

## Troubleshooting

| Symptom | Cause | Fix |
|---|---|---|
| "Plan name required" / "Service offering required" | Missing field | Fill the name; for CloudStack choose an offering. |
| "CPU/RAM/disk must be > 0" | A size is empty or zero | Enter all three. |
| "Invalid price (µ$/hr must be 1 … 100,000,000)" | The price is out of range | Check the unit and the amount. |
| "Price change requires a reason" | Reason empty when editing | Type a reason (3 characters or more). |
| "Offering "X" is 4c/8192 but plan specifies 2c/4096 - CloudStack will provision by offering. Save?" | The plan's numbers differ from the offering's | Make them match, or confirm to keep CloudStack's size. |
| "Failed to fetch offerings from CloudStack" | The connection is down or the key lacks permission | See [CloudStack](https://nexcmp.com/docs/infrastructure/cloudstack/). |
| "Template is not ready on CloudStack - deployment will fail. Enable anyway?" | You enabled an unfinished template | Wait for the template to be ready. |
| Plan cannot be edited ("has VMs - locked") | VMs use the plan | Clone it. |
| The plan does not show for customers | Off, hidden, or the zone is not ready | Check **Active**, **Visibility** and the zone tag. See [Zones](https://nexcmp.com/docs/infrastructure/zones/). |
| "Select at least 1 billing cycle" | No cycle ticked for custom plans | Tick at least one. |
| "Bundle discount must be 0–50%" | Out of range | Use 0 to 50. |
| VND price option missing | No exchange rate yet | Update the rate first. |
