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.
74 lines
5.3 KiB
Markdown
74 lines
5.3 KiB
Markdown
# TASK 10 — Monetization: watermark-only paid delta (branding flash)
|
||
|
||
> Catalog: [`TASKS.md`](../TASKS.md) — status and requirements live here.
|
||
|
||
**Goal:** a **paid tier that removes the branding flash and nothing else.** Every feature is free
|
||
— Alerts, social bar slots, voice filters, TRAX, recording, analytics. The free tier is the *full*
|
||
app. ⛔ **There is no feature gating, ever** — revenue argument, not taste: the free tier's reach
|
||
is the funnel, and the flash is an ad running inside other people's content, so a free user with a
|
||
flash every 30–60s is already paying in exposure.
|
||
|
||
**⚠️ STATUS: THIS IS A TEARDOWN, NOT A BUILD (2026-09-27).** The billing provider is
|
||
**Microsoft Store IAP**, not Polar. Everything below describing Polar is **dead** and is retained
|
||
only as history. **Do not resurrect any of it.** The teardown's file-by-file list lives in
|
||
[`TASKS/task-48-distribution-msix.md`](task-48-distribution-msix.md) item 0 — **work from there,
|
||
not from this file.**
|
||
|
||
**Pricing — ✅ DECIDED 2026-09-27: `$10/mo` subscription, or `$400` lifetime. No annual.**
|
||
|
||
| Tier | Price | Net after 15% | Role |
|
||
|---|---|---|---|
|
||
| Free | $0 | — | Everything, plus the branding flash. The funnel. |
|
||
| **Pro monthly** | **$10/mo** | ~$8.50/mo | The default. Low-risk entry. |
|
||
| **Pro lifetime** | **$400** | ~$340 | The hedge. Committed / subscription-hostile buyers. |
|
||
|
||
- **15% Store revenue share, subscriptions included** — verified from the ADA v8.10 PDF, §6(b)(i).
|
||
Net receipts are after VAT/GST, so commission is not paid on pass-through tax.
|
||
- **Break-even is month 40**, so the two tiers barely compete — which is why lifetime is safe to
|
||
offer at launch rather than saving it for later.
|
||
- ⛔ **No annual tier** — Microsoft does not pro-rate and the developer cannot refund the
|
||
forfeited remainder. ⛔ **No `.99` prices.** ⛔ **No discounted upgrade SKU.**
|
||
- **ADA §6(h): raising the price disables auto-renew ⇒ `$10` is effectively locked for life.**
|
||
- ⛔ **Superseded pricing, do not cite:** the 2026-09-21 one-time model (`$29` founder → `$49`
|
||
list lifetime) and the earlier `$49.99/yr → $99/yr` subscription.
|
||
|
||
**Related work — monetization awareness (2026-09-01, ungated, free):** this task's billing is the
|
||
*payer* side; the *product* also carries built-in, ungated monetization awareness for every creator —
|
||
reward-event capture (all 7 `liveChatMessage` reward event types → canonical `RewardEvent` → SQLite
|
||
persistence), per-session/broadcast reports (members, Super Chat $, stickers, gifts, milestones — the
|
||
in-app replacement for the emailed "stream activity report"), and a journey tracker (position % +
|
||
ETA vs. versioned, date-aware YPP thresholds; the Tier-2 bar doubles for new applicants 2027-02-01).
|
||
Details and design notes: `ai.md` → Monetization. This is tracked as related work under this task's
|
||
narrative, not a separate task number — it ships in its own code slices with one integration test each.
|
||
**Scope: v1** (2026-09-01 complete-v1 ruling — there is no v1.x): slice order = reward-event capture →
|
||
session report → journey tracker → Alerts (TASK 3 item 20).
|
||
|
||
**Business details (pricing, Partner Center product declaration) in `MONETIZATION.md` (gitignored).**
|
||
|
||
### Status: 🔶 TEARDOWN — steps 1–7 shipped under Polar, all now to be removed
|
||
|
||
Steps 1–7 below are a **record of what was built**, not a description of what ships. The Polar
|
||
licensing path is being deleted because Store IAP supplies the same bit from the OS entitlement.
|
||
|
||
1. ⛔ **Billing provider** — was Polar (polar.sh). **DELETED.** The product, checkout link, and the
|
||
discount codes `LLAMAFOUNDER` / `LLAMA50` no longer exist. Store IAP products are declared in
|
||
**Partner Center**, not Polar.
|
||
2. ⛔ **License key entry + verification UI** — was the About-overlay swap panel
|
||
("Enter License Key"). **DELETING.**
|
||
3. ⛔ **Offline entitlement** — was `LayoutStore` Settings (`LicenseKey`, `LicenseValidatedAt`,
|
||
`IsPremium`) + a 14-day offline grace period + startup re-validation. **DELETING.** The OS
|
||
supplies license state, so the entire offline-grace machine goes with it — along with the whole
|
||
"network flaky → app thinks I'm expired" bug class.
|
||
4. ✅ **BrandFlash → watermark toggle** — `IsPremium` setter flips `BrandFlashEnabled = !value`, so
|
||
the flash stops the moment the entitlement flips. **This survives the teardown.** Under Store IAP
|
||
`IsPremium` is derived from the Store entitlement rather than a remote HTTP call. One bit,
|
||
locally cached, refreshed by the OS. ⚠️ **This is the whole product surface of the paid tier.**
|
||
5. ✅ **Remove social slot locks** — all 6 social bar slots open to everyone. **Survives.**
|
||
6. ⛔ **"Unlock Premium" button** — `PremiumUrl` pointed at Polar checkout. **DELETING**; the Store
|
||
handles purchase. Paid users see zero license UI.
|
||
7. ⛔ **Licensing model / renewal-lapse path** — already dead before the Store ruling (a perpetual
|
||
key never expires). Now superseded again: **Store IAP has no keys at all.**
|
||
8. 🔶 **Velopack auto-updates** — NuGet packages + bootstrap in `App.xaml.cs`. **TEARDOWN is a
|
||
compliance action, not cleanup:** the updater downloads *and executes*, and Store policy 10.2.2
|
||
does not permit it. Tracked as [`TASKS/task-48-distribution-msix.md`](task-48-distribution-msix.md)
|
||
item 3; the Store updates the app instead. |