eleven / messenger Public

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>
Paul Campbell e07a109a8ee40a3edcb798ecf715408ba4f8c127 parent 3877d72
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).