Skip to content

Shop and customer balance

The shop lets your customers order and renew servers themselves, without you creating guests by hand. A customer buys a product (a size template with a price) in the customer portal, the server is created automatically, and it is renewed every period. Customers pay in one of two ways:

  • From their balance (prepaid). Each customer has a balance that you or your billing system top up through the REST API, or that the customer tops up by card or PayPal.
  • By automatic payment: a Stripe or PayPal subscription charges the card or PayPal account every period. See Payments, invoices and coupons.

The shop is included in the Business and Unlimited licenses. Any other paid license can get it as an add-on. Without it, the shop settings are read-only and the shop is off. A reseller’s own shop additionally needs the reseller feature.

If the license lapses, the shop pages and new purchases switch off, but servers that were already sold keep renewing from the balance (no free service and no surprise deletions). Existing balances stay readable through the API and credits (top-ups) keep working, so a payment is never lost. Debits and manual bookings need a live license.

While the shop is licensed and switched on (Open for customers), the admin sidebar has a Panel / Shop switch above the search box:

  • Panel shows the hosting menu (nodes, guests, networking, provisioning, settings and so on).
  • Shop shows the selling menu, in three groups.
  • Dashboard, Support and Customers are in both.

Each mode opens its own dashboard: Panel the Operations dashboard, Shop the Shop dashboard. The panel remembers your mode per admin and follows the page you open (a shop page switches to Shop, a hosting page to Panel). With orders waiting, the Shop button carries their count.

GroupEntries
SalesOrders (orders waiting to be set up by hand, with a count badge, see Setting up orders by hand), Services (see Service products), Invoices (see Invoices and VAT) and Payments (see Payments list and refunds).
CatalogProducts (see Products), Categories (see Categories), Add-ons (see Add-ons) and Coupons (see Coupons).
Shop settingsGeneral (the settings below), Payment gateways (see Payments, invoices and coupons), Storefront (see Storefront and WordPress plugin), Invoice settings and Legal texts (see Legal texts and order consent).

While the shop is licensed but not switched on yet, there is no switch: the hosting menu shows one Shop entry with the same three groups as headers (so you can set the shop up and open it), and Legal texts stays under Customer portal.

Open Shop settings > General.

SettingMeaning
Open for customersCustomers see their balance and can buy products that are in the shop.
CurrencyISO 4217 code such as EUR, USD or CHF. One currency per panel. Only currencies with two decimals (cents) work, so codes such as JPY or KWD are refused.
How customers payThe default: From their balance (prepaid), Automatic card / PayPal payment or Customer chooses. A product can choose its own.
Warn about low balanceWarn a customer when the balance does not cover the renewals due within this many days before renewal.
Minimum top-upThe smallest amount a customer can add on the Balance page with card or PayPal, in the shop currency. 0 = no own minimum (the panel’s floor of 1.00 applies). Use it so small payments are not eaten by gateway fees.
Maximum top-upThe largest such amount. 0 = no own maximum (the panel’s ceiling of 10,000.00 applies).
Refund unused days when a customer deletes a serverProrated by whole remaining days, never more than was paid for the current period. Off by default.
Set upAutomatically, right away or By me (Shop > Orders). The default; a product can choose its own.
Notify admins about orders I set upA notice in the panel inbox and an email to the alert recipients for each order waiting for you.
Email customers while I set up their orderThe customer gets an email when the order is paid and when the server is ready.
Notify admins when a customer cancelsA notice in the panel inbox and an email to the alert recipients.

All amounts are stored as whole cents, so nothing is lost to rounding.

Shop > Products lists what customers can order. New product starts from a size template (or from scratch) and copies its size and limits once. A product can also be a service (something you deliver outside NexoVirt, such as a dedicated server) or free (price 0.00): see Service products and free products. The product form has a side navigation:

