Commercial Readiness
Commerce Plan
Draft for beta use. Last updated 2026-07-09.
Current Beta State
The current preview has core beta access. No payment processing is active, and paid expansion content is not shipped unlocked as if entitlement checks already exist.
Core Purchase
Core should be a one-time purchase: foundation holds, core protocols, practice log, Body Map, Learn notes, account sync, export, and deletion controls.
Optional Expansion
Expansion can add future holds, protocols, variations, and deeper learning paths. It should remain optional and should not reduce the usefulness of the core purchase.
Entitlement Checks Needed
v99 keeps payment inactive while adding a local snapshot for already-verified access, so temporary offline use does not punish a legitimate user.
Draft Entitlement Records
The draft table is account_entitlements. It stores account-bound records such as core_ownership, expansion_subscription, and beta_preview, with status, source, Stripe identifiers, start dates, expiry dates, and metadata.
Operational Rules
Users may read only their own entitlement records. The app must not write entitlement rows from the browser. Production grants should come from verified Stripe webhooks, admin service-role actions, or migration scripts.
Restore Proof
The next proof is simple: apply the entitlement migration, seed a beta_preview row for a test account, sign in on a fresh device, and use Check Access to confirm the row restores from Supabase.
Trusted Write Path
Before checkout is enabled, the backend needs idempotent Stripe event storage, Stripe customer mapping, signature verification, and service-role entitlement writes. See Webhook Plan.
Offline Access Rule
Core ownership should keep working offline after it has been verified on that device. Optional subscription expansion can use a limited offline grace window, then ask for an online re-check. Fresh devices and cleared browsers still need sign-in.
Checkout Routing Later
Future checkout should return to the app with clear success and cancel URLs, then rely on webhook-confirmed Supabase rows rather than URL parameters alone.
Launch Rule
Do not launch paid content until the entitlement boundary is tested across sign-in, restore, logout, and fresh-device flows.