Olisa Umenyiora

Case study

CallsPicked

An AI communication employee for local service businesses. It answers the phone in a natural voice, books the work, replies on WhatsApp and runs the socials, so the owner can stay on the job.

Solo build: product, design, full-stack, voice AI and infrastructureVisit callspicked.com

See it live

This is the real site, running right here. Scroll it, click around, or have Oma call you.

callspicked.comLive
Open the live site

The problem

About half of the calls to a local business go unanswered, because the owner is mid-groom, in a consult, up a ladder or with a client. Every missed call is a booking that walks to a competitor, and most of those businesses have nobody to run their social either. CallsPicked puts a warm, capable voice on the line around the clock, and a social media employee on the feed, so nothing gets dropped.

What it does

Oma, the receptionist

Answers every call in a natural voice, books straight into the calendar, answers questions grounded on the business's own website, takes messages, handles SMS and WhatsApp, and hands over to a human when it matters.

Ola, the social employee

Drafts and schedules posts to Instagram, Facebook and TikTok, and drafts replies to comments and DMs for the owner to approve. One tap and the work is everywhere.

Pet groomingOma answers while your hands are full of fur; Ola posts the before-and-afters.
Vets & pet careBooks appointments and flags urgent cases while the team is in consults.
Salons & beautyBooks clients mid-appointment and keeps the feed alive.
TradespeopleCaptures job details while you are on the tools and texts them straight to you.
Dental & clinicsHandles routine questions and booking so staff stay with the patient.

How it is built

Two apps share one typed data layer. A Next.js web app on Vercel runs the marketing site, the live demo and the dashboard. A Fastify voice service on Fly.io stays always on for phone calls and webhooks. Both read the same Postgres, and all messaging providers sit behind a single seam.

CUSTOMERSPhone callWhatsAppSMSInstagram / FBAPPLICATIONSWeb appNext.js · React · Verceldashboard · marketing · live demoVoice serviceFastify · WebSocket · Fly.ioalways-on for Twilio webhooksPLATFORM & AIOpenAI RealtimeSupabase · RLSTwilioZernioGoogle CalendarStripeFirecrawl

A voice call, end to end

From dialling the number to a booked appointment and a text confirmation.

1Caller dials the business number2Twilio opens a media stream (G.711 audio)3RealtimeBridge connects to OpenAI Realtime (gpt-realtime-2)4Model runs tools: check availability · book · take message5Booking and call log written to Supabase6Oma confirms by voice and texts a confirmation

A message, end to end

WhatsApp and Instagram, with replies only and a human always one step away.

1Customer messages on WhatsApp or Instagram2Zernio webhook hits the voice service (signature verified)3Reasoning model (gpt-4o) reads the conversation4Decides: reply within policy, or escalate5Replies through Zernio, or texts the owner to take over

Engineering highlights

Real-time voice, not a phone tree

A custom bridge streams audio between Twilio and the OpenAI Realtime API, with barge-in handling so callers can interrupt and talk over Oma naturally.

It actually does the work

Tool calling checks live calendar availability, books the appointment, takes a message when there is no slot, and transfers to a human with the full context.

Learns the business from its website

Paste a URL and Firecrawl crawls it, so Oma already knows the opening hours, services and prices before her first call.

Multi-tenant from day one

Every business is isolated by Postgres row-level security, and inbound calls are routed to the right tenant by the number they dialled.

Swap the AI models live

An admin page changes the realtime and reasoning models in seconds, read live by both the web and voice services with no redeploy.

One file owns each provider

All Instagram, Facebook, TikTok and WhatsApp knowledge lives behind a single seam, so the messaging provider can be swapped in one place.

Runs on clean sample data

A dual-mode data layer runs the whole product with zero secrets. That is exactly how every screenshot here was captured, with no real customer data.

Quality is gated, not hoped for

A voice eval suite of hardened call scenarios has to pass before any prompt or model change ships. Compliance for Meta and WhatsApp is enforced in code: replies only, 24 hour windows, always a way to reach a human.

The stack

Frontend
Next.js (App Router, RSC)ReactTypeScriptTailwind CSSZod
Voice & realtime
OpenAI Realtime (gpt-realtime-2)WebSocket audioFastifyNode
AI
OpenAI gpt-4o reasoningTool / function callingFirecrawl website ingestion
Telephony & messaging
Twilio (voice · SMS · media streams)Zernio (Instagram · Facebook · TikTok · WhatsApp)
Data
Supabase — Postgres + row-level securityTyped schema layerStripe billing
Infrastructure
Vercel (web)Fly.io (always-on voice)pnpm monorepo
Built with
Claude CodeCursorFigma