docs: tier economics β the public cost-vs-price record (#664)
The living cost model behind the space-upgrade prices: input rates, formulas, per-tier profit estimates, break-even storage (the number that sets #561's quotas), and what could invert it all. The forerunner of the public ledger promised in #550 Part 11 β prices as checkable claims.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 file changed,
+122
−0
docs/tier-economics.md+122 −0
diff --git a/docs/tier-economics.md b/docs/tier-economics.md| new file mode 100644 |
| index 0000000..ba3440c |
| --- /dev/null |
| +++ b/docs/tier-economics.md |
| @@ -0,0 +1,122 @@ |
| +# π€ Tier economics β what a space costs us, what a space pays us |
| + |
| +This is the public record of how Eleven's space-upgrade prices relate to what |
| +spaces actually cost to run. It exists because of a commitment made in #562: |
| +**the price is the cost plus resilience, and that should be a checkable |
| +claim.** When the public ledger ships (#550 Part 11), this document is the |
| +cost-model half of the books; until then it's the working version, re-derived |
| +whenever prices or input rates change. |
| + |
| +Living doc: the *formulas* are the contract; the *numbers* are a snapshot |
| +(dated below). If you're reading this to make a decision, re-derive first. |
| + |
| +## Principles (decided in #562, held here) |
| + |
| +- **Self-hosting is free forever.** The paid thing is our hosting convenience, |
| + never the software. |
| +- **We can only price what ciphertext exposes**: storage bytes, member counts, |
| + space counts. Never content, never analytics. |
| +- **Paying deanonymizes you to Stripe, not to us.** The ledger holds two opaque |
| + Stripe ids, a tier key, and a period end per paid space β no email, name, or |
| + card detail, ever. |
| +- **The free tier is first-class.** Constraints (storage quotas) ratchet later |
| + and only for *new* spaces; existing spaces keep what they have. |
| +- **AI is never bundled.** Model tokens are the one marginal cost that can |
| + dwarf a subscription; bot/AI usage is a metered add-on (design in #562). |
| + |
| +## The price book (as of 2026-07-11) |
| + |
| +| Tier | Price | Billing | |
| +|---|---|---| |
| +| Family | β¬5/year | annual only | |
| +| Community & Friends | β¬4/month or β¬40/year | toggle | |
| +| Business | β¬99/month or β¬999/year | toggle | |
| + |
| +What paying buys today: the space stops counting toward the account's |
| +three-space creation limit, and it is never reclaimed as unused. Per-tier |
| +powers (storage quotas, member counts) arrive with #561 and will be recorded |
| +here when they do. |
| + |
| +## Input rates (snapshot, 2026-07-11) |
| + |
| +| Input | Rate | Source | |
| +|---|---|---| |
| +| Stripe fee (EU consumer card) | 1.5% + β¬0.25 per charge | Stripe pricing; EUR settlement, no FX | |
| +| Attachment storage (R2) | ~β¬0.014/GB-month | $0.015, zero egress | |
| +| DB snapshots (S3) | ~β¬0.021/GB-month | $0.023 | |
| +| Box (whole cloud plane) | ~β¬35/month | Hetzner + fixed services | |
| +| Resident-process slot | ~β¬0.81/month | box Γ· 40-instance capacity | |
| + |
| +**Hibernation is live** (the activator, #550 Part 4): an idle space is an S3 |
| +prefix, not a process β its marginal cost while asleep is storage alone. |
| +A space only pays the slot rate for the fraction of time it's awake. |
| +One deliberate exception: **a space with a bot sidecar never sleeps** (the |
| +sidecar's WebSocket holds it awake) β one more reason AI usage carries its own |
| +meter instead of hiding in a flat price. |
| + |
| +## The model |
| + |
| +For a tier with gross annual revenue `G` across `n` charges/year: |
| + |
| +``` |
| +net = G β (0.25 Γ n) β (0.015 Γ G) # Stripe fees out |
| +cost = GB_stored Γ storage_rate Γ 12 # media, the only real dial |
| + + slot_rate Γ 12 Γ awake_fraction # compute while awake |
| + + ~β¬0.10 # wakes, requests, push (noise) |
| +profit = net β cost |
| +break_even_GB = net Γ· (storage_rate Γ 12) # where a space stops covering itself |
| +``` |
| + |
| +Message *text* is never material: a decade of busy family chat is ~50 MB |
| +(~β¬0.01/year). The only way a space outspends its price is stored media. |
| + |
| +## Estimates per tier (snapshot, 2026-07-11) |
| + |
| +Usage profiles are typical-case estimates, not caps: |
| + |
| +| Tier | Gross/yr | Net/yr | Profile (est.) | Cost/yr (est.) | Profit/yr (est.) | Margin | Break-even storage | |
| +|---|---|---|---|---|---|---|---| |
| +| Family β¬5/y | β¬5.00 | β¬4.68 | 10 members, 5 GB, mostly asleep | ~β¬1.00 | ~β¬3.70 | ~74% | ~28 GB | |
| +| C&F β¬40/y | β¬40.00 | β¬39.15 | 40 members, 25 GB, awake ~20% | ~β¬6.30 | ~β¬32.90 | ~82% | ~230 GB | |
| +| C&F β¬4/m | β¬48.00 | β¬44.28 | same | ~β¬6.30 | ~β¬38.00 | ~79% | ~265 GB | |
| +| Business β¬999/y | β¬999.00 | β¬983.77 | 150 members, 100 GB, awake ~50% | ~β¬22.00 | ~β¬962 | ~96% | ~5.9 TB | |
| +| Business β¬99/m | β¬1,188.00 | β¬1,167.18 | same | ~β¬22.00 | ~β¬1,145 | ~96% | ~7 TB | |
| + |
| +Readings: |
| + |
| +- **Break-even storage is the number that matters.** A Family space must hold |
| + ~28 GB of media *forever* before β¬5/year stops covering it. That makes |
| + #561's storage quotas easy to set generously: ~20 GB Family, ~100β200 GB |
| + C&F, ~1β2 TB Business keeps every tier structurally unable to lose money |
| + while feeling unlimited in practice. |
| +- **Stripe's fixed fee punishes small monthly charges.** Family pays 6.5% of |
| + gross in fees on its single annual charge; a hypothetical β¬0.42/month |
| + Family would pay ~11Γ. C&F monthly hands Stripe β¬3.72/year vs β¬0.85 on |
| + annual. The picker defaults to Annual for this reason (and because a space |
| + is a years-scale commitment). |
| +- **The fixed floor is small.** The whole plane costs ~β¬420/year; roughly 85 |
| + Family spaces, or a dozen C&F annuals, or one Business space cover it |
| + outright. Beyond that, margin is contribution toward resilience and the |
| + co-operative endgame (#550 Part 10). |
| +- **Business margin is deliberately not an infra story.** At ~96% margin the |
| + price is buying priority support, SLAs, and features to come β not bytes. |
| + If that feels wrong when the books go public, that's the conversation the |
| + books exist to force. |
| + |
| +## What could invert these numbers |
| + |
| +1. **AI/bot usage** β excluded above by design; metered add-on or BYO key. |
| +2. **Media hoarding past break-even** β bounded by #561 quotas when they land. |
| +3. **A space that never sleeps** β bot-sidecar spaces; today that's a known |
| + subsidy, priced into the margins above. |
| +4. **Rate changes** β Stripe, R2/S3, or box pricing move; re-derive. |
| + |
| +## Re-deriving |
| + |
| +Update the two snapshot tables (input rates + estimates) and the date stamps; |
| +the formulas don't change. Current prices live in the provisioner's price book |
| +(`LCHAT_STRIPE_PRICES` on the cloud service; see |
| +`cloud-provisioner.md Β§ Billing`); money truth lives in the Stripe dashboard; |
| +entitlement truth in the provisioner ledger. Related: #550 (architecture + |
| +public books), #561 (limits/meters), #562 (pricing decisions), #614 |
| +(memberβadmin subscriptions β a different product, same Stripe account). |