From 7b395fcba48c1237c9169db02a4fb98d7e33c55d Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Tue, 18 Aug 2026 11:43:41 +0200 Subject: [PATCH] The price tag comes off the door and moves inside: free download, one 2.99 unlock Co-Authored-By: Claude Fable 5 --- PROJECT.md | 55 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/PROJECT.md b/PROJECT.md index 48bac38..d994ce9 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -20,7 +20,9 @@ anything, so if you add a `return` for an awkward deal, check the body still run the state-machine contracts that have historically produced the show-stoppers. The Dockerfile runs it as a build stage, so a red suite cannot deploy — but finding out from Coolify is the slow way. -Last updated 2026-08-15 (two sessions: the finetuning pass — gore opens in the gore, the menu theme +Last updated 2026-08-18 (the store model in LATER revised: free download + €2.99 unlock-everything +IAP with the free-tier gates, superseding paid-upfront; before that 2026-08-15, two sessions: the +finetuning pass — gore opens in the gore, the menu theme comes back, one world board per mode, and the barrel economy cut — over the batch below: six new opponent families and an 18-rung ladder, the tournament DRAW screen, three netplay fixes off Oliver's cellular report, the night court, and @@ -3449,15 +3451,41 @@ Nothing here is broken; these are known gaps and unverified risks. # LATER — shipping it: demo, stores, campaign -Decided in discussion with Oliver, 2026-07-31 and extended 2026-08-06. **None of this is built** — -the one thing that exists is the domain (item 5). Recorded here so the decisions survive; the -ordering below is roughly the order to do it in. +Decided in discussion with Oliver, 2026-07-31, extended 2026-08-06, model revised 2026-08-18. +**None of this is built** — the one thing that exists is the domain (item 5). Recorded here so the +decisions survive; the ordering below is roughly the order to do it in. -**The model: paid, $2.99, no ads.** Both stores. No ad SDK, no consent/CMP flow, no ATT prompt, no -tracking — which keeps the store card at "Data Not Collected", keeps review trivial, and keeps a -zero-dependency project zero-dependency. *Maybe* later: a free build capped at chapter 1 with an IAP -to unlock all chapters. That is a fallback, not the plan — paid→free is a normal move, free→paid is -not, so launch paid. +**The model (revised 2026-08-18): FREE download, one €2.99 non-consumable IAP that unlocks +everything, no ads.** Both stores. This supersedes the original "paid $2.99 upfront" decision +(2026-07-31) — the whole funnel is short-form video → impulse tap → store page, and an impulse does +not survive a price tag on an unknown game; the free tier does the convincing, not the price. €2.99 +stays the number (there is no 2,00 € tier; revenue is noise either way per the expectations below). +No ad SDK, no consent/CMP flow, no ATT prompt, no tracking — which keeps the store card at "Data Not +Collected", keeps review trivial, and keeps a zero-dependency project zero-dependency. A StoreKit +unlock does not break "Data Not Collected", but it does require a **Restore Purchases button** +(no accounts — StoreKit restore IS the reinstall/new-phone path; Apple rejects unlock IAPs without +it), and it is the wrapper's first real IAP plumbing. + +**The free tier (Oliver, 2026-08-18):** +- **Gore: free through the FIRST CHAPTER BOSS BEATEN**, cut on the chapter-2 card — the same cut, + same build flag as the web demo (item 1). The free tier must contain everything a promo clip + promises (transition, horde, weapons, duel, boss) and must end on a WIN, not a wall. +- **Zombie tennis: first 7 opponents, no tournament.** Frame the wall diegetically when the + tournament frame exists: QUALIFYING is free, "YOU'VE QUALIFIED — the main draw is in the unlock" — + the cut lands on a win in tennis language. Check where the six new families sit on the 18-rung + ladder; if rungs 1–7 are mostly the base family the free tier undersells the roster. +- **Classic tennis: fully free.** It is the decoy for the transition and costs nothing. +- **Multiplayer: joining free, hosting paid.** Friend-code rooms make every paid copy recruit its + own opponents — a payer hosting for a free friend is a live demo. (The socket is a staging + prototype; this gate waits on LATER item 7 shipping.) +- **World board: posting requires the unlock.** Free players SEE the board — put the upsell where + their row would have been, envy beats a lock icon. With no accounts this is also the cheapest + anti-spam gate the board can have. Mind the cold start: a payers-only board is nearly empty at + the honest sales estimate; the testteam's rows partially cover it. +- **Upsell placement is a feel rule**: only on win moments (chapter card, felled card) — never in + the death→restart gap that `EATEN_RESTART` protects. +- **Gates do not lower the age rating** — the store rates the binary's maximum content, and gore in + the free tier rates the free download 17+/USK 16 regardless. The gates buy conversion, not reach. **Ads are rejected**, with one exception held in reserve: rewarded video on the CHALLENGE (below), never an interstitial. An interstitial after death would land exactly in the "one more run" gap that `EATEN_RESTART` exists to protect, and would end sessions rather than annoy. @@ -3469,9 +3497,12 @@ never an interstitial. An interstitial after death would land exactly in the "on job is converting a 15-second clip into "I played it". Implementation is ~10 lines: a check on the chapter-2 card plus a build flag the store build sets to skip it. **Build no protection around it** — it is client-side JS on a static host, trivially - bypassable, and nobody who would pay $2.99 will open devtools. DRM here is pure cost. + bypassable, and nobody who would pay €2.99 will open devtools. DRM here is pure cost. Consider leaving **desktop uncapped** (`matchMedia('(pointer: coarse)')`, already used for `autoAssist`): nothing to cannibalise there, and an uncapped desktop build is what gets linked. + **Timing (Oliver, 2026-08-18): the web build stays UNCAPPED for now** — the testteam runs the + PWA. At store launch the public web build takes the **same gates as the app's free tier** (one + flag), or the website is strictly better than the free app and defeats every gate above. 2. **Store readiness.** Wrap the PWA (Capacitor/PWABuilder). Unknowns to check *before* committing: audio behaviour in WKWebView, safe-area (already solved for the browser, may differ in the shell), and 60 fps canvas under WKWebView at `RES` 4 — see OPEN 1, this is the second place that risk @@ -3555,8 +3586,8 @@ never an interstitial. An interstitial after death would land exactly in the "on **Expectations, so nobody is surprised:** with no marketing, 20-100 units in year one is the honest central estimate (~$40-210 net, i.e. under Apple's fee at the low end). The monetization model is -worth maybe $200 either way; the video channel is worth ~100x that. Ship paid because it is cheap and -protects the design, not because it will earn. +worth maybe $200 either way; the video channel is worth ~100x that. Ship free+IAP because it feeds +the funnel and the gates protect the design, not because it will earn. **Explicitly NOT to be built** (these fight settled decisions, see the invariants above): - **selling weapons or tins** — weapons are *only ever won*, in the duel; a shop deletes the duel's