Inspiration

In Tanzania, a salon or clinic lives and dies on WhatsApp. The owner is the receptionist: braiding hair with one hand, answering "mnafungua saa ngapi?" with the other. Messages missed after hours are customers lost, and every forgotten appointment is unpaid time. Big businesses buy call centers; a Kariakoo salon cannot. We built WaOS so a one-person business can answer like a ten-person business.

What it does

WaOS connects to the business's existing WhatsApp number in five minutes. From then on:

  • Gemini answers customers 24/7, grounded only in the business's own services, prices, and hours (retrieval-augmented, so it never invents a price), replying in the customer's language, Swahili or English, detected per message.
  • It books: when a customer asks for a slot, the AI proposes from what it knows and files the booking for one-tap human confirmation.
  • It reminds: confirmed appointments get automatic WhatsApp reminders 24 hours and 2 hours before, only to customers who consented, which directly attacks the no-show problem.
  • It knows its limits: every reply carries a confidence score. Below the threshold the AI stands down and the thread lands in a human "Needs attention" inbox, so customers never get guesses.
  • The owner runs everything from a phone: a realtime inbox, bookings calendar, customer list, and a dashboard showing the AI deflection rate, all in Swahili and English.

How we built it

  • AI core on Google: every LLM call in production is the Gemini API (gemini-2.5-flash) behind a provider-agnostic LLMPort; embeddings are gemini-embedding-001 stored in Postgres pgvector for org-scoped retrieval. The model must return strict JSON ({reply, confidence, intent}) with one repair retry; the confidence threshold branch decides reply versus human handoff, and every decision is logged for the deflection metric.
  • AI-native operations: the AI is not a feature bolted on, it IS the front office. Inbound WhatsApp webhooks flow through a policy engine (opt-in enforcement, rate pacing with humanized jitter, 14-day warm-up caps that protect the business's number), then to the Gemini pipeline, then back out through the same audited send path used by reminders and humans.
  • Stack: TypeScript monorepo; Express API + BullMQ workers on Redis; Prisma + Postgres 16 with a tenant-isolation Prisma extension (every query is scoped to the business, enforced at the data layer and covered by live-database tests); Next.js dashboard with next-intl; Socket.IO realtime; MinIO for media; Docker on a VPS.

Challenges we ran into

  • Making an LLM safe enough to speak FOR a business: we solved it with grounding-only prompts, strict JSON contracts, confidence-gated handoff, and a policy engine no message can bypass.
  • Swahili-first UX for non-technical owners: every screen passes the "busy owner between customers" test, one question per screen, thumb-reach actions, full bilingual copy.
  • WhatsApp entry-tier reliability: sessions must survive restarts; we reconcile channel state on boot and pace sends to protect the number, and we disclose the trade-offs honestly in onboarding.

Accomplishments we're proud of

  • A real business can go from signup to a working AI number in five minutes with zero technical steps.
  • Tenant isolation proven by tests, not promised: cross-tenant reads, writes, and vector retrievals fail at the data layer.
  • [X] businesses onboarded and [Y] customer conversations handled, with [Z]% answered by the AI without human help. [REPLACE WITH YOUR REAL NUMBERS]

What we learned

Small businesses do not want "an AI tool"; they want their phone to stop interrupting their hands. The moment the AI hands off gracefully instead of guessing, owners start trusting it with more.

What's next for WaOS

The official WhatsApp Cloud API tier for scale, autonomous slot-inventory booking, M-Pesa payment links on bookings, and expansion beyond Tanzania to East Africa's 2M+ appointment businesses.

Share this project:

Updates