docs: purge the dead $29/$49 + Polar model from every tracked file, add the Y1 forecast
The pricing ruling landed twice (2026-09-21 one-time, then 2026-09-27 Store IAP $10/mo + $400 lifetime) and the map never caught up. Six tracked files still told a future session that billing was Polar and the price was $29/$49. A stale memory map is worse than a stale comment: it is the file every session trusts, and this one was actively steering work toward a deleted provider. MONETIZATION.md (gitignored, so not in this commit) was rebuilt first: - "Revenue projections" now carries a modelled Year 1 forecast — pessimistic $4.0K / base $15.4K / optimistic $53.3K net, ~$22K weighted. Funnel is installs -> 35-45% activate -> 1.5-3% of active users pay. - Three findings recorded: Year 1 is ~97% lifetime transactions (subs net $392 of $15.4K, so MRR is not a Year-1 planning input); conversion dominates price (~1pp of conversion = ~$7K net, and ADA 6(h) locks $10 anyway); subscriber churn moves Year 1 by under $200 and is a Year-2 problem. - Break-even restated for $400: $25K net = 74 lifetime buyers, not 862. The price cut the volume requirement ~10x and raised the skill requirement to match. - Market sizing willingness-to-pay row rewritten. The 100K-400K TAM was price-bound to $29-49 and is wrong at $400; revised ~20K-60K, flagged as an estimate rather than a sourced number. - Flagged a real contradiction: $500K ARR needs ~4,900 concurrent subscribers, so the Exit section's ARR multiples do not describe what Years 1-3 produce. The defensible asset there is lifetime cash flow, not ARR. Tracked files corrected to match: - ai.md: paid-delta, pricing and billing bullets rewritten; Polar product id, org id, LCYT- key prefix and LLAMAFOUNDER/LLAMA50 marked as deleted; 15% share + net-after-tax recorded with the ADA 6(b)(i) citation. - TASKS.md: catalog row retitled as a teardown; the "still to verify — the price is not decided" note closed (it contradicted the ruling 20 lines below it); the OverlayHost "Polar unlocks alerts" open question marked resolved; Polar file-hosting deliverable removed from the release build. - task-10: reframed as a teardown. Steps 4-5 marked as surviving, 1-2-3-6-7 as deleting, 8 as a compliance action (Velopack downloads AND executes, which Store policy 10.2.2 does not permit). - task-36 item 5 (license-expiry reminders) struck — no key, no expiry, no lapse under Store IAP, so there is nothing to remind anyone about. - Distribution.md 4.2 / 4.4 / 4.5 marked obsolete; 4.5's "already implemented" corrected, since PolarLicenseService is being deleted rather than shipped. - README: "one-time license" -> "paid tier". Historical Polar sections are retained deliberately — the reasoning is reusable (merchant-of-record, fee comparison), only the conclusions are dead. Each is now labelled so it cannot be mistaken for the plan. No code touched.
This commit is contained in:
@@ -1506,7 +1506,8 @@ Apply this to every UI decision:
|
||||
|
||||
## Monetization (design decision — the branding flash is the sword)
|
||||
|
||||
Full pricing, discount codes, and Polar product details in `MONETIZATION.md` (gitignored).
|
||||
Full pricing and the Year 1 revenue forecast in `MONETIZATION.md` (gitignored). ⚠️ **No Polar
|
||||
product, discount code, or license key exists any more** — billing is Microsoft Store IAP.
|
||||
Brand palette and assets in `MARCOM.md` (gitignored). This section covers the in-app model.
|
||||
|
||||
Free forever: **all features unlocked for everyone** — no feature lock between free and paid.
|
||||
@@ -1554,30 +1555,40 @@ crooked.
|
||||
credit — `Advance` both *opens* the presentation and *ages* it by the same delta, so a single
|
||||
5.1s step blows clean through the 2s window. Always step in 1/30s increments like the real timer
|
||||
(the `Step` helpers in `BrandFlashOutputTests`).
|
||||
- **Paid (one-time perpetual license):** branding flash removed. `BrandFlashEnabled` is now a
|
||||
**derived, non-assignable** `!IsPremium` and the presenter's own `Enabled` gate is re-checked on
|
||||
every frame, so a key entered (or revoked) mid-credit cuts the advertisement on the next tick
|
||||
rather than letting it finish. That's it. No feature gating. Alerts, social bar slots, voice
|
||||
filters, TRAX, recording — everything is free.
|
||||
- **Pricing (2026-09-21 — switched from subscription to one-time "own it"):** **$29 lifetime** founder's
|
||||
price (launch → 90 days) → **$49 lifetime** list at GA. The key is **perpetual** (`IsPremium` never
|
||||
lapses; the old renewal/lapse path is dead). Rationale: a local app with no per-user server cost and a
|
||||
renewal-averse, free-surrounded audience — minimize commitment size, don't charge rent. Accessibility is
|
||||
the driver: the free tier is the *full* app (only the watermark differs), so a broke new streamer pays $0;
|
||||
the low one-time price is the "no recurring bill" entry. Full reasoning, and the dropped $49.99/yr →
|
||||
$99/yr subscription model, in `MONETIZATION.md`.
|
||||
- **Billing:** **Polar (polar.sh)** — open-source MoR (Apache 2.0), handles payments, **one-time orders**,
|
||||
license keys, and global tax compliance. Startup Program gives Scale plan free for 12 months.
|
||||
Product: `d105dfa1-497e-423b-8cd4-e0ee2e3abbc0` (⚠️ currently a $99/yr *subscription* product — must be
|
||||
re-created as a one-time product for the new model). Checkout: `llamacasty.com` → Polar hosted page.
|
||||
Org ID: `c05fb364-b967-4f6c-adf2-8a144e46d085` (org-scoped OAT — `organization_id` omitted from API calls).
|
||||
Key prefix: `LCYT-`. Discounts: `LLAMAFOUNDER` (100% off, 50 uses), `LLAMA50` (50% off, 12 months). Details in `MONETIZATION.md`.
|
||||
- **Paid:** branding flash removed. `BrandFlashEnabled` is now a **derived, non-assignable**
|
||||
`!IsPremium` and the presenter's own `Enabled` gate is re-checked on every frame, so the
|
||||
entitlement changing mid-credit cuts the advertisement on the next tick rather than letting it
|
||||
finish. That's it. No feature gating. Alerts, social bar slots, voice filters, TRAX, recording —
|
||||
everything is free. **How `IsPremium` is obtained is a billing concern and has changed twice;
|
||||
what it gates has not.**
|
||||
- **Pricing (✅ DECIDED 2026-09-27 — supersedes the 2026-09-21 one-time "own it" model):**
|
||||
**`$10/mo` subscription, or `$400` lifetime. No annual. No `.99` prices.** ⛔ The old `$29`
|
||||
founder → `$49` list lifetime ruling is **dead — do not cite it.** Two tiers, one delta: they
|
||||
break even at **month 40**, so they barely compete, which is why lifetime is safe to offer at
|
||||
launch instead of saving it for later. The free tier is the *full* app (only the watermark
|
||||
differs), so accessibility is preserved without pricing down. ⛔ No annual tier: Microsoft does
|
||||
not pro-rate and **the developer cannot refund** the forfeited remainder — verbatim the
|
||||
grievance that drove the ruling. **ADA §6(h): raising the price disables auto-renew, so `$10` is
|
||||
effectively locked for the product's life.** Full reasoning in `MONETIZATION.md` → Pricing.
|
||||
- **Billing: ⛔ Polar is DELETED — Microsoft Store IAP, Microsoft as merchant of record** (ruling
|
||||
2026-09-27; teardown in `TASKS/task-48-distribution-msix.md` item 0). **Revenue share 15%,
|
||||
subscriptions included** — verified from the ADA v8.10 PDF, §6(b)(i); the agreement's own v8.0
|
||||
changelog says *"85/15 revenue share for non-Game subscriptions"*. ⇒ net **~$8.50/mo**,
|
||||
**~$340** lifetime. Microsoft handles VAT/GST/sales tax, refunds, chargebacks, the customer
|
||||
portal, and device deactivation — the strongest argument for the switch. Net receipts are after
|
||||
tax, so commission is not paid on pass-through tax. Payouts monthly, $50 threshold.
|
||||
⚠️ **No Polar product, org ID, key prefix, or discount code exists any more** — `d105dfa1-…`,
|
||||
`c05fb364-…`, `LCYT-`, `LLAMAFOUNDER`/`LLAMA50`, the customer-portal validate endpoint, and the
|
||||
14-day offline-grace machine are all being deleted. Products are declared in **Partner Center**
|
||||
instead: one auto-renewing monthly subscription + one non-expiring lifetime IAP.
|
||||
⛔ A discounted subscriber→lifetime upgrade SKU is **not** approved.
|
||||
- **Support (creator's model, corrected 2026-09-01):** support = email + GitHub issues — the
|
||||
once-planned in-app bug-reporter is **out of product** (TASKS.md → closed list). Most queries are
|
||||
how-tos / feature requests / manual-skimmers. Maintenance cadence = "when I get around to it" with
|
||||
emergency patches; not a 24/7 service promise. The only license chatter is the paid-user **expiry
|
||||
reminder — now moot** (perpetual keys never expire, one-time model 2026-09-21); paid users see zero
|
||||
license UI. TASK 36 item 5 (expiry reminder) is superseded.
|
||||
reminder — now moot** (superseded twice: keys are moot because the lifetime entitlement never
|
||||
expires, and the entire license-key system is moot because Store IAP has no keys); paid users see
|
||||
zero license UI. TASK 36 item 5 (expiry reminder) is struck.
|
||||
|
||||
**Monetization awareness (built-in, ungated, free — 2026-09-01; v1 SCOPE per the complete-v1
|
||||
ruling — build order: capture → report → journey → Alerts):** the app is monetization-aware by
|
||||
|
||||
Reference in New Issue
Block a user