Spillway CMSStructured content like Drupal. Page building like Puck. Setup like Ghost. AI that drafts, people who approve.
Menu

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

SiteCampusEnterpriseAuto
Price$49 per site$249 per site$1,499 per organization, up to 10 sitesthe monthly maximum the customer sets, at least $49 (hard cap)
Web machines1 x shared-1x 512 MB, sleeps when idle1 x shared-2x 2 GB, always on2 x performance-2x 8 GB (dedicated CPUs), always onthe richest of the three whose cost at its limits fits in 70% of the cap
DatabaseSQLite on the volume, daily snapshotsManaged Postgres Basic with HA (recommended at install) or SQLiteManaged Postgres Launch with HAas the base plan
Page cachein-processin-processRedis (Upstash, 1 GB)as the base plan
SearchSQL full-textSQL full-textMeilisearchas the base plan
Media10 GB on the volume100 GB on object storage (R2, or Tigris on request) behind the CDN1 TB on object storage (R2, or Tigris on request) behind the CDNas the base plan
Bandwidth100 GB1 TB (1,024 GB)5 TB (5,120 GB)as the base plan
Backupsdaily, kept 30 dayshourly, kept 90 dayshourly, kept one year, cross-regionas the base plan
Stagingnoneone, sleeps when idleone, sleeps when idle, plus workstream previewsas the base plan
Uptime99.9% target99.9% SLA99.95% SLAas the base plan
CDN headers (s-maxage / stale-while-revalidate)300 / 3600600 / 36003600 / 86400as 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.

ItemRate
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 PostgresBasic $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.

ItemR2 (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)
Egressnonenone

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:

SizeA 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:

LineSiteCampusEnterprise
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

Was this page helpful?