Tiers & features
Plan-to-tier name mapping, per-tier feature unlock matrix, what happens when you hit a gate.
Which features unlock at which plan, and how the marketing tier names map to what your dashboard shows.
Plan → tier name mapping
The marketing site uses customer-friendly plan names (Hobby, Pro, Team, Enterprise). Your engine reports the underlying license tier by its technical name (starter, business, enterprise, etc.). They map like this:
| Plan you bought | Tier in your dashboard | What you see in Settings → License |
|---|---|---|
| Free / no license | unlicensed (with 30-day trial overlay) | UNLICENSED badge with TRIAL ACTIVE banner |
| Hobby | starter | STARTER badge |
| Pro | business | BUSINESS badge |
| Team | business (with higher limits) | BUSINESS badge with elevated capacity |
| Enterprise | enterprise | ENTERPRISE badge |
| Bespoke contract | custom | CUSTOM badge — limits negotiated per contract |
| Air-gapped / on-prem signed claims | offline | OFFLINE badge — no heartbeat traffic |
Internally everything keys off the technical tier name; the marketing names are just how we talk about plans on the website. If you bought Pro and your dashboard says BUSINESS, that’s the same thing.
The locked model: what your license actually constrains
Two numeric limits cap your usage:
- max_instances — the total number of running apps across all your hosting accounts. Counts systemd-managed services, Docker containers, and Vloud-managed Node apps.
- max_linux_users — the number of Linux user accounts the engine will provision (one per hosting customer you serve).
Both limits surface in the sidebar capacity widget and on the Settings → License page. When you hit one, the next create action returns a 402 and the dashboard shows an Upgrade prompt rather than a generic error.
Per-tier feature unlock
Beyond the numeric limits, your license also carries a set of named feature flags. Routes for those features are only registered when the flag is present. Approximate per-tier defaults (your actual license may differ — contractual licenses can mix and match):
| Feature | Starter | Business | Enterprise |
|---|---|---|---|
core — base hosting (deploy, domains, SSL, databases) | ✓ | ✓ | ✓ |
email — Postfix/Dovecot/Rspamd + webmail SSO | ✓ | ✓ | ✓ |
backups — scheduled tenant backups + restore | ✓ | ✓ | ✓ |
ai-doctor — Claude deploy-failure diagnosis | — | ✓ | ✓ |
security-engine — 12-phase ClamAV+YARA+threat-feed | — | ✓ | ✓ |
reseller — sub-accounts, reseller plans, white-label | — | ✓ | ✓ |
multi-region — cross-region deployment | — | — | ✓ |
white-label — full brand customization | — | — | ✓ |
kubernetes — Kubernetes plugin (experimental) | — | — | ✓ |
See Licensing for activating a license and seeing your exact feature list. The dashboard’s Settings → License page shows the canonical list as feature chips — that’s the ground truth for your install.
What happens when you try to use a feature your tier doesn’t include
The dashboard surfaces an Upgrade prompt with a direct path to /pricing or to your license management page. You don’t see a cryptic error.
Under the hood: the server route returns HTTP 402 with a structured error like { error: 'feature_not_in_package', feature: 'email' }. The web layer intercepts those 402s globally and shows the prompt — every feature-gated route across the dashboard handles them this way.
Hosting packages within an account
Resellers and white-label operators can carve their license capacity into hosting packages (e.g. Bronze / Silver / Gold) that apply per-customer. A package is a subset of what the license allows — you can’t hand a customer a package with more capacity than the license itself has. The package surface lives under Admin → Hosting packages in the dashboard.
Changing plans
From Settings → License → Open billing portal you can upgrade, downgrade, or cancel through Stripe’s hosted portal. Plan changes propagate to your install within one heartbeat cycle (≤6 hours); for immediate effect, restart the engine after the plan change so the next heartbeat fires on boot.