How prices are set
Objective
Section titled “Objective”There is no price list maintained by hand. Every instance price on this platform is derived from a published rule, recomputed on every run, so that the answer to “why does this cost that” is a calculation you can check rather than a number someone chose.
bootstrap/filter_plugins/pricing.py, driven by rating.yml.
The rule
Section titled “The rule”The same as the closest competitor, less 20%.
Precisely:
- Take the shape (vCPU and RAM).
- Find the closest AWS current-generation instance type that is at least as big — never smaller, so the comparison never flatters us.
- Take its on-demand price in
eu-west-2(AWS London), the market we sell into. - Subtract the discount: 20%.
- Convert to EUR at the ECB reference rate.
rating.yml fetches the AWS spec feed and the FX rate once per run and hands
both to pricing.py, which does the arithmetic. Nothing is cached across runs
and nothing is typed in.
| Field | Value |
|---|---|
| Rule | cheapest AWS equivalent, less the discount, in EUR |
| Rated by | A running instance, by its shape, per hour |
| Comparison region | eu-west-2 |
| Discount | 0.20 |
| Currency | EUR |
What the rule excludes, and why it matters
Section titled “What the rule excludes, and why it matters”pricing.py excludes the burstable (t) and Graviton families from the
AWS comparison. Both would produce a cheaper “equivalent” that is not equivalent:
a burstable instance is not a fixed-vCPU instance, and a Graviton instance is not
x86. Comparing against them would be picking the number that suits us.
That exclusion is also why four sub-2-GiB shapes were removed from the catalog:
with t and Graviton excluded, AWS has no current-generation non-burstable type
below 1 vCPU / 2 GiB, so every one of them priced identically to
cd-standard-1-2. See
Instance types.
How the inputs stay honest
Section titled “How the inputs stay honest”A computed price is only as trustworthy as the two numbers it is computed from — the competitor’s price and the exchange rate. Both are handled so that a failure cannot quietly become a made-up price.
The exchange rate must answer on every run. If the rate cannot be fetched, the pricing run fails. It does not fall back to the rate it used last time, and it does not leave the previously published prices in place while pretending they were recalculated. A price that says it was computed today was computed today, or it was not published.
The competitor spec feed is cached for 24 hours. A stale cache still errs towards the last real fetch rather than towards an invented figure — the failure mode is a price up to a day old, never a price nobody measured.
Rules are written by converging, not by overwriting. Each step reads the current rating rules before it writes, so re-running the process changes only what actually differs. Rerunning is safe and is how drift is corrected.
Nothing invents a number. A shape with no competitor equivalent and no explicit price of its own is simply not rated — see below. The system would rather leave a gap than fill it with a plausible guess.
Overrides
Section titled “Overrides”An instance type may carry an explicit price_eur_hour of its own. It wins
over the computed price when present.
A shape priced neither way — no computed AWS equivalent and no explicit price — is not rated and is not billed. It is not free by intent; it is a hole, and a shape in that state should not be on sale.
Reading the prices
Section titled “Reading the prices”Prices are public and need no account:
GET https://storefront.job-rss-processor.workers.dev/v1/pricesGET https://storefront.job-rss-processor.workers.dev/v1/catalog/v1/catalog returns what we sell, the price per hour, and whether it is in
stock. /v1/prices returns the price of every shape, and
/v1/prices/comparison what the same machine costs elsewhere. All three are
cached for 60 seconds. Field by field:
Catalog and availability.
What is priced, and what is not
Section titled “What is priced, and what is not”| Resource | Rated today |
|---|---|
| Instance, per hour, by shape | Yes |
| Root disk | Included in the instance price |
| Attached volumes, per GiB-hour | No |
| Snapshots | No |
| Egress bandwidth | No |
| Floating IP addresses | No |
| API requests | No |
Only compute is rated. The catalog’s pricing rule prices the AWS-equivalent
instance type, and there is no storage price rule — which is why the
storage-dense shape cd-storage-4-16-1000 was pulled from the catalog rather
than sold at a compute price, and why a volume you create today costs nothing.
Unbilled is not free. These are gaps in the rating configuration, not a pricing decision, and closing them will change bills. Do not build a cost model on the assumption that storage stays at zero.
Egress
Section titled “Egress”We do not charge for egress today, and we do not yet promise not to. What the catalog does record is what the competition charges, with the date each figure was read:
| Provider | Region | Included | Beyond that | Read on |
|---|---|---|---|---|
| AWS | eu-west-2 | 100 GB/month | $0.09 /GB | 2026-09-04 |
| Azure | uksouth | 100 GB/month | $0.087 /GB | 2026-09-04 |
| OVHcloud | FR public cloud | Effectively unlimited | $0 | 2026-09-04 |
OVH is the honest exception: egress genuinely is included on their EU public cloud instances, the allowance is set high and the rate is zero, and saying otherwise on our own comparison would be a lie. Their whole price list is published without a key, in EUR per hour, so unlike AWS and Azure their base price is read rather than modelled.
Currency and rounding
Section titled “Currency and rounding”Prices are quoted in EUR. Metering converts a rated amount to minor units (cents) before it reaches Stripe, and an amount under half a cent for a period rounds down to zero — the period is still recorded, it simply bills for nothing. See Metering and invoicing.