lbreeze
\← All articles

Plans, locations and what is sellable

How a plan becomes something a billing system can actually sell, and why a location might not qualify.

kstack decides what a product is. Your billing decides how it is sold. The catalogue endpoint is where the two meet.

Kinds

A plan has a kind: shared_hosting, reseller_hosting, database, email, dns or vps. It defaults to shared_hosting, and an update that does not name a kind keeps the stored one.

VPS sizes are bounds, not labels

A VPS size lives in the plan allowances and applies per machine.

Dimension From To
vm_vcpus 1 32
vm_memory_mb 512 262144
vm_disk_gb 10 2000

An order naming no size gets the plan size. An order above it is refused with "beyond this plan" rather than quietly accepted and billed.

Why a location might not qualify

A location is offered for a kind only when a node there:

  • holds every role that kind needs,
  • accepts placement,
  • reports a fresh heartbeat, and
  • is under the capacity watermark.

So an unsellable location is a statement about capacity, not a bug. DNS is the exception — it is served from everywhere, carries anywhere: true, and checkout shows no location picker for it.

Measured facts

Each kind reports facts kstack has measured. A product page may claim these and nothing else.

  • hosting — PHP, Node and Python versions; where OpenLiteSpeed with LSCache runs; where per-site containers run; HTTP/3 and IPv6 locations; the one-click apps; free TLS; DNSSEC; backup intervals with restore-drill counts.
  • vps — bootable images, the vCPU / memory / disk bounds, KVM, root login by SSH key, snapshots, private networks.
  • database — engines, engines by location, the PostgreSQL extensions present by default, max connections per database.
  • dns — nameservers, DNSSEC, IPv6, record types, and whether every nameserver serves every zone.

Email is built but gated

email exists as a kind and reports itself sellable: false until a mail node at that location passes mail readiness. A billing system should never propose an unsellable kind.

Was this helpful?
Still stuck? Contact support.