Family Wall — monetization
Status: DECIDED (2026-07-18) · FULLY BUILT (2026-08-02 code audit) — the only thing left is
an operational go-live flip (below). The entitlement GATE
(family-wall-plus.ts) ships OFF
(FAMILY_WALL_PLUS_ENFORCED unset → nothing paywalled). Every cost-bearing feature is already gated:
Ask JQ + voice actions (family-wall-ask.ts), intercom (family-intercom.ts), voice alarms
(family-alarms.ts), kids' chat (family-kid-chat.ts), extra walls (family-wall.ts
createWallDisplay — 2nd+ display requires Plus), day planner + bedtime-in-your-voice
(family.ts). Checkout is live (POST /api/payment/family-wall-plus/checkout, monthly/annual →
webhook upserts the subscriptions row, plan_key='family_wall_plus'), the config probe
(/family-wall-plus/config) and status endpoint (/api/family/wall/plus-status) exist, and the
frontend upsell (banner + monthly/annual checkout buttons + PlusTag badges + post-checkout
thank-you) is wired on /dashboard/family/wall.
Go-live (owner — ~15 min, all operational, no code)
Full step-by-step: docs/setup-guides/FAMILY_WALL_PLUS_LAUNCH.md.
In short: create the two Stripe prices ($4.99/mo + $39/yr) and set
STRIPE_PRICE_FAMILY_WALL_PLUS(_ANNUAL) → grandfather existing wall owners (cd apps/backend && npx tsx scripts/grandfather-family-wall-plus.ts — dry-run, then --apply; or the SQL in the
runbook) → flip FAMILY_WALL_PLUS_ENFORCED=true → verify a non-Plus account hits the upsell and a
grandfathered one doesn't. Until the prices are set, /config reports available:false and the
checkout button self-hides, so nothing breaks.
The model: freemium subscription ("Family Wall Plus")
Free tier is the acquisition wedge (the "no hardware to buy" story vs Skylight/Hearth); the subscription monetizes the features that either cost us money or are power-family.
Price anchor: ~$4.99/mo or $39/yr. Undercuts Hearth ($699 + $99/yr), matches Skylight Plus ($39–80/yr), sits just above Cozi Gold ($30/yr) — with $0 hardware.
Free (genuinely useful — one kitchen wall)
- 1 wall, family members + routines + tap-to-check-off, streaks
- Calendar (1–2 sources), notes board, who's-home, weather, shopping, meals
- Preset backgrounds, screensavers, ambient sound
Paid ("Plus") — the cost-bearing + power features
- Ask JQ (LLM calls) + JQ voice actions
- Voice messages in your cloned voice (ElevenLabs TTS)
- Intercom (tap-to-talk to screens)
- Multiple walls (bedroom/personal screens beyond the first)
- Kids' chat (moderation cost)
- Points / allowance, journal-art backgrounds, unlimited calendar sources
Plus content bundle — the sticky, nightly/daily-use features (roadmap, not built)
These are what make Plus emotionally worth it (and drive daily retention). All tie into Living Voice (cloned voice) + Graphene content, delivered on the wall device:
- Graphene+ included → Graphene sleep stories on the wall ("Sleep stories"
panel/mode). Bundle Graphene+ into Plus (shared/derived entitlement, reuse
graphene-subscription.ts+ the Graphene story/audio library). See [[project_graphene_lore]]. - Bedtime stories in your voice — Graphene sleep stories narrated in the parent's
cloned voice (
sayInUserVoice+ voice clone). Consent v2 (owner's own voice). Real TTS cost → correctly Plus. See [[project_living_voice_roadmap]]. - Custom voice alarm clocks — a wall wakes the family: a child wakes to their parent's voice; a parent wakes to a motivational quote or their own voice cheering them out of bed. Per-member alarm time + a chosen voice/clip; the wall (already an always-on device with audio) plays it. Ties Living Voice + the wall's existing audio path.
Build order (recommendation): (3) alarm clocks first (most contained — scheduling + the wall's existing audio path; huge "wow"), then (2) bedtime-in-your-voice (reuses the voice pipeline + adds Graphene stories), then (1) full Graphene+ sleep-story library + entitlement bundling. Each is its own build; all gate behind Plus.
Why this shape
- The paywall protects margin, not just access. Our real marginal costs (LLM, TTS, moderation) are exactly the gated features — rare alignment. On-brand honest: free stays genuinely complete; we charge where we actually spend.
- "No hardware" is the moat. $0 entry vs Skylight's $80–300 upfront; monetize on subscription. Same LTV, none of the hardware capex/support/returns burden. Don't blunt it by charging upfront.
- Top-of-funnel for all of HiveJournal. Family is a huge, high-intent market that spreads inside a household; the wall is the consumer front door to JQ + the wider journaling ecosystem.
Sequencing
- Build the subscription + feature gate first (Stripe infra already exists in the repo for other products). This is the real blocker — NOT ads.
- Soft-launch paid with the free single-wall tier as the wedge.
- Skip ads — off-brand for a family/kids surface and low-yield vs a $39/yr sub; revisit only much later, if ever. (Matches [[project_journaling_market_push]]: ads premature without a paid tier.)
Not now
- B2B (schools / facilities) — eldercare has its own GTM ([[project_legacy_channel_eldercare]]); don't split focus. The wall is B2C.
The gate — BUILT (enforcement off)
- Entitlement reuses the shared
subscriptionstable (no new table) withplan_key = 'family_wall_plus'— same pattern aswrite-cafe-pro/ Graphene+.isFamilyWallPlus(userId)= active row (keeps access through a cancelled-but-not-ended period). - Master switch
FAMILY_WALL_PLUS_ENFORCED(default off).requireFamilyWallPlusis a no-op until it's on, so the plumbing shipped without paywalling any existing usage. - Enforced at the service layer (so the public token routes gate on the wall's
OWNER):
createWallDisplay(2nd+ wall),askWall+actOnWall(Ask JQ + actions),sendIntercom. Returns HTTP 402{ error, upgrade:true, feature }. - UI:
GET /api/family/wall/plus-status→{ plus, enforced }; the wall settings page shows an upsell banner + ✨Plus badges only when enforced && !plus. - Cost-point gates — BUILT: cloned-voice wall messages (
applyMessageAudio→sayInUserVoice) skip the paid render gracefully for non-Plus (free browser TTS fallback +plus_requiredwarning, no 402/no spend); kids'-chat enablement (updateKidChatenabled:true) → 402. Stripe checkout — BUILT. - Grandfather early users generously; the free tier must stay a real product, not a demo.
Related: [[project_family_frame]], [[project_journaling_market_push]] (mobile store-ship = the other paid-tier prerequisite), [[project_elevenlabs_tts_spend]] (TTS is a real cost the gate should bound).