SectionWhat you set
GeneralName, Name on the website, Description on the website (shown on the shop card), Server type (Virtual machine or Container), Set up new orders, and under Where it is offered: Sell in the shop, Show the server type, Stock and In the create wizard.
ResourcesvCPU, RAM, Disk, the monthly traffic and Port speed (see Traffic), under Add-ons the most a server can have with add-ons, under Disks the disk types and additional disks, under Server setup the CPU type and Disk discard, and under Images which images customers can install.
Price and periodsThe Main period (Length, Price, How customers pay, Setup fee, Unpaid: delete after) and More billing periods.
WebsiteDisplay facts for the shop cards, the order page and your website: see Website facts.
Location and networkLocations, Network (Public IP or Internal network only), IP addresses (by DHCP or from an IP zone), Bridge for DHCP, and which Nodes the product may run on.
LimitsSnapshots per server and Backups per server.

Name is your internal name. Name on the website is what customers see in the portal shop, on the order page, in the storefront catalog and in the WordPress plugin; leave it empty to use the name. The internal name is never shown to customers when a website name is set.

A preview of the shop card is shown next to the form. A product is sold when Sell in the shop is on and it has a price. Size templates themselves are managed under Provisioning > Size templates and are not sold.

Delete on a product that nothing uses removes it with its billing periods. A product that servers or services still use is archived instead (the button reads Archive and asks for confirmation):

  • It is hidden from the shop, the storefront and the pickers (create wizard, Assign, Create webspace and Create game server), and it is never sold again.
  • Running servers and services keep it. They renew, suspend, resume and change plan as before, and the remote panel of a module service keeps working.
  • The list shows Archived (N) next to the product tabs. Open it to see the archived products, each with a Restore button (it comes back as it was, including its shop switch) and a Delete button that stays disabled (“Still in use”) until nothing uses the product any more.
  • Open manual orders block deletion and archiving: accept or reject them under Shop > Orders first.

The Website tab holds facts that are only shown, never enforced: on the portal shop cards, the order page, the storefront catalog and the WordPress plugin. All fields are optional and plain text; empty fields are not shown.

FieldMeaning
TaglineA short line under the product name, up to 100 characters.
Highlight badgeHighlights the card, for example “Popular” or “Best value”. Up to 24 characters.
Included IPv4 addressesA number from 0 to 256. Display only: addresses are still assigned by the product’s IP zone. A new product with a public IPv4 zone starts with 1.
Included IPv6A prefix such as /64, or a number of addresses. Shown as “1 IPv4, /64 IPv6”.
CPU modelFor example “AMD EPYC 9654”, up to 60 characters.
Core typeShared cores, Dedicated cores or Not shown. Shown next to the CPU model.
Show DDoS protection and DDoS protection textThe switch shows a DDoS line; the text (up to 80 characters) replaces the default “DDoS protection”.
Backup storage and Backup retentionFor example “100 GB” and “7 days”. Display only: the number of backups is set under Limits.
SLA / uptimeFor example “99.9% uptime”.
Feature bulletsOne per line, up to 10 lines of 80 characters. Shown as a list on the card.

A service product keeps only Tagline, Highlight badge, SLA / uptime and Feature bullets.

Setup fee on the Price and periods tab is charged once, with the first order only:

  • Never on renewals, plan changes, other billing periods or upgrades.
  • Coupons and customer group discounts do not reduce it.
  • It is refunded with the order when the order fails or you reject it. Delete now and unused-days refunds never give it back.
  • Not allowed on free products.
  • Orders of a product with a setup fee are prepaid only: from the balance, or a one-time card or PayPal payment. The customer can switch the server to automatic payment afterwards.
  • The invoice shows it as its own line Setup fee.

Stock limits how many servers of a product run at the same time, all its billing periods together. Leave it empty for no limit. Every shop server of the product takes a unit, and so does a paid order that waits for you under Shop > Orders. A unit is free again when the server is deleted (also after a cancellation ends or an unpaid server is removed) or when a create fails and is refunded.

  • Customers see Only N left on the shop card and the order page once 5 or fewer are left, and Sold out when none are left. A sold-out product cannot be ordered or paid for, and servers cannot change to it.
  • Two customers ordering (or changing plan to) the last unit at the same time: only one goes through.
  • A plan change scheduled for the next renewal is checked again then. If the product is sold out by that time, the server renews on its current plan and the customer gets an email and an entry in the server’s activity.
  • Shop > Products shows Stock: N of M left (or Sold out) next to each limited product.
  • The storefront catalog has a stock field per product: the units left, null for no limit. The WordPress plugin (1.2.0 and later) shows Only N left and Sold out from it and disables the order button.

