smart-w / docs /PRODUCT_ROADMAP.md
initiumzim
Add post-MVP product & architecture roadmap
2aa3fd3
|
Raw
History Blame Contribute Delete
12.7 kB

Qx-SmartLedger β€” Product & Architecture Roadmap

Status: forward-looking, to start after Audry validates a production-grade MVP. This is greenfield for monetization and multi-tenancy β€” nothing in sections 2–9 is built yet. Dev-context only.

Decisions captured (product):

  • Self-serve online payments for Hustler / Pro / Mogul; Incubator is sales-led (talk to sales).
  • Per-seat pricing is a cross-cutting dimension (operators / staff).
  • Payment rails: Zimbabwe mobile money first (Paynow β†’ EcoCash / OneMoney / card) + a pan-African aggregator (Flutterwave / Paystack) next, behind one pluggable provider interface.

1. Current baseline (what exists today)

  • WhatsApp Cloud API β†’ Render relay β†’ Meta; Gemini multimodal (intent / vision / translate / codegen / coach) + AssemblyAI ASR; Firestore + Firebase Storage.
  • Data model: users/{phone}/<subcollection> β€” transactions, stock_batches, customers, price_overrides, temp_*, context. Approval / profile doc at users/{+mobile} (status, currency, business_name, wa_name, distill_consent).
  • Wart to fix first: the profile doc is keyed +mobile but ledger subcollections are keyed mobile (no +). Must be normalized before any multi-tenancy work.
  • distillation_examples capture is live (distill.py, scripts/export_distillation.py).
  • No tiers, payments, roles, or orgs yet.

2. Tiers / personas

  1. Hustler (free, self-serve): one trader, one shop, core bookkeeping (text / voice / image), basic reports, capped history / usage.
  2. Captain / Pro (paid, self-serve, online pay): one business, full features β€” PDF receipts, period reports, business coach, deeper history, exports, multiple operator seats.
  3. Mogul (paid, self-serve, online pay): multiple shops under one owner β€” per-shop ledgers, consolidated cross-shop reporting, per-shop operators, inter-shop transfers. Price = per-business base
    • per-extra-shop + per-seat.
  4. Incubator / Organisation (sales-led, invoiced): an org tracking many independent businesses it incubates β€” cohort dashboard, per-business progress, aggregate analytics, consent-gated read access, program / cohort grouping, staff roles. Per-seat across the cohort.

3. Core architecture change β€” accounts & multi-tenancy

The phone-keyed model cannot express multi-shop or orgs. Introduce explicit entities (top-level collections; ledgers move off the phone key):

  • businesses/{business_id} β€” the ledger owner (name, currency, tier, owner_member_id, org_id?, created_at). Ledgers live at businesses/{business_id}/{transactions, stock_batches, customers, ...}.
  • members/{member_id} β€” a person (phone_hash, display_name); identified by WhatsApp number.
  • memberships/{id} β€” member_id Γ— business_id Γ— role(owner|manager|operator|viewer) Γ— status. Drives access and seat counting.
  • organisations/{org_id} β€” incubator / parent (name, admins[], subscription); businesses reference org_id and carry a per-business consent flag for org visibility.
  • Message routing: inbound phone β†’ resolve member β†’ active business context (default + a switch shop command for Mogul / operators; sticky in context).
  • Backwards-compat: today's single user = 1 member + 1 business; a migration creates a business_id, moves / dual-reads the subcollections, and fixes the +mobile vs mobile key.

4. Access control & context resolution

  • Role matrix: owner (all incl. billing), manager (txns + reports, no billing), operator (record txns, limited reads), viewer (read-only β€” used by incubators).
  • A phone in multiple businesses β†’ "Which shop?" picker / switch to <shop>; active context stored per member.
  • Incubator access = a viewer membership into each incubated business, granted on the business owner's opt-in consent, revocable.

5. Payments & billing

  • Pluggable PaymentProvider interface. Phase 1: Paynow (EcoCash / OneMoney / card, Zimbabwe). Phase 2: Flutterwave / Paystack (mobile money + cards across KE / NG / GH / ZA). Provider webhooks β†’ subscription state; the existing relay is for WhatsApp only, not for payment callbacks.
  • Billing model: per-business base (Hustler free / Pro / Mogul) + per-extra-shop (Mogul) + per-seat operators. Incubator = sales-led org contract (manual / invoiced), per-seat across the cohort.
  • Subscription state on businesses.subscription / organisations.subscription: plan, status(active|trial|past_due|canceled), renews_at, seats, provider_refs. Trials, grace, dunning via WhatsApp nudges.
  • WhatsApp-native upgrade flow: "upgrade" β†’ provider checkout link or mobile-money push β†’ webhook confirms β†’ tier flips β†’ confirmation + payment receipt.
  • Feature gating: a central entitlements(business) map (tier β†’ features: receipts, report depth, coach, vision, # shops, # seats, history window, exports, API). Enforce at command entry; gated actions return a friendly upsell, never a hard error.

6. Internal admin interface (ours β€” already exists; design its data contracts)

The admin is a separate app over Firestore / Storage. It will manage:

  • Approvals & onboarding (replaces the manual users/{+mobile}.status flow).
  • Businesses / orgs CRUD; tier / subscription overrides; seat management; comp / trial grants.
  • Members & memberships; role assignment; read-only support impersonation.
  • Billing ops: subscriptions view, manual incubator invoices, refunds, dunning state.
  • Cohort / incubator management: create org, attach businesses, progress dashboards.
  • Training-data management: review distillation_examples, verdict / label QA, redaction, export runs (wraps scripts/export_distillation.py), consent audit.
  • Feature flags & analytics (usage, retention, MRR, per-tier funnels).
  • Contract: stable Firestore schemas + admin-only callable functions; the bot path never sees billing secrets.

7. Cross-cutting

Migration (phased, dual-read), data integrity, per-business currency, audit log, per-tier rate limits, per-member data export / delete (ties to distill_consent), observability / metrics.

8. Phased delivery (post-MVP)

  • P0 Foundation β€” normalize account keys; add business_id + memberships; migrate existing users 1:1; no user-visible change.
  • P1 Pro + payments β€” Paynow rails, entitlements / gating, WhatsApp upgrade flow, admin subscription management.
  • P2 Mogul β€” multi-shop model, switch-shop UX, consolidated reports, per-shop seats.
  • P3 Incubator β€” org entity, consent-based viewer access, cohort dashboards, sales-led billing; add pan-African rails (Flutterwave / Paystack).
  • P4 Hardening β€” dunning, analytics, training-data admin tooling, exports.

9. Where it lands when built (reuse existing)

  • New modules: accounts.py (entities + membership + context resolution), billing.py (PaymentProvider + webhooks), entitlements.py (tier β†’ feature gating).
  • main.py: resolve member β†’ business context at message entry; gate features; payment / upgrade & switch-shop commands. is_user_approved (main.py:713) becomes a membership lookup; _vendor_profile becomes a business-profile lookup.
  • utility.py: ledger reads / writes re-pointed from users/{mobile} β†’ businesses/{business_id} via an accessor that hides the key (one change point feeds all *_transaction / stock / customer helpers).
  • Unchanged: relay / whatsapp_client.py. distill.py + scripts/export_distillation.py feed the admin's training-data module.

10. Cost per user & pricing model

Estimates as of mid-2026 from public pricing (sources at bottom). The two model IDs we use (gemini-3.1-flash-lite, gemini-robotics-er-1.6-preview) are priced here at their Flash-Lite / Flash-class equivalents β€” verify against the live billing page before locking pricing. All figures USD.

10.1 Unit rates by service

Service Unit Rate
Gemini Flash-Lite (text intent / translate / codegen / coach) 1M input / 1M output tok $0.10 / $0.40 (batch $0.05 / $0.20)
Gemini vision (image in, ER-class) per image (~1.1k input tok + prompt) ~$0.0002–0.0004
AssemblyAI Universal ASR per minute $0.0025 ($0.15/hr)
Deepgram Aura TTS (voice replies, capped ~500 chars) per 1k chars ~$0.015 β†’ ~$0.004–0.008/reply
WhatsApp service reply (inside the 24-h user window β€” our normal mode) per message $0.00 (free)
WhatsApp utility template (business-initiated, "Rest of Africa" incl. +263) per message <$0.01–0.03
Firestore 100k reads / 100k writes $0.06 / $0.18 (deletes $0.02)
Firebase Storage (distillation media, receipts) GB-month / egress GB ~$0.026 / ~$0.12
Render relay + app host flat / month ~$7–50 (amortized across all users)

10.2 Cost per interaction (one bookkeeping action)

Modality Extra services beyond Firestore Est. cost
Text Gemini translate (most msgs) + ~40% LLM intent (60% deterministic = free) ~$0.0002–0.0004
Voice + ASR ($0.0006 / 15-s note) + **TTS reply ($0.004–0.008)** + text pipeline ~$0.005–0.009
Image + Gemini vision (~$0.0003) + text pipeline ~$0.0005
Firestore per action (~30 reads + ~6 writes + distill writes) β€” ~$0.00003

The reply path is mostly free on WhatsApp because the bot is reactive (service messages inside the 24-h window). The two real swing costs are TTS for voice and any business-initiated templates (expiry nudges, dunning) β€” keep those minimal.

10.3 Monthly cost per active user

Profile Assumptions Est. infra cost / month
Light Hustler (text-first) ~120 actions, mostly text, a few utility nudges ~$0.10–0.20
Voice-heavy Hustler ~150 actions, ~50% voice with spoken replies ~$0.40–0.60 (TTS dominates)
Pro / heavy ~400 actions, reports + coach + codegen, 3 seats ~$0.60–1.50
+ cumulative distillation media (images/audio kept) grows over time ~$0.002–0.02 / user / mo
+ amortized relay/app host @ ~1k users flat Γ· users ~$0.01–0.03 / user

Fully-loaded: ~$0.15–0.60 / active user / month typical; up to ~$1.50 for heavy or voice-with-TTS users.

10.4 Suggested pricing (USD/month; charge local mobile-money equivalent)

Tier Price Includes Est. cost Gross margin
Hustler Free 1 shop, ~100 actions/mo, text + voice, basic reports; PDF + coach as teasers $0.10–0.30 acquisition (loss-leader)
Captain / Pro $3–5 full features, 1 shop, ≀3 seats, PDF receipts + reports, coach, exports $0.30–0.80 ~80–90%
Mogul $9–15 base + $3–5 / extra shop + $1–2 / extra seat multi-shop, consolidated reporting scales with shops ~80%
Incubator sales-led: ~$2–4 / tracked business / mo + per-seat for org staff cohort dashboards, consent-gated viewer access low per business high (contract)

Pricing notes:

  • Annual plan β‰ˆ 10Γ— monthly (2 months free) to improve retention and cash flow.
  • Cap the free tier's voice/TTS and coach usage β€” that is where a free user can actually cost money; default voice replies to text-first and make spoken replies a Pro perk.
  • Even at a $1/mo entry point margins stay 50–85%; $3–5 Pro is comfortably >80% gross.

10.5 Cost-control levers (already partly in place)

  • Deterministic parsing first (β‰ˆ60% of writes skip the LLM) β€” keep widening it.
  • Stay reactive on WhatsApp (free service window); batch/limit business-initiated templates.
  • Gemini batch mode (βˆ’50%) for all non-realtime work (distillation re-scoring, exports, reports).
  • Text-first replies; shortest viable TTS; cheapest TTS vendor.
  • The distilled student model is the strategic lever: once trained on the captured dataset (distillation_examples), it can self-host and drive the marginal AI cost toward ~$0, turning today's ~$0.20–0.60/user into mostly fixed compute β€” the main reason to capture the data now.

Sources (mid-2026): Gemini API pricing (ai.google.dev/gemini-api/docs/pricing), AssemblyAI pricing (assemblyai.com), WhatsApp Business Platform pricing (developers.facebook.com/documentation/business-messaging/whatsapp/pricing), Firestore/Storage (Google Cloud pricing). Re-verify before setting public prices.