Pricing
/pricing is what it costs, written for
someone deciding whether to sign up at all. It is public — no account, no
sign-in — for the same reason /status and
/install are: needing an account to find out the price is a
good way to not be asked.

The model
The shape is settled even though the numbers are not:
| You pay with | Prepaid credit, held per organization and shared by its members — see Billing |
| Metered in | Container-seconds, counted per container. Three replicas for an hour is three container-hours |
| Charged for | Running containers. Image builds are included |
| Not charged for | Seats, applications, or an organization with nothing deployed |
| Not metered yet | Egress bandwidth and registry storage — the page says so rather than implying they are free forever |
A container the platform started but never saw stop is reported separately rather than guessed at, and is not billed.
What is real, and what is a placeholder
This is the part worth being precise about, because "placeholder" has meant two different things on this page at different times:
| Status | |
|---|---|
| Metering | Real. App\Service\Usage\UsageMeter counts container-seconds against the organization |
| Top-ups | Real. Stripe Checkout, in test mode — see Billing |
| Drawing credit down | Real. App\Service\Credit\UsageBiller writes one debit per organization-hour, on a tick scheduled every 15 minutes |
| The rate per container-second | A placeholder. The figure on the page is indicative and has not been set from observed usage |
So a balance does move on its own. The amber banner on the page is about the rate, not about whether anything is charged — an earlier version of it said nothing was billed at all, which stopped being true once hourly debiting shipped.
Setting the rate from real observed usage, and taking the banner off once it is set, is tracked separately.
Where each figure comes from
No number on the page is meant to be an independent claim; each one is supposed to be the same number the product uses.
| On the page | Source |
|---|---|
$5 / $10 / $20 top-ups |
BillingTopUpFormType::FIXED_AMOUNTS_CENTS |
| "any amount from $1 to $500" | BillingTopUpFormType::CUSTOM_MIN_DOLLARS and CUSTOM_MAX_DOLLARS |
| Container-seconds as the unit | App\Service\Usage\UsageMeter, the same meter Billing reports from |
| The indicative rate | Currently a literal in templates/marketing/pricing.html.twig. The rate actually charged is CREDIT_RATE_CENTS_PER_CONTAINER_SECOND, and the two can drift — that is one of the things setting the real rate has to fix |
| "not metered" for containers the platform writes into your stack | App\Entity\Task::isBillable() for the per-binding proxy, and App\Service\Platform\PlatformTenancy::owns() for the organization the engine itself runs under — see Billing for the same fact in the reader's terms |
The top-up bounds are constants precisely so this page and the payment screen cannot disagree: a marketing page advertising a range the form then rejects is the worse of the two ways to get that wrong.