CloserIntelligence
AI sales-ops platform with a voice agent layer
Role: Sole engineer — architecture, frontend, Supabase schema and policies, VAPI integration, GoHighLevel sync. · Updated 2026-09-01
What's actually in it
The problem
The client was running a call centre on a CRM that recorded activity but never acted on it. Reps logged calls, deals stalled, and nobody found out until the pipeline review. They needed the system to detect the stall and act on it, not report it a week late.
What I built
- 01Built the platform as a multi-tenant React + TypeScript app on Supabase, with 25 routes covering agents, campaigns, call logs, conversations, leads, knowledge bases, phone numbers, call quality, and a superadmin portal.
- 02Wired VAPI voice agents into the call pipeline so outbound calls run unattended, and post-call transcripts land in Supabase with sentiment and classification attached.
- 03Built Maclovi, the operations assistant layer — it reads the call log and raises tickets against stalled deals rather than waiting for a human to notice.
- 04Layered a prompt optimizer route so the client can tune agent prompts against real call outcomes without redeploying.
- 05Two-portal auth with internal and external invite flows, so the client's own team and their sub-accounts land in different surfaces from the same login.
Building something in this shape? Book a 30-min scope call →
Walkthroughs
The developer POV video is the one worth your time — it walks the dependency graph, the route map, and the data layer rather than clicking through screens.
Engineering decisions
Transcript classification stored, not computed on read
Sentiment and stage classification are written once at ingest and stored as columns. Recomputing them on every dashboard render would have made the call log unusable past a few thousand rows, and would have burned model spend on data nobody was looking at.
Badges as leaf components
The most-imported modules in the graph are ConversationStageBadge, ClassificationBadge, and SentimentBadge. Keeping classification display in tiny leaf components meant changing the taxonomy was a one-file edit rather than a sweep across every table and detail view.
React Query as the only server-state layer
No Redux, no context soup. Every Supabase read goes through React Query with a keyed cache, so the war-room views can poll aggressively without stacking duplicate requests.
The product
Want something built the way CloserIntelligence was?
Bring the problem, not a spec. 30-minute call — I'll tell you what it actually takes to build, what I'd cut, and what it costs. No decks, no discovery phase invoice.