diff --git a/MyMistakes.md b/MyMistakes.md index d8f924b..0dec21a 100644 --- a/MyMistakes.md +++ b/MyMistakes.md @@ -1131,3 +1131,36 @@ the same class as the dead-Pin incident in `FfmpegLocator` (`ai.md` → FFmpeg l external thing changed, our record of it did not, and the mismatch was discovered by a user rather than by a test. **Records of the outside world rot silently and are believed until they cost money.** + +--- + +## 2026-09-27 — I offered a mitigation I had not checked the mechanics of: "just refund anyone who asks" + +While discussing a subscription price, I wrote that at `$99/yr` with zero marginal cost the +creator could **"just refund anyone who asks"** — presented as a free mitigation against the +churn/refund burden of a subscription. **That lever does not exist for Microsoft Store IAP.** +Refunds run through Microsoft, not the developer; the buyer requests them from the Store, and +the developer cannot unilaterally issue one. I proposed it before ever checking how Store +refund mechanics work, and it sounded confident because it was arithmetically true and +operationally impossible. + +**The rule:** *a mitigation is not an answer until you know who has the authority to execute +it.* Before offering "we can just do X," ask **who presses the button** — and if the answer is +"Microsoft, or the user's bank, or a regulator," then it is not our mitigation and must not be +counted as one. The same sentence reappears in a subtler failure: the underlying instinct +(refunds *should* be cheap when marginal cost is zero) was sound; the *agency* was invented. + +**The verification that came out of it is the real prize.** Checking Store refund policy +produced a hard constraint that **reshaped the pricing design** and would otherwise have +produced a product we could not fix: pro-rated refunds on cancellation are limited to a narrow +country list, and **"monthly subscriptions and initial (pre-renewal) purchases aren't eligible +for a prorated refund."** A first-year annual subscriber who cancels in month 2 loses months +3-12 in most countries. That is precisely the trap the creator had already named as +irritating — and it is unfixable from the developer side. **Hence: monthly, no annual tier.** + +**Generalisation, and it is the same shape as the policy-applicability lesson above:** the +expensive mistakes are never the ones where I knew nothing. They are the ones where a *plausible, +well-formed, unverified* claim got to speak without a check — a dead EV-certificate benefit, a +policy number with no scope, a refund lever I did not control. **Sound reasoning about a +mechanism I had not verified is the failure mode, not the safety net.** Before any external +mechanism drives a decision, name the one fact that would falsify it, then go get that fact. diff --git a/TASKS.md b/TASKS.md index 5176ad7..8a7efaa 100644 --- a/TASKS.md +++ b/TASKS.md @@ -245,12 +245,31 @@ second encoder path needing a "redirect". Record+simulcast is one ffmpeg with tw entitlement and the branding-flash delta carry over unchanged**. The stale Polar product (`$99/yr`, id `d105dfa1-…`) is not reused — Store IAP products are declared in Partner Center instead. -- **Pricing is re-opened** (2026-09-27) — `MONETIZATION.md` carries a **one-time perpetual** - decision from 2026-09-21 (`$29` founder → `$49` list) that explicitly superseded the old - `$99/yr` subscription; the creator's current instinct is back toward a subscription. - **Unresolved — do not encode a price until it is settled**, and note that Store IAP moves - pricing into fixed Store tiers, so the "floor" (`~$69` per `MONETIZATION.md`) and the - "don't break the launch-price promise" note now refer to a different storefront. +- **Pricing — ⏳ model re-opened 2026-09-27, subscription now the creator's lean.** + `MONETIZATION.md` carries a **one-time perpetual** decision from 2026-09-21 (`$29` founder → + `$49` list) that explicitly superseded the old `$99/yr` subscription. The creator is moving + back toward a subscription, anchored on **Meld** (`$20/mo = $240/yr` entry — the only + competitor sharing our shape: streaming tool, subscription, YouTube-native). The creator's own + read: **"XSplit only has legs because of their vcam product"** — its price is carried by a + system-wide driver, and **virtual camera output is permanently out of product**, so XSplit is + not a pricing comparator and its "lifetime ≈ 2x one year of sub" anchor is retired. + **Research that decides the tier shape (2026-09-27): Microsoft Store does not pro-rate.** + Pro-rated refunds on cancellation exist only in a narrow set of countries, and + **"monthly subscriptions and initial (pre-renewal) purchases aren't eligible for a prorated + refund"** — so a first-year annual subscriber who cancels loses the remaining months in most + countries, **and the developer cannot refund it**. That is verbatim the grievance the creator + raised, so it is exactly the trap to avoid. ⇒ **monthly, no annual tier.** Sources in + `MONETIZATION.md` → "No annual tier". + - ⛔ **Clean numbers, no `.99`** (creator ruling: *"Let's stop with the x.99 stuff - I find that + irritating. Just say: ten bucks a month"*). The `$x.99` convention only makes a price *look* + cheaper and is incoherent for a brand sold on honesty and no-dark-patterns. `MONETIZATION.md` + → "Clean numbers". + - ⛔ **No feature gating, ever** — this is now a *revenue* argument: the free tier's reach is + the funnel and the branding flash is an ad running inside other people's content, so + crippling free cannibalises the only acquisition channel we have. + - ⏳ Still open: the exact number; whether to also sell a **lifetime** product (~$300, the hedge + against the no-moat renewal problem and the natural home for subscription-hostile buyers); + and the **unverified Store revenue-share rate** — confirm the net, not the list. - **TASK 49 — chat profanity filter** — queued, not blocked, size S. Local, on-device, **non-persistent**, opt-in, **user-supplied word list (never a hardcoded slur list)**, and it must **never match the SuperChat amount or reward fields** (financial data, Store 10.5.5). diff --git a/TASKS/task-48-distribution-msix.md b/TASKS/task-48-distribution-msix.md index dd9337c..cb1c7a6 100644 --- a/TASKS/task-48-distribution-msix.md +++ b/TASKS/task-48-distribution-msix.md @@ -59,8 +59,12 @@ ONLY paid delta (TASK 36 item 2). Store IAP changes how the bit is *obtained*, n moved more than once and smaller indie apps sometimes qualify for better rates. **Verify before setting a price.** Microsoft also requires that any IAP products and their pricing be declared in Partner Center. -- ☐ **Store IAP tier shape** — one-time vs subscription. The creator's one-time-vs-both - question is still open; the storefront it is sold through is now decided. +- ☐ **Store IAP tier shape** — ⛔ **no annual tier, and that is now a settled constraint, not + a preference:** Microsoft does not pro-rate, and *"monthly subscriptions and initial + (pre-renewal) purchases aren't eligible for a prorated refund"*, so a first-year annual + subscriber who cancels loses the remaining months in most countries **and the developer + cannot refund it**. Declare a **monthly subscription**; a **lifetime** product (~$300, clean + number, no `.99`) is the open question and the natural hedge. ⛔ **No `.99` prices.** - ☐ Individual vs Company Partner Center account (10.8.3 / 10.14 — see `research-store-certification.md` §11 item 1). **Get this right before enrolling**; a Store+IAP product needing financial info for primary functionality would require Company, @@ -135,7 +139,9 @@ relevant check: the app must start promptly, stay responsive, and shut down grac **In Partner Center (submission):** - ☐ **The IARC age-rating questionnaire** (10.11.1) — general audience, 12+ territory -- ☐ **Declare the IAP products and their pricing** in Partner Center (required for Store IAP) +- ☐ **Declare the IAP products and their pricing** in Partner Center (required for Store IAP). + ⛔ **No `.99` prices** — creator ruling, and incoherent for a no-dark-patterns brand. Confirm + the **net** after the revenue share, not the list. - ☐ Note that the product is **general audience, not directed at under-13s** - ☐ The 11.12 UGC position is **less load-bearing now that Polar is gone** — the strong part of the original argument was "we render transiently, persist nothing, and provide no