EO

Etinosa Ogbevoen

|
EO

Etinosa Ogbevoen

Frontend Engineer

Made by Etinosa | © 2026

Back to Projects

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.

AIRAGMulti-TenantSaaSMonorepo
Echo: Multi-Tenant AI Support SaaS

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

1

Designed hard multi-tenant isolation so a bug in one org's flow can never leak into another's data

2

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

3

Protected an unauthenticated public API surface against cost abuse with rate limiting instead of relying on auth to bound it

4

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

Next.jsReactTypeScriptConvexClerkVercel AI SDKGeminiTailwind CSSTurborepo

Project Info

Author

Etinosa Ogbevoen

Status

active

Category

AI