Billing Model¶
This page explains how Servala prices a managed service instance: the billing components, how they combine into a monthly total, and the mechanics behind sizing, discounts, and service levels.
It describes the structure of the model, not the actual prices. The live prices and the interactive price calculator are on servala.com. For the technical implementation (catalog sync, Odoo products, Kubernetes billing annotations) see Billing & Pricing.
Audience
This page is for platform operators, integrators, and anyone who needs to understand how a Servala invoice is built up. Customers see a single monthly price per service in the calculator, and an itemized breakdown on the invoice.
The idea in one line¶
Servala decomposes every service instance into independent billable components. Each component is priced and scaled on its own, and the sum is the monthly total. This keeps invoices transparent and lets the infrastructure layer (compute, storage) evolve independently from the service-operation layer (managed service, service levels).
flowchart LR
subgraph infra["Infrastructure layer (per cloud provider)"]
direction TB
comp["Compute"]
stor["Storage, incl. backups"]
csp["Additional CSP resources"]
end
subgraph ops["Service operation layer (per service)"]
direction TB
ms["Managed Service (flat)"]
mss["Managed Service Sizing (per unit)"]
end
lic["License (optional)"]
infra --> total(["Monthly total"])
ops --> total
lic --> total
Billing components¶
A service instance is billed through the following components:
| Component | What it covers |
|---|---|
| Compute | CPU and RAM resources, modeled as compute plans |
| Storage | Persistent storage, including backups |
| Additional CSP resources | Provider-specific extras such as load balancers or public IPs, where a service needs them |
| Managed Service | The flat cost of operating the service: monitoring, maintenance, updates, incident response |
| Managed Service Sizing | The scaling cost that grows with instance size |
| License | A commercial software license, where the software vendor requires one (optional) |
The monthly total is the sum of these components:
Total = Compute (per component × replicas)
+ Storage (per component × replicas)
+ Additional CSP resources (where applicable)
+ Managed Service (flat; includes service level surcharge if selected)
+ Managed Service Sizing (per unit × main component replicas)
+ License (where applicable)
Each component is described below.
Compute¶
A compute plan is a predefined bundle of CPU and RAM. Plan names are provider-independent (the same name means the same resources everywhere), while the plan price is derived from each cloud provider's infrastructure cost and therefore varies by provider. See Compute Plans & SLAs for the customer-facing view.
A service can consist of more than one component. For example, a Nextcloud instance runs alongside a PostgreSQL database. Each component has its own compute plan and its own replica count, and each appears as a separate compute line on the invoice. Components can be sized independently: the main service might run on a larger plan with two replicas while its database runs on a smaller plan with three replicas for higher availability.
Storage¶
Storage is billed per GiB and added on top of compute. The per-GiB rate already includes the cost of backups, so customers see a single storage rate without a separate backup line.
A provider can offer several storage classes (for example SSD or NVMe), each with its own per-GiB rate. Each persistent volume of a service is reported as its own storage line, so a service with supporting components shows multiple storage lines, each labelled by the component it belongs to. Storage scales with the replica count of the component it belongs to.
Additional CSP resources¶
Some service and provider combinations need infrastructure beyond compute and storage, such as load balancers, public or floating IP addresses, DNS records, or network traffic. Where they apply, these are passed through at the provider's rate and shown as separate line items. They are flat per instance and do not scale with replicas or storage size. The same service on a different provider may need none of these.
Managed Service¶
A flat fee per service instance, independent of instance size. It covers the minimum cost of operating a managed service: monitoring, maintenance, updates, and incident response. The fee depends on the service and on the selected service level. When a service level is selected, the flat fee increases to include the service level surcharge.
Managed Service Sizing¶
A per-unit fee that accounts for the growing complexity of operating larger instances: larger backups, longer recovery times, more involved tuning. Today all services use "per GiB RAM" as the unit, derived from the main component's compute plan (for example a plan with 8 GiB RAM counts as 8 units). Future services may use other units such as "per user".
The sizing fee uses a progressive discount model and is based on the main component only. Supporting components do not carry their own managed service or sizing fee: they are covered by the main service. Like the Managed Service flat fee, the per-unit rate increases to include the service level surcharge when a service level is selected.
License¶
When a managed service requires a commercial license or subscription from the software vendor, Servala resells it and the license appears as a separate line item. The billing shape follows the vendor's terms (per user, per instance, flat, or usage-based). Services built on open source software without a commercial vendor have no license component.
Composite services¶
A service can be composed of a main component and one or more supporting components (for example Nextcloud with a PostgreSQL database). Each component has its own compute and storage, with its own plan and replica count, and each appears on the invoice. The Managed Service and Managed Service Sizing fees are charged once for the whole instance, based on the main component. Supporting components do not carry their own managed service fee.
flowchart TB
subgraph si["Service instance"]
direction TB
subgraph main["Main component (e.g. Nextcloud)"]
mcs["Compute + Storage<br/>own plan and replicas"]
end
subgraph sup["Supporting component (e.g. PostgreSQL)"]
scs["Compute + Storage<br/>own plan and replicas"]
end
mgmt["Managed Service + Sizing<br/>charged once, based on the main component"]
end
Service levels (SLA)¶
Service levels are optional add-ons that provide an uptime guarantee. A service without a service level operates on a reasonable-effort basis with no uptime commitment, and any service level can be applied to any service. For the available levels and what they cover, see Service Levels.
From a billing perspective, when a service level is selected its surcharge is folded into both the Managed Service flat fee and the per-unit sizing rate, rather than appearing as a separate line. The surcharge is defined per service per service level, because guaranteeing uptime takes different effort for different services. This keeps the invoice structure identical whether or not a service level is chosen.
Some service levels require high availability. In that case a minimum number of replicas is enforced by the portal, and the customer cannot configure fewer. From a billing perspective such an instance is simply billed for the replicas it runs.
Progressive discount model¶
The per-unit sizing fee uses a progressive model that works like income tax brackets: the units of an instance are split into successive ranges, and each range gets its own per-unit rate. Higher ranges receive a larger discount, so the per-unit cost falls as an instance grows. The discount applies to the sizing fee only. Compute and storage are not affected.
Each range becomes its own invoice line, and the result is multiplied by the main component's replica count. When a service level is selected, its per-unit surcharge is added to the base rate before the discount is applied, so the surcharge is discounted at the same rate.
flowchart LR
u["Instance units<br/>(e.g. GiB RAM)"] --> r1["Lowest range<br/>no discount"]
u --> r2["Middle ranges<br/>growing discount"]
u --> r3["Highest range<br/>largest discount"]
r1 --> fee(["Sizing fee:<br/>sum of ranges × main replicas"])
r2 --> fee
r3 --> fee
Scaling behavior¶
When an instance scales, the components behave as follows:
| Component | Scaling behavior |
|---|---|
| Compute | Each component multiplied by its own replica count |
| Storage | Each volume multiplied by its component's replica count |
| Managed Service | Flat, always counted once |
| Managed Service Sizing | Bracket units multiplied by the main component's replica count |
The discount bracket is determined by the plan size, not by the total across replicas. The bracket split is calculated once from the plan and then multiplied by the replica count.