
A WhatsApp-native, multi-tenant business OS for South African SMEs, the interface is the customer’s existing WhatsApp line, not a dashboard.
View the product pageThe problem
SA has ~3.7M small businesses running on "a WhatsApp group, a cashbook, and a prayer." Existing tools fail them on USD pricing, no local-language support, heavy bundles that die on prepaid data, and onboarding that assumes IT staff.
.jpg&w=3840&q=75)
Architecture
A container-level view of the real system, the boundaries, the trust edges, and where intelligence and money actually flow.
The 9-step pipeline detects language with zero-cost keyword matching, resolves intent/sentiment/language in one Promise.all, checks the Redis FAQ cache (zero-token on hit), and only calls Claude on a miss. Vercel Cron fans out to Inngest agent functions for scheduled work.
.jpg&w=3840&q=75)
By the numbers
86
tables · all under RLS
147
RLS policies · 43 migrations
4
AI cost-control layers
7
specialist AI agents
Stack
Intelligence
Seven named Claude agents, Alex (inbox), Care (wellness) and Pen (email, streamed over SSE) on Sonnet 4.6; Chase (debt), Doc (documents) and Insight (briefs) on Haiku 4.5; plus Langa, an AI business mentor, on Sonnet. Opus 4.8 is reserved for Enterprise strategy. Each agent carries its own token budget, and the exact model IDs are pinned in code.
Data model
86 tables · all under RLS · 147 policies · 43 migrations
Key decisions
Architecture Decision Records, the trade-offs made deliberately, in the open.
.jpg&w=3840&q=75)
The hard parts, solved
Every inbound message runs loadContext → classifyIntent → checkFAQCache → checkPlanLimits → generateResponse → sendWhatsApp → logAudit → updateDashboard → recordWellness, each wrapped in its own timeout (Claude 20s, intent 8s, FAQ 2s) inside Vercel’s 30s. On any failure it substitutes a human-escalation message, writes an audit record and short-circuits, one slow step can’t stall the pipeline.
A public WhatsApp number is an open pipe to the LLM. Three separate sanitizers defend it, 17 regex patterns + a 2000-char cap on inbound before any DB store, a stricter 500-char control-char strip on tenant config to stop cross-tenant cache poisoning, and an 80k cap on parsed documents.
Up to three categorized insights (revenue / staff / operations / market) are extracted from each advisor response into a business_insights table, then the last ten are re-injected as "BUSINESS MEMORY" into the next session, genuine long-term continuity, not just per-request context.
Sourced from AdminOS, ARCHITECTURE, SYSTEM_DESIGN, SECURITY_AUDIT_REPORT, WONDERLAND_DECISIONS, supabase/migrations (86 tables).
.jpg&w=3840&q=75)
Keep exploring