Under Resources > Disks (server products only):

  • Disk type of the main disk: Any storage, NVMe, SSD or HDD. With a type, servers are placed only on nodes that have a storage of that type with room, marked on the node page (Storage tab, see Disk types).
  • Additional disks: Add disk adds a row with the Size in GB and a Disk type (Any storage or a type), for example an NVMe main disk with a large HDD data disk. At most 8 per product. Containers mount them at the Mount path (empty: /mnt/disk1, /mnt/disk2, …); virtual machines get them as extra drives to format. Remove drops a row.

A product without a disk type and without additional disks behaves as before. With either, every disk needs a storage of its type with room on the node: the order, the create wizard and automatic placement only pick such nodes (snapshot-capable storages first, then the one with the most free space), and a node without one is refused with “No storage of the required disk type with enough free space.” Additional disks count towards a reseller’s disk quota.

Customers see the disks on the shop card and in the order summary (for example 50 GB NVMe + 500 GB HDD), and the subscription card of their server has a Disks row. The storefront lists them per product in disks. A reinstall keeps the additional disks but recreates them empty.

Plan changes keep every disk: the new product needs the same disk type for the main disk, and each additional disk of the old product again at the same position with the same type and at least its size (it may add more disks). A plan change grows a smaller additional disk and adds a missing one on a storage of its type on the server’s node; disks never shrink and are never removed. More disk space add-ons grow the main disk.

Under Resources > Server setup:

  • CPU type (virtual machines only): Automatic (x86-64-v2-AES, or x86-64-v3 for images that need it), one of the common types (host, x86-64-v2-AES, x86-64-v3, kvm64, qemu64, …) or a named model such as EPYC-Rome or Skylake-Server. Only the listed values are accepted.
  • Disk discard: freed blocks go back to thin storage. Virtual machines get discard=on on the disk, containers the discard mount option on the root disk.

The CPU type and disk discard are set when the server is created and kept on plan changes and reinstalls.

Under Resources > Images you choose which operating systems customers can install on the product (virtual machines: QEMU templates, containers: container templates, custom images included):

  • All images (the default): every template.
  • Only these images: tick whole groups and/or single templates. A ticked group allows all its templates, also ones you add to it later. A single template allows only that template.

The list applies to the order page, the storefront catalog, every order path and the customer’s reinstall (portal, reseller portal and the API): the picker lists only allowed images and other images are refused. A billing period follows its product. Changing the list does not touch running servers; their next reinstall follows the new list. Admins reinstalling from the panel can always pick every image, and servers without a shop product are not limited. The minimum size per operating system (below) still applies on top.

This replaces the Allow Windows switch of 1.3.40: products with it on allow all images, products with it off allow every image except the Windows templates (whole groups without Windows, plus the non-Windows templates of mixed groups).

Under Location and network > Network, Internal network only gives servers of the product an address from a private IPv4 zone instead of a public one. Pick the Private IP zone: the list shows private (RFC 1918) IPv4 IP zones with NexoVirt NAT on at least one node (node page > Network > NAT, NAT switched on with masquerading for that network). The server reaches the internet through NAT but has no public IP.

  • Orders are placed only on nodes where NexoVirt NAT covers the zone, never on a node whose network is managed outside NexoVirt or where foreign NAT rules block NexoVirt.
  • An order is refused with a clear message when NAT is not active on any such node, or when the zone has no free address left. A manual order handed to a node without NAT is refused too.
  • Customers see Internal network (no public IP) on the shop card, the order summary and the server page.
  • Sell IP address add-ons: off by default, so IPv4 and IPv6 add-ons are not offered for the product. Turn it on to sell them anyway.
  • Plan changes stay within internal or public products (the address does not change).
  • Port forwards to such servers are not part of the product; you can add them by hand on the NAT page.
  • The storefront catalog has network per product: public or internal.
  • Service products have neither images nor a network.

On the Groups tab of Provisioning > QEMU templates, each group can have a Minimum server size (vCPU, GB RAM, GB disk), for example 2 vCPU, 4 GB RAM and 40 GB disk for Windows. The order page shows “Needs …” on the group, and an order, a self-service server or a customer reinstall (portal or API) on a smaller server is refused. Add-ons ordered with the server count towards the size.

The main period is the product’s own Length (30 days is monthly, 0 never expires) and Price. Under More billing periods click Add period for each further period. Pick Monthly, Every 3 months, Every 6 months, Yearly or Own length (1 to 3650 days), then either a fixed Price or a % off the main price, for example yearly with 15 % off. Up to 8 periods per product.

  • The customer picks one when ordering. The order page lists them under Billing period and shows what the customer saves.
  • Add-on prices are per main period and are scaled for a longer period (a yearly period of a monthly product charges add-ons 365/30 times).
  • Switching a period off keeps it for running servers but stops selling it.
  • A customer changes period at the next renewal. This is refused while a card or PayPal subscription runs.
  • Stripe and PayPal subscriptions work for periods of 1, 3, 6 or 12 months only.

With node groups set up, Locations on Location and network lets you tick the node groups a product is offered in. With none ticked the product can run on any node. With several ticked, the customer picks one on the order page under Location, shown by the group’s name (for example “Oslo”). The panel then places the server on the best node of that group.

With Set up on By me (Shop > Orders) (in the shop settings or on one product), a paid order does not create a server. It waits under Shop > Orders with the status Waiting, and the customer sees “Your order is being reviewed”. A customer group or a single customer can also be set to manual (or automatic): a product set to manual always waits, otherwise the customer’s setting, then the group’s, then the product’s, then the shop default decide. Open an order to see the customer, product, server name, location and what was paid.

  • Create the server: choose Node and storage and Network, then Create server. The server is built with the customer’s product, add-ons, operating system, name and access. The paid time starts when you hand it over (status Handed over).
  • Reject and refund: enter a Reason for the customer. The full amount goes back to the customer’s balance and a card or PayPal subscription is cancelled (status Rejected).

Resellers have the same list under Orders in their portal, see Resellers.

Shop > Categories groups products in the shop. Click New category and fill in:

FieldMeaning
NameYour internal name, shown on the card and as the page title when no website name is set.
URL nameThe page address /portal/shop/c/<URL name>. Made from the name on the website (or the name) when empty, so the internal name never shows in a public address. other is taken by products without a category.
Name on the websiteWhat customers see in the portal shop, the storefront and the WordPress plugin. Empty: the name.
Description on the websiteShown on the card.
Sort orderLower numbers come first.
Visible in the shopOff hides the category and its products from the shop pages and the storefront. Order links keep working.
FiltersWhat customers can filter by on the category’s page: vCPU, RAM, Disk, Price, Billing period, Location, Operating system, Network and Product type. A filter shows only when the products of the category differ in it.
Image / IconA picture (PNG, JPG or WEBP, up to 512 KB) shown on top of the card, or an icon when there is no picture.

A product belongs to one category or none: pick it under Category on the product’s General tab, with its Sort order inside the category. Its billing periods follow. Sort order also sets the order of the cards in the portal shop, the storefront catalog and the WordPress plugin (then by price). On Shop > Products the tabs at the top show each category with its number of products; New product in a category tab starts with that category selected.

Deleting a category never deletes products: they keep selling without a category and show under Other.

In the portal, as soon as one visible category has products, Shop opens with one card per category (picture, description, number of products and the lowest price) plus Other for products without one. A category’s page lists its products with the filters you picked, a Sort by list (price, vCPU, RAM) and Clear filters. Filters are part of the address, so a filtered page can be shared. Without categories the shop shows all products on one page, as before.

Resellers manage their own categories under Products > Categories in their portal; their customers see only those.

In the portal, with the shop on, customers get a balance badge in the header and the sidebar entries Balance and Shop. The dashboard shows the balance, the services due in the next 14 days and a price and days-left column for each service.

  • Balance: Top up (with Pay with card or Pay with PayPal, when a gateway is on), the History of bookings and the Invoices with a PDF each.

  • Shop: one card per product with price, CPU, memory, disk and traffic, its other billing periods and the website facts: the badge as a ribbon, the tagline under the name, a line such as ”+ 5.00 EUR setup” under the price, and the IP, CPU, DDoS, backup, SLA and feature lines. Order opens the order page:

    1. Operating system (or Container template) and Version.
    2. Name and access: Location (when the product has several), Server name, Root password and SSH keys.
    3. Add-ons, when extras are on sale.
    4. Payment: Prepaid from your balance or Automatic payment, when both are offered.

    The summary on the right shows the website facts, the price, a Setup fee, one-time line when the product has one (added after the coupon, part of the Total), a Coupon code field with Apply, and the checkboxes for the terms and (if you turned it on) the immediate start. See Legal texts and order consent. The purchase is charged at once and the server is created in the background. If the order or the create job fails, the charge is refunded once.

Each shop server has a Subscription card on its page:

  • Paid until, Price and Last renewal, and a badge Auto-renew on or Cancelled.
  • Renew automatically from my balance: the auto-renew switch. Off, the server runs until the paid date.
  • Renew now: pays one more period early.
  • Disks: the server’s disks with their types, shown when the product has a disk type or additional disks.
  • Change plan: switch to a plan with at least the same CPU, RAM and disk (and the same disks, see Disks). The customer pays the difference for the rest of the paid period now, the paid date stays, and later renewals use the new price. A virtual machine needs a full shut down and start for the new RAM and vCPUs (a reboot from inside the server is not enough); a container gets them right away.
  • Extras: buy extras and Remove extra addresses.
  • Cancel subscription: see Cancellation.
  • Delete now: deletes the server. With the refund setting on, the unused whole days are refunded (not for suspended servers).

Cancel subscription on the Subscription card opens a page that shows until when the server keeps running and when it will be deleted, with an optional reason and one confirm button. A cancelled server:

  • runs on until the paid date and is not renewed. A card or PayPal subscription stops at the end of its period.
  • is stopped at that date (not marked unpaid, no unpaid email) and deleted after the product’s Unpaid: delete after days.
  • can be taken back: the card shows a banner to withdraw the cancellation, which renews the server again. After the end date, a cancelled server becomes unpaid and resumes when the balance covers it.

An admin’s Turn on auto-renew on the server also clears a cancellation. The customer receives an email, and with Notify admins when a customer cancels you get a notice too. Cancellations also show in the Cancellations dashboard widget (Shop dashboard).

For German law (§ 312k BGB) the panel also has a public page at /cancel without a sign-in, linked in the footer as Cancel contracts while the shop is on. A visitor enters the email address of the account and gets a one-time link (valid 24 hours, the same answer for unknown addresses) to pick the servers to cancel. The servers keep running until the end of their paid period. Requests are limited per address and per network.

Catalog > Add-ons (formerly Extras) holds the add-on catalog (resellers manage theirs on their Products page). Each extra has a Name, a kind in Adds, a Price per period, Per unit (for example 10 GB), Max per server and an On sale switch.

KindWhat the customer gets
Extra IPv4 address / Extra IPv6 addressA new address from the IP range you set, on a new network interface. Can be removed again.
More disk spaceThe root disk grows by the unit. Disk space only grows, it cannot be removed.
Extra disk (NVMe, SSD, HDD)A second disk of the Disk type you pick, attached empty (the customer formats it; containers get it at /mnt/<type>). The first unit creates the disk on a storage of that type on the server’s node, later units grow it. Only in your own catalog, not in reseller catalogs.
More RAM / More vCPUsMemory or CPU cores on top of the product. A virtual machine needs a full shut down and start for them, a container gets them right away.
Extra backup slotsRaises the server’s backup limit by the unit (slots bought before 1.3.31 raised the snapshot limit).

An extra is charged for the rest of the paid period when it is bought, then with every renewal.

An Extra disk (NVMe, SSD, HDD) is offered only where it can be delivered: on the order page when some node has a storage of that type with room for it (the order is then placed only on such a node), and on a running server when its node has one. Otherwise the purchase is refused with “There is no storage of this disk type with enough room on the node of this server.” Mark the storages on the node page Storage tab (see Disk types). Customers see the type as a badge next to the add-on.

New RAM or vCPUs on a running virtual machine

Section titled “New RAM or vCPUs on a running virtual machine”

Proxmox keeps more RAM or vCPUs for a running virtual machine as a pending change: only a full power off and power on applies them, a reboot from inside the server keeps the old values. While such a change is waiting, the customer’s server page shows New RAM or vCPUs are waiting with Power cycle now, which shuts the server down cleanly, switches it off hard if it is still running after 2 minutes, and starts it again (after a confirmation). Containers apply new RAM and vCPUs at once, so they never show it.

Your billing system credits a customer by calling the API after a payment succeeded (see Integrating your billing system). Rules:

  • external_id is required and unique per customer. It is your payment id. If your system retries the call, the panel returns the first booking with duplicate: true and books nothing again.
  • A negative amount_cents is a chargeback or correction. It may take the balance below zero.
  • Customers only. Admin and reseller accounts answer 422.
  • Tokens limited to specific hosts cannot read or change balances.

Every booking appears in the customer’s history with its type (top-up, purchase, renewal, upgrade, extra, refund or adjustment), amount, balance after, note and who booked it.

The command php spark shop:renew --once runs from cron every 10 minutes (installed by deploy/install-cron.sh; re-run it after updating).

  1. Within an hour before the paid date, an auto-renewing server is renewed from the old date if the balance covers plan price plus extras. The customer gets a renewal mail. A renewal is never charged twice.
  2. If the balance is too low at the paid date, the server is stopped and marked unpaid. It is deleted after the plan’s Grace period (days).
  3. A top-up that covers the renewal brings a suspended server back: it is renewed and started again straight away. Servers with auto-renew turned off are not resumed by a top-up.
  4. Before that, one low-balance mail per period warns the customer.

Plan expiry enforcement (plans:enforce) skips shop servers. Traffic throttling still applies.

On a customer page under Customers > All customers the Billing section shows the balance, the history and the customer’s payments. Credit / debit on the balance card books a manual amount with a required note. It is protected by step-up confirmation and audited. Credits are positive, debits negative (the balance may go below zero), and the note is visible to the customer. A credit can get an invoice when you tick Create an invoice (for a credit only, e.g. a bank transfer). When the customer has no complete billing address (name, street, postal code, city, country), the dialog warns that the invoice would be issued without it: add it on the Profile tab first.

On a shop server’s Plan section an admin sees Shop: paid until, Shop: auto-renew, Shop: period price and Shop: last renewal, and can use Turn on auto-renew or Turn off auto-renew. Free products that ask for a usage confirmation also show Shop: usage confirmation and a Confirm now button (see Usage confirmation). Extending the expiry is free and writes a 0.00 note to the customer’s history.

With the reseller feature, a reseller sells its own products (own prices, own extras) to its own customers and tops up their balances with the reseller API. Resellers have their own legal texts, orders to set up by hand, tickets and FAQ in their portal, see Resellers. Card and PayPal payments, coupons and invoices are not available in reseller shops. Customers of a reseller only see that reseller’s plans, never the operator’s, and the other way round. The reseller’s quotas and assigned nodes and IP zones apply to every order.

These templates are listed under Settings > Email: Shop: order receipt, Shop: renewed, Shop: low balance, Shop: suspended (unpaid), Shop: resumed, Shop: usage confirmation due (free products), Shop: suspended, usage not confirmed (free products), plus the payment, cancellation and invoice mails. When an unpaid server is finally deleted the customer gets the usual Plan deleted mail.

After your payment provider confirms a payment, credit the customer. Use the payment id as external_id so retries are safe.

Terminal window
curl -s -X POST https://panel.example.com/api/v1/users/14/balance \
-H "Authorization: Bearer $NEXOVIRT_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "amount_cents": 2500, "external_id": "pay_8f31c2", "note": "Invoice 2026-0412" }'
{
"success": true,
"data": {
"entry": { "id": 41, "amount_cents": 2500, "balance_after_cents": 3400, "kind": "topup", "external_id": "op:pay_8f31c2" },
"duplicate": false,
"balance_cents": 3400,
"balance": "34.00 EUR",
"currency": "EUR"
},
"error": null
}

Read the balance and history with GET /api/v1/users/14/balance. To send the customer to the portal without a password, create a one-time link, see Billing systems: customer login links:

Terminal window
curl -s -X POST https://panel.example.com/api/v1/users/14/login-link \
-H "Authorization: Bearer $NEXOVIRT_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "redirect": "/portal/shop" }'

Resellers use the same calls on the reseller API: GET|POST /api/reseller/customers/{id}/balance. See the API reference for every field.

NexoVirt is developed and designed by Nucez Software, your partner for custom software and web design.