Hosting plans and their cost model
The four hosting plans Spillway sells on Accorbis, what each one runs on Fly.io, and what that costs at Fly's published rates. The commercial decisions are recorded in open-decisions.md (hosting plans, decided 2026-11-05). The plans live as data in packages/fleet/src/plans.ts, the rates (Fly's, and R2's and Tigris's for object storage) as constants in packages/fleet/src/pricing.ts; every number below comes from those two files (spillway-fleet plan list prints the totals), and packages/fleet/src/test/plans.test.ts checks the totals in this page against the code. How to provision, change and run them is in fleet.md.
The plans
| Site | Campus | Enterprise | Auto | |
|---|---|---|---|---|
| Price | $49 per site | $249 per site | $1,499 per organization, up to 10 sites | the monthly maximum the customer sets, at least $49 (hard cap) |
| Web machines | 1 x shared-1x 512 MB, sleeps when idle | 1 x shared-2x 2 GB, always on | 2 x performance-2x 8 GB (dedicated CPUs), always on | the richest of the three whose cost at its limits fits in 70% of the cap |
| Database | SQLite on the volume, daily snapshots | Managed Postgres Basic with HA (recommended at install) or SQLite | Managed Postgres Launch with HA | as the base plan |
| Page cache | in-process | in-process | Redis (Upstash, 1 GB) | as the base plan |
| Search | SQL full-text | SQL full-text | Meilisearch | as the base plan |
| Media | 10 GB on the volume | 100 GB on object storage (R2, or Tigris on request) behind the CDN | 1 TB on object storage (R2, or Tigris on request) behind the CDN | as the base plan |
| Bandwidth | 100 GB | 1 TB (1,024 GB) | 5 TB (5,120 GB) | as the base plan |
| Backups | daily, kept 30 days | hourly, kept 90 days | hourly, kept one year, cross-region | as the base plan |
| Staging | none | one, sleeps when idle | one, sleeps when idle, plus workstream previews | as the base plan |
| Uptime | 99.9% target | 99.9% SLA | 99.95% SLA | as the base plan |
| CDN headers (s-maxage / stale-while-revalidate) | 300 / 3600 | 600 / 3600 | 3600 / 86400 | as the base plan |
Every plan also gets a 10 GB /data volume per web machine (SQLite, uploads until object storage lands in the core, generated secrets). Campus and Enterprise list media on object storage because that is the plan; until the core stores uploads there, the fleet records the quota and the uploads stay on the volume (see the provisioning notes in fleet.md).
Auto picks its base stack from the cap: up to $124 a month buys the Site stack, $125 to $973 the Campus stack, $974 and above the Enterprise stack (Campus costs $87.35 at its limits in ams and Enterprise $681.51, with media on R2; 70% of the cap must cover that). With media on Tigris the thresholds are $126 and $981. The controller then keeps the month inside the cap with the degrade ladder in fleet.md.
Rates
Read from https://docs.fly.io/about/pricing on 2026-11-05 (FLY_PRICES_READ_ON). Re-read them before the first invoice and bump the date.
| Item | Rate |
|---|---|
| Shared vCPU | $0.0000008465 per second |
| Performance vCPU | $0.000012732 per second |
| RAM | $0.000002316 per GB-second |
| Volume | $0.15 per GB-month |
| Managed Postgres | Basic $38, Starter $72, Launch $282 a month, plus $0.28 per GB-month of storage |
| Upstash Redis, fixed 1 GB | $20 a month |
| Egress, North America and Europe | $0.02 per GB |
Compute (machines only, not volumes or egress) is multiplied by region: ams 1.038, fra 1.154, lhr 1.135, ord 1.25, dfw 1.25, sjc 1.192, sin 1.269, syd 1.269, gru 1.615; regions not listed price at 1. A month is 730 hours (2,628,000 seconds), Fly's convention.
Object storage
Media on Campus and Enterprise lives on object storage behind the CDN. The cost model uses Cloudflare R2, the default store; Tigris is a per-site option (spillway-fleet provision --storage tigris, storage: 'tigris' in resolvePlan), and a plan change keeps the site's choice unless --storage says otherwise.
| Item | R2 (default) | Tigris |
|---|---|---|
| Storage | $0.015 per GB-month | $0.02 per GB-month |
| Class A operations (writes, lists) | $4.50 per million | $0.005 per 1,000 ($5 per million) |
| Class B operations (reads) | $0.36 per million | $0.0005 per 1,000 ($0.50 per million) |
| Egress | none | none |
R2's rates were read from https://developers.cloudflare.com/r2/pricing/ on 2026-11-05 (R2_PRICES_READ_ON); Tigris's are from https://www.tigrisdata.com/pricing/. R2's free tier is not counted: it is per Cloudflare account, not per customer.
R2 is the default because it is cheaper per GB, charges no egress, and may be served through Cloudflare's CDN under Cloudflare's terms, while Tigris served through a Cloudflare zone may not be. Tigris remains an option for customers who want everything on the Fly invoice.
The estimator prices operations when the usage counts them (Usage.mediaOps). Nothing meters them yet, so the figures on this page count none; behind the CDN a read reaches the store only on a cache miss, and a million of those cost $0.36 on R2.
Machines
What one machine costs for a full month before the region multiplier:
| Size | A month |
|---|---|
| shared-1x 512 MB | $5.27 |
| shared-1x 1 GB | $8.31 |
| shared-2x 2 GB | $16.62 |
| performance-2x 4 GB | $91.27 |
| performance-2x 8 GB | $115.61 |
Cost at the plan's limits
The estimator (estimateMonthly) prices a plan's stack for a whole month at the plan's limits: all of the bandwidth used, the media quota full, 10 GB of Postgres. Machines that sleep are counted at 30% of the month (a web origin with autostop) or 25% (staging); always-on machines at 100%. In ams:
| Line | Site | Campus | Enterprise |
|---|---|---|---|
| Web machines | $1.64 | $17.25 | $240.01 |
| Web volumes | $1.50 | $1.50 | $3.00 |
| Staging machine and volume | $4.31 + $1.50 | $4.31 + $1.50 | |
| Meilisearch machine and volume | $8.63 + $1.50 | ||
| Managed Postgres and storage | $38.00 + $2.80 | $282.00 + $2.80 | |
| Redis | $20.00 | ||
| Media on R2 | $1.50 | $15.36 | |
| Egress | $2.00 | $20.48 | $102.40 |
| Total | $5.14 | $87.35 | $681.51 |
| Price | $49 | $249 | $1,499 |
A typical Campus month (900 GB out) comes to $84.87; Campus on SQLite instead of Managed Postgres is $46.55 at its limits. The same stacks in a region without a multiplier (iad) cost $5.08, $86.56 and $672.25; in gru, the most expensive listed region, $6.05, $99.34 and $822.12. With media on Tigris instead of R2 only the media line changes: Campus costs $87.85 and Enterprise $686.63 at their limits in ams.
Not in these numbers: the CDN in front (Accorbis's Cloudflare zone), backup storage (hourly backups kept 90 days or a year live on object storage and grow with the site), object storage operations (see Object storage), egress outside North America and Europe (Fly charges more there and only the NA and Europe rate was read), extra IPv4 addresses, and the stopped machines' root file systems.
Spend to date and the projection
Fly has no budget or spend API, so the fleet computes spend itself (spendToDate) from Fly's Prometheus metrics (metrics.ts): machine seconds from the number of fly_instance_memory_mem_available samples (one per 15-second scrape per running machine), egress from fly_edge_data_out, and the fixed items (volumes, Postgres, Redis, object storage) prorated by the share of the calendar month that has passed. Machine seconds are priced at the plan's full stack, so a second measured before the controller downsized a machine is never repriced at the smaller size; the figure errs high.
The month-end projection is spend to date plus the rest of the month at the stack as it is now, at the egress and uptime rates measured so far (or at the plan's limits during the first 2% of the month, when there is too little data). Everything a degrade step keeps still bills: a removed replica's volume, a stopped Meilisearch machine's volume, and the Redis add-on until the controller deletes it. The projection counts them, so it never promises a saving the invoice will not show. The Redis add-on is the one thing a step deletes (its contents are a disposable page cache): once the site has served cleanly on its in-process cache for the redis step's dwell time, the add-on is deleted and its $20 a month leaves the projection for the rest of the month; restoring the step creates it again (fleet.md).
Spillway 0.1.0 · Edit this page on GitHub