Echo: Multi-Tenant AI Support SaaS
A multi-tenant AI customer-support platform: three independently deployable apps sharing one Convex backend, a tool-calling AI agent, and hard org isolation.

Overview
Echo is a multi-tenant AI customer-support platform split into three independently deployable apps in one Turborepo monorepo: a Next.js dashboard where organizations manage conversations and settings, a Next.js chat widget, and a vanilla-JS embed loader that any website pastes in to mount the widget in an isolated iframe. All three share one Convex backend for real-time data and one Clerk-backed multi-tenant identity layer. The AI side isn't a fixed-flow chatbot: a Gemini-backed agent (Vercel AI SDK + Convex Agent) decides at each turn whether to search the org's own RAG-indexed knowledge base, escalate to a human, or resolve the conversation, and once a human takes over, the agent is hard-stopped from replying again. Because the chat endpoint is necessarily public and unauthenticated, it's protected by its own token-bucket rate limiting (per visitor and per organization) rather than relying on auth to bound cost.
Features
Three independently deployable apps in one monorepo (dashboard, chat widget, and embed loader script) sharing one Convex backend
Tool-calling AI agent (Gemini via Vercel AI SDK + Convex Agent) that decides per turn whether to search the knowledge base, escalate to a human, or resolve the conversation
RAG search tool with a dedicated interpreter pass: raw retrieval hits are summarized into a faithful answer before reaching the conversation
Human-escalation workflow: once escalated, the agent is hard-stopped from responding again, regardless of subscription tier
Token-bucket rate limiting (per visitor and per organization) on the public, unauthenticated chat endpoint to bound LLM spend
Full org isolation via Clerk multi-tenancy, with billing-gated features (customization, knowledge base, voice) behind Clerk Billing
Optional Vapi voice assistant per org, credentials stored only as references in AWS Secrets Manager, never in the app itself
Shared dark/light theming and design tokens across all three apps, including a themed Clerk auth flow
Deployed end to end across three Vercel projects, a production Convex deployment, and Clerk, wired together by hand
Key Engineering Decisions
Designed hard multi-tenant isolation so a bug in one org's flow can never leak into another's data
Built a tool-calling AI agent rather than a scripted chatbot, and found and fixed a real bug where it kept responding to a conversation after a human had already taken over
Protected an unauthenticated public API surface against cost abuse with rate limiting instead of relying on auth to bound it
Split one product into three independently deployable apps around a shared backend, and carried the deployment (three Vercel projects, Convex, Clerk) through myself rather than treating it as someone else's problem
Tech Stack
Project Links
Project Info
Author
Etinosa Ogbevoen
Status
active
Category
AI