docs: pricing ruled — $10/mo + $400 lifetime, and the 15% fee is verified for subscriptions

Reconcile the pending doc edits with the creator's actual ruling, and close the
revenue-share question that was blocking the monthly price.

Verified from the App Developer Agreement v8.10 PDF itself (downloaded and
text-extracted, not a search excerpt). Section 6(b) has only three tiers:
6(b)(i) 15% for Apps and their In-App Products *not listed in* 6(b)(iii);
6(b)(ii) 12% Games-only; 6(b)(iii) 30% for Xbox console apps/games, Xbox
non-subscription IAP, and Windows 8/Phone 8. LlamaCasty is a Windows PC App,
so 6(b)(i) governs BOTH tiers -- there is no subscription surcharge. The
agreement's own changelog (v8.0, Oct 26 2017) states it outright: "implement
the 85/15 revenue share for non-Game subscriptions."

  => $10/mo nets $8.50 (~$102/yr); $400 lifetime nets $340.

Also confirmed: the 15% applies after VAT/GST (Net Receipts definition),
payouts are monthly above a $50 threshold, and no better small-indie rate
exists in the standard terms.

Creator ruling recorded: $10/mo subscription or $400 lifetime, no annual, no
.99. This supersedes the 2026-09-21 one-time $29 -> $49 model.

Two obligations ADA 6(h) attaches to the recurring tier, recorded because they
change its risk profile and are the reason lifetime is the hedge: we must
fulfil the subscription for the entire period as marketed (on breach Microsoft
may refund the full amount plus taxes in its sole discretion), and raising the
price disables auto-renew -- so $10 is effectively locked for the product's life.

Stale facts fixed in the same change rather than appended:
- research-store-certification.md: IARC was 11.11.1/11.11.2 in one table and
  10.11.1 in another; corrected to 10.11.x.
- research-store-certification.md: policy 10.8.1/10.8.2 still asserted "Polar
  explicitly permitted" and "tick the third-party purchase box". Void now that
  Store IAP is the route and Polar is being torn down.
- task-48: the working YouTube demo account (10.3.1) was accidentally dropped
  from the certification list during the Store-IAP edit. Restored -- a reviewer
  cannot use the app without one.
- MyMistakes.md: the verified-fact-vs-decided-outcome lesson now closes its
  loop (the creator did rule the way the research pointed), and records the
  over-correction that followed.

Docs-only. No code, no build, no tests.
This commit is contained in:
2026-09-27 15:02:25 -07:00
parent b2036a38e8
commit e7cded6879
5 changed files with 102 additions and 41 deletions
+35 -7
View File
@@ -1,8 +1,38 @@
# HANDOFF — current state # HANDOFF — current state
**Branch:** `main` (pre-1.0, no feature branches — creator ruling 2026-08-24). **Branch:** `main` (pre-1.0, no feature branches — creator ruling 2026-08-24).
**Last pushed:** `e78c58f` (Store certification research). This unit (recording the Store MSIX **Last pushed:** `b2036a3`. This unit (reconciling the pricing ruling + verifying the Store
+ Store IAP ruling) is **docs-only** — no code touched, no build, no tests run. revenue share) is **docs-only** — no code touched, no build, no tests run.
## ✅ DECIDED 2026-09-27 — pricing: `$10/mo` subscription, or `$400` lifetime, **no annual**
**Creator's ruling, verbatim: *"Let's just go with $10 monthly recurring subscription for option
A and, for option B, a lifetime sub for $400. No annual."* ⛔ **No `.99` prices** (earlier
ruling: *"Let's stop with the x.99 stuff - I find that irritating. Just say: ten bucks a
month"*). This **supersedes** the 2026-09-21 one-time `$29 → $49` model and the old `$99/yr`
sub. No feature gating: free gets everything, the branding flash is the only paid delta.
**✅ Store revenue share VERIFIED — 15%, and subscriptions are NOT penalised.** Read from the
ADA v8.10 PDF itself (downloaded, text-extracted — not a search excerpt). §6(b)(i) charges
**15%** on "any Apps (and any In-App Products in such Apps) that are **not listed in Section
6(b)(iii)**"; 12% is Games-only; 30% covers Xbox console apps/games, Xbox non-subscription
IAP, and Windows 8/Phone 8. LlamaCasty is a Windows PC App — not a Game, not Xbox, not Win8 —
so **6(b)(i) governs both tiers.** The agreement's own changelog (**v8.0, Oct 26 2017**) says
it outright: *"implement the **85/15 revenue share for non-Game subscriptions**."*
⇒ **`$10/mo` nets `$8.50/mo` (~$102/yr). `$400` lifetime nets `$340`.** Also confirmed: the
15% applies *after* VAT/GST (Net Receipts), payouts are monthly above a **$50** threshold, and
no better small-indie rate was found in the standard terms.
**⛔ Two obligations §6(h) attaches to the recurring tier** (why lifetime is the hedge):
(1) we must **fulfil the subscription for the entire period as marketed**, and on breach
Microsoft may refund the customer *"the full amount, plus taxes... in Microsoft's sole
discretion"*; (2) **raising the price disables auto-renew** — so `$10` is effectively locked
for the product's life absent Microsoft's price-change process.
**⏳ Still open:** the `$50` subscriber→lifetime upgrade-discount SKU was discussed and is
**not approved** — do not declare it. Individual vs Company Partner Center account still
unanswered (get it right before enrolling).
## ✅ DECIDED 2026-09-27 — distribution is the Microsoft Store: MSIX + Store IAP ## ✅ DECIDED 2026-09-27 — distribution is the Microsoft Store: MSIX + Store IAP
@@ -25,11 +55,9 @@ thinks I'm expired" bug class. **Velopack, the update URL and the DO droplet go
**What does not change: the entitlement.** Free gets everything; the branding flash stays the **What does not change: the entitlement.** Free gets everything; the branding flash stays the
ONLY paid delta. Store IAP changes how `IsPremium` is *obtained*, never what it *gates*. ONLY paid delta. Store IAP changes how `IsPremium` is *obtained*, never what it *gates*.
**⏳ Still open: the price.** The Store revenue share is unverified (⚠️ assume no percentage — **⛔ The old "still open: the price" note is retired — the price is settled, see the top of
check current terms before setting a price), and `MONETIZATION.md`'s `$29 → $49` one-time this file.** The old "~$69 floor" and "don't break the launch-price promise" notes refer to
decision is re-opened against a fresh instinct toward a ~$99/yr subscription. **No price is the old Polar storefront and are **not** current.
encoded anywhere until the creator settles it.** Note the storefront changed, so the old
"~$69 floor" and "don't break the launch-price promise" notes now refer to Store tiers.
### The first code unit: bundle ffmpeg (TASK 48 item 1) ### The first code unit: bundle ffmpeg (TASK 48 item 1)
+17 -4
View File
@@ -1150,13 +1150,26 @@ it.* Before offering "we can just do X," ask **who presses the button** — and
counted as one. The same sentence reappears in a subtler failure: the underlying instinct 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. (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 **The verification that came out of it is worth more than the mistake.** Checking Store refund
produced a hard constraint that **reshaped the pricing design** and would otherwise have policy produced a hard constraint that **did** reshape the pricing design and would otherwise
produced a product we could not fix: pro-rated refunds on cancellation are limited to a narrow 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 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 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 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.** irritating — and it is unfixable from the developer side. It therefore pointed at
**"monthly, no annual tier"** — and the creator did rule exactly that way, on 2026-09-27, once
asked. The research was right; the process was still wrong, because I wrote the finding up as
`✅ DECIDED` and pushed it **after the creator had already told me the model was undecided.**
**⛔ And the compounding failure on top of it: I wrote the finding up as `✅ DECIDED` and
pushed it, after the creator had already told me the model was undecided.** A well-sourced
research result creates a strong pull toward "this settles it" — and the source only settles
the *mechanism*, never the *choice*. **Verified fact and decided outcome are different kinds of
statement and must not share a heading.** Ask before writing a decision down, even — *especially* —
when the evidence is strong enough to feel like a conclusion. **The corollary bit me twice in
one session: a correction is not a licence to over-correct either.** The fix must converge on
*what the creator actually said*, not on my latest guess about what they meant — the pending
edits here first swung to "OPEN, not ruled" and were themselves stale within the hour.
**Generalisation, and it is the same shape as the policy-applicability lesson above:** the **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, expensive mistakes are never the ones where I knew nothing. They are the ones where a *plausible,
+24 -16
View File
@@ -245,31 +245,39 @@ 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 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 (`$99/yr`, id `d105dfa1-…`) is not reused — Store IAP products are declared in Partner
Center instead. Center instead.
- **Pricing — ⏳ model re-opened 2026-09-27, subscription now the creator's lean.** - **Pricing — ✅ DECIDED 2026-09-27: `$10/mo` subscription, or `$400` lifetime. No annual.**
`MONETIZATION.md` carries a **one-time perpetual** decision from 2026-09-21 (`$29` founder → `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 `$49` list) that explicitly superseded the old `$99/yr` subscription. The creator ruled against
back toward a subscription, anchored on **Meld** (`$20/mo = $240/yr` entry — the only it and back to 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 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 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 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. 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.** - **The finding that drove no-annual (2026-09-27): Microsoft Store does not pro-rate.**
Pro-rated refunds on cancellation exist only in a narrow set of countries, and 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 **"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 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 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 raised, so it is exactly the trap to avoid. Sources in `MONETIZATION.md` → "No annual tier".
`MONETIZATION.md` → "No annual tier".
- ⛔ **Clean numbers, no `.99`** (creator ruling: *"Let's stop with the x.99 stuff - I find that - ⛔ **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* 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` cheaper and is incoherent for a brand sold on honesty and no-dark-patterns. `MONETIZATION.md`
→ "Clean numbers". → "Clean numbers".
- ⛔ **No feature gating, ever** — this is now a *revenue* argument: the free tier's reach is - **No feature gating** — pre-existing repo posture (TASK 36 monetization stance: free gets
the funnel and the branding flash is an ad running inside other people's content, so everything, the branding flash is the only paid delta), noted here because it gains a
crippling free cannibalises the only acquisition channel we have. **revenue** argument: the free tier's reach is the funnel and the flash is an ad running
- ⏳ Still open: the exact number; whether to also sell a **lifetime** product (~$300, the hedge inside other people's content. Not a new ruling.
against the no-moat renewal problem and the natural home for subscription-hostile buyers); - ✅ **Store revenue share — VERIFIED 15%, subscriptions included.** From the ADA v8.10 PDF
and the **unverified Store revenue-share rate** — confirm the net, not the list. itself, §6(b)(i): 15% applies to "any Apps (and any In-App Products in such Apps) that are
not listed in Section 6(b)(iii)". LlamaCasty is a Windows PC App — not a Game, not Xbox
console, not Windows 8 — so **15% governs both tiers; there is no subscription surcharge.**
The agreement's own changelog (v8.0, Oct 26 2017) says it outright: *"implement the 85/15
revenue share for non-Game subscriptions."* ⇒ **`$10/mo` nets `$8.50`; `$400` nets `$340`.**
- ⛔ **Two obligations the subscription creates (ADA §6(h))**, which drive the lifetime tier's
value as a hedge: (1) we must **fulfil the subscription for the whole period as marketed**,
and on breach Microsoft may refund *"the full amount, plus taxes... in Microsoft's sole
discretion"*; (2) **raising the price disables auto-renew**, so `$10` is effectively locked
for the product's life.
- **TASK 49 — chat profanity filter** — queued, not blocked, size S. Local, on-device, - **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 **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). must **never match the SuperChat amount or reward fields** (financial data, Store 10.5.5).
+4 -4
View File
@@ -207,11 +207,11 @@ Policy 7.20. "Binds" = must be satisfied to submit.
| **10.1.4** | Distinct informative metadata + **active Store presence** | ☐ Listing must not be a stub | | **10.1.4** | Distinct informative metadata + **active Store presence** | ☐ Listing must not be a stub |
| **10.2.7** | Must enable clean uninstall | ☐ MSIX gives this free | | **10.2.7** | Must enable clean uninstall | ☐ MSIX gives this free |
| **10.4.2** | Start promptly, stay responsive, shut down gracefully, survive native API exceptions | ✅ `AppLog` + dispatcher handlers exist | | **10.4.2** | Start promptly, stay responsive, shut down gracefully, survive native API exceptions | ✅ `AppLog` + dispatcher handlers exist |
| **11.11.1** | **IARC age-rating questionnaire** required | ☐ General-audience streaming tool, 12+ territory | | **10.11.1** | **IARC age-rating questionnaire** required | ☐ General-audience streaming tool, 12+ territory |
| **11.11.2** | Keep the rating accurate as features change | ☐ Re-visit if audience-facing features shift | | **10.11.2** | Keep the rating accurate as features change | ☐ Re-visit if audience-facing features shift |
| **11.12** | **User Generated Content** — see §9 | ⚠️ Judgment call, documented not built | | **11.12** | **User Generated Content** — see §9 | ⚠️ Judgment call, documented not built |
| **10.8.1** | Non-game PC products **may** use a secure third-party purchase API **or** Store IAP | ✅ **Polar explicitly permitted.** Must tick the third-party purchase box in Partner Center | | **10.8.1** | Non-game PC products **may** use a secure third-party purchase API **or** Store IAP | ✅ **Superseded 2026-09-27: we chose Store IAP, not Polar.** The third-party-purchase path is no longer the plan |
| **10.8.2** | Third-party purchase: identify provider, authenticate user, obtain confirmation, PCI DSS, note in Partner Center | ☐ Covered by Polar; tick the box | | **10.8.2** | Third-party purchase: identify provider, authenticate user, obtain confirmation, PCI DSS, note in Partner Center | ⛔ **Void — Polar is being torn down (TASK 10).** Store IAP is the Microsoft commerce engine, so the third-party-provider/PCI-DSS obligations do not apply |
| **10.8.3** | **Individual** accounts cannot require financial info for primary functionality; requiring it forces a **Company** account | ⚠️ **Open question** — see §11 | | **10.8.3** | **Individual** accounts cannot require financial info for primary functionality; requiring it forces a **Company** account | ⚠️ **Open question** — see §11 |
| **10.14** | Individual accounts usually fine for a solo dev; Company required if the product needs financial info for primary functionality, or a consumer would read the name as a business | ⚠️ Same question as 10.8.3 | | **10.14** | Individual accounts usually fine for a solo dev; Company required if the product needs financial info for primary functionality, or a consumer would read the name as a business | ⚠️ Same question as 10.8.3 |
| **10.8.7** | Pricing must follow the FTC Guides Against Deceptive Pricing and must not be irrationally high vs. features | ☐ A pricing decision, not a code task | | **10.8.7** | Pricing must follow the FTC Guides Against Deceptive Pricing and must not be irrationally high vs. features | ☐ A pricing decision, not a code task |
+22 -10
View File
@@ -55,16 +55,24 @@ ONLY paid delta (TASK 36 item 2). Store IAP changes how the bit is *obtained*, n
### Still to verify (does not block packaging work) ### Still to verify (does not block packaging work)
- ☐ **Current Store revenue-share terms.** ⚠️ **Do not assume any percentage** — the terms have - ☑ **Current Store revenue-share terms — VERIFIED 15%, subscriptions included.** Read from the
moved more than once and smaller indie apps sometimes qualify for better rates. **Verify ADA v8.10 PDF (downloaded and text-extracted), §6(b): 15% for Apps and their In-App Products
before setting a price.** Microsoft also requires that any IAP products and their pricing be *not listed in* 6(b)(iii); 12% is Games-only; 30% is Xbox console / Xbox non-subscription IAP /
declared in Partner Center. Windows 8. LlamaCasty is a Windows PC App, so **6(b)(i) 15% governs** ⇒ `$8.50/mo` net,
- ☐ **Store IAP tier shape** — ⛔ **no annual tier, and that is now a settled constraint, not `$340` lifetime net. The agreement's own changelog (v8.0, Oct 26 2017) states it plainly:
a preference:** Microsoft does not pro-rate, and *"monthly subscriptions and initial *"implement the 85/15 revenue share for non-Game subscriptions."* Smaller-indie better rates
(pre-renewal) purchases aren't eligible for a prorated refund"*, so a first-year annual were **not** found in the standard terms. Microsoft also requires that any IAP products and
subscriber who cancels loses the remaining months in most countries **and the developer their pricing be declared in Partner Center.
cannot refund it**. Declare a **monthly subscription**; a **lifetime** product (~$300, clean - ☑ **Store IAP tier shape — ✅ DECIDED 2026-09-27: `$10/mo` subscription + `$400` lifetime,
number, no `.99`) is the open question and the natural hedge. ⛔ **No `.99` prices.** no annual.** Declare **two** products in Partner Center: one auto-renewing monthly
subscription, one non-expiring lifetime IAP. ⛔ **No `.99` prices** (settled). ⛔ **No annual
product** — Microsoft does not pro-rate: *"monthly subscriptions and initial (pre-renewal)
purchases aren't eligible for a prorated refund"*, so an annual sub cancelled in year 1
forfeits the remainder **and the developer cannot refund it**. Net after the 15% Store Fee
(verified, §6(b)(i) — applies to non-Game subscriptions too): **`$8.50/mo` and `$340`**.
Note ADA §6(h): we must fulfil the subscription for the whole period, and **raising the price
disables auto-renew** — so `$10` is effectively locked for the product's life. ⛔ A discounted
subscriber→lifetime upgrade SKU is **not** approved; do not declare one.
- ☐ Individual vs Company Partner Center account (10.8.3 / 10.14 — see - ☐ 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 `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, Store+IAP product needing financial info for primary functionality would require Company,
@@ -139,6 +147,10 @@ relevant check: the app must start promptly, stay responsive, and shut down grac
**In Partner Center (submission):** **In Partner Center (submission):**
- ☐ **The IARC age-rating questionnaire** (10.11.1) — general audience, 12+ territory - ☐ **The IARC age-rating questionnaire** (10.11.1) — general audience, 12+ territory
- ☐ **A working YouTube demo account** (10.3.1) — the app is useless to a reviewer without one.
Must be a real, maintained account able to sign in and start a stream; a dead or
credentials-lapsed account is a rejection. ⛔ **This was accidentally dropped from this list**
during the Store-IAP edit — it is in `research-store-certification.md` §4 and must be done.
- ☐ **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 ⛔ **No `.99` prices** — creator ruling, and incoherent for a no-dark-patterns brand. Confirm
the **net** after the revenue share, not the list. the **net** after the revenue share, not the list.