carlos / platform Public

pricing: the 50% discount draws on the pool, and the pool rises to 15%

Full-price customers now visibly fund the half-price ones. The pool
gains a second draw line, the revenue forgone to the 50% code, beside
free-tier cost and house accounts, and the fraction rises from 10% to
15% because the free tier alone no longer explains it. At 15% in steady
state, discounted customers can be about a quarter of the paying base
with headroom left over; the top-up bridges the rest.

The budget gates the free tier only. An unconditional promise that
stops being honoured when a budget runs out was never unconditional,
and the person refused cannot see why, so a pool going negative on
discount draw is a signal to raise the top-up rather than a reason to
turn anyone away.

Two caveats are published with the number, because the books are the
whole point. A discounted customer is individually profitable, so the
discount is not a loss being covered. And the subsidy claim is only
literally true for someone who would otherwise have paid full price,
which we cannot distinguish and is exactly why the offer works without
asking. So the published claim is what we gave away, never a claim
about who paid for whom.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul Campbell pushed by paul@keymail.dev c16f920105d534e96fb1d2e08d3f7bea4490137c parent 4c3000c
1 file changed, +52 −11
  • docs/superpowers/specs/2026-09-07-carloku-pricing-plans-design.md +52 −11

CI passed — run details

diff --git a/docs/superpowers/specs/2026-09-07-carloku-pricing-plans-design.md b/docs/superpowers/specs/2026-09-07-carloku-pricing-plans-design.md
index f3bd48a87..ff148d8bf 100644
--- a/docs/superpowers/specs/2026-09-07-carloku-pricing-plans-design.md
+++ b/docs/superpowers/specs/2026-09-07-carloku-pricing-plans-design.md
@@ -270,6 +270,11 @@ the band-D Business figure was computed against the old 50k write inclusion
and is corrected here). Every combination stays comfortably profitable, which
is what makes the offer sustainable rather than performative.
+**The forgone half draws on the pool** (Paul, 2026-09-08), so full-price
+customers visibly fund the discounted ones and the books show what was given
+away. The budget never gates the code — see the pool section for the
+mechanism and for the two caveats that keep the published claim honest.
+
It stacks with the affordability index because the index is a Price and the
code is the session's one coupon slot.
@@ -331,13 +336,17 @@ pay rather than a slogan.
### The pool
- pool = 10% × recognised monthly revenue + bootstrap top-up (€200/mo anchor)
- draw = Σ free accounts' cost-to-us (the dashboard figure IS the draw)
+ pool = 15% × recognised monthly revenue + bootstrap top-up (€200/mo anchor)
+ draw = free-tier cost-to-us
+ + discount forgone revenue (the 50% code)
+ + house-account cost-to-us
head = pool − draw
Already specified and partly built: the ledger lives at
`internal/console/economicsview.go:479-580`, `isPoolTier` at `:678`, and the
-top-up accrues per-day against each day's own month length.
+top-up accrues per-day against each day's own month length. The 2026-08-13
+spec set the fraction at 10% when the free tier was the only draw; **it rises
+to 15% because the discount now draws too** (Paul, 2026-09-08).
**"Recognised revenue" must become real revenue before this is published
(codex 10).** The existing ledger funds the pool from `PriceAccount`
@@ -354,12 +363,42 @@ own honesty rule on the very page that asserts it.
€200/month bootstrap top-up alone funds roughly 690 of them before a single
paying customer contributes.
-**As draw approaches the pool, generosity degrades and availability never
-does.** Hibernation tightens, caps step down for new consumption, uploads past
+**The discount draws forgone revenue, not cost** (Paul, 2026-09-08). Full-price
+customers fund the half-price ones, and the books say so:
+
+| Plan | Full net/yr | At 50% | Forgone — the draw |
+| --- | --- | --- | --- |
+| Personal | €23.10 | €11.43 | €11.68 |
+| Community (10) | €48.40 | €24.07 | €24.32 |
+| Business (10) | €486.25 | €243.00 | €243.25 |
+
+At 15% of revenue in steady state with the top-up gone, discounted customers
+can be **about a quarter of the paying base** with headroom left for the free
+tier; the pool goes negative near 30%. Those are the numbers the top-up exists
+to bridge, and the fraction is a knob for the annual review.
+
+**Two honest caveats, both published.** A discounted customer is individually
+profitable — €6.89/year on Personal against €18.57 from a full payer — so the
+discount is not a loss being covered. And "full payers subsidise them" is only
+literally true for someone who would otherwise have paid full price; for
+someone who would not have subscribed at all it is incremental margin. We
+cannot tell those apart, which is exactly why the offer works without asking.
+So the published claim is **what we gave away**, never a claim about who paid
+for whom.
+
+**The budget gates the free tier, never the discount** (Paul, 2026-09-08). As
+draw approaches the pool, free-tier generosity degrades and availability never
+does: hibernation tightens, caps step down for new consumption, uploads past
the storage line are refused. Nothing is killed for budget reasons and nothing
-is deleted. The free tier is therefore self-limiting by construction: there is
-no "the free tier is eating us" cliff, and "how generous can we afford to be"
-is a dashboard line rather than an argument.
+is deleted. **The 50% code is never gated** — an unconditional promise that
+stops being honoured when a budget runs out was never unconditional, and the
+person refused cannot see why. A pool going negative on discount draw is a
+signal to raise the top-up or the fraction, and it is visible on the books
+page the moment it happens.
+
+The free tier is therefore self-limiting by construction: no "the free tier is
+eating us" cliff, and "how generous can we afford to be" is a dashboard line
+rather than an argument.
## Billing mechanics
@@ -564,7 +603,7 @@ accepted at `:358`, branched at `:434`). The first draft claimed otherwise.
| --- | --- | --- |
| Income & expenditure | what came in, what went out | expenditure: **real today** from `economics/bills/<month>.json` (Cost Explorer). Income: **does not exist yet** — nothing takes payment. |
| Unit economics | input rates, the 80/20 rule, per-plan margin and break-even | statements × active scenario |
-| The pool | budget, draw, headroom, house accounts on their own line | `internal/console/economicsview.go` |
+| The pool | budget, headroom, and the three draws on their own lines — free tier, discount forgone revenue, house accounts | `internal/console/economicsview.go` |
**The honesty rule, which is the entire value of publishing:** never put a
modelled number in a slot a reader will take as actual. Until Stripe is live,
@@ -649,8 +688,10 @@ this spec is not a small one.
pool degradation steps, and the flush-only replication class from step 5).
14. Monthly overage pass with the €1 floor.
15. Dormancy archive at 90 days with 60/80-day warnings.
-16. Pool funded from recognised subscription revenue rather than modelled
- revenue (codex 10).
+16. Pool at 15% with three draw lines (free-tier cost, discount forgone
+ revenue, house-account cost), funded from recognised subscription
+ revenue rather than modelled revenue (codex 10). Degradation applies to
+ the free tier only; the discount is reported, never gated.
17. Books site: publisher pass shipping a static release + three pages
(codex 11).
18. `CARLOS_STRIPE_SECRET_KEY` and `CARLOS_STRIPE_WEBHOOK_SECRET` read in