About Services Case Studies Pricing Blog Book Free Audit
AI SUPPORT PLATFORM20262 min read

Multi-Tenant AI Customer Support, Shipped to Production

A regulated-grade AI support platform with 90-second integration, per-tenant RAG isolation, and one knowledge base powering chat, web, and voice.

CLIENT
Suprix
INDUSTRY
AI SaaS
TIMELINE
12 weeks
ROLE
End-to-end product engineering
// overview

Suprix replaces the "ticket-queue + canned-reply bot" workflow with a multi-tenant AI agent that answers live questions on web chat, in an embeddable widget, and on the phone — all powered by the same knowledge base. Paste one script tag, point it at your docs and tickets, and the AI is in production before lunch.

// the problem

Two broken paths to AI support — neither shipped.

Generic chatbots failed compliance review at every regulated buyer because they ran on a shared embedding store. The "build it yourself" alternative consumed a full engineer indefinitely and silently degraded as the docs drifted. Suprix had to be plug-and-play like the first and provably isolated like the second.

  • Compliance-grade tenant isolation — provable in code, not in policy
  • Five-minute install with one <script> tag, no SDK or Webpack wiring
  • Channel parity — one knowledge base behind chat, embed widget, and voice
  • Humans in the loop with full context on every handoff
// approach

How we built it.

01

Map the failure modes

Audited five competing AI-support tools and interviewed five design partners across SaaS, healthcare, e-commerce, freight, and dev tools. Shared-tenant retrieval was the universal compliance blocker.

02

Pick the primitives

Convex for real-time backend with first-class namespace support on the RAG component. Clerk Organizations as the tenancy primitive. Turborepo for one backend, three frontends.

03

Design voice as a plugin

Vapi modeled as the first row in a plugin/secrets system keyed by organizationId. Swapping providers is a config change, not a refactor.

04

Ship to design partners

Three apps live (operator dashboard, embeddable widget, 1-line embed loader), Sentry instrumented end-to-end, real billing and auth in production.

// what we shipped

The solution.

01

Per-organization RAG isolation

Every embedding write and retrieval call carries the organizationId namespace. The retrieval set for org A is mathematically incapable of returning a chunk from org B's corpus — isolation at the storage layer, not an application filter.

02

One knowledge base, three channels

The same Convex RAG namespace serves the operator dashboard, the embeddable widget, and the Vapi voice agent. Update once; every channel reflects it on the next retrieval.

03

The 1-line embed

A tiny Vite-built loader mounts an isolated iframe and hands off to the full Next.js widget. Host pages never share React, CSS, or globals with Suprix.

04

Operator dashboard with AI assist

Live conversations grouped by status. Operators can take over from the AI at any point, and a one-click message-enhancement action polishes typed replies without changing meaning.

05

Plugin system with per-org secrets

Adding Stripe, Slack, or HubSpot is a new plugin row and a thin adapter — no architectural change. Credentials live in a per-org secret store, not a shared vault.

06

Production observability

Sentry wired into client, server, and edge runtimes. Real errors, real source maps, real alerts — not a "we'll add telemetry later" promise.

// product shots

Inside the build.

// the results

Outcomes that shipped.

Shipped a production multi-tenant AI support platform on a small team without an infra team. Compliance review with the toughest design partner closed in 40 days against three prior vendors killed at procurement. Zero cross-tenant retrieval incidents in 6 months. Multiple design partners cancelled planned support-engineering hires after Suprix went live.

// stack
Next.js 15React 19ConvexClerkOpenAI EmbeddingsVapiTurborepoTailwindSentry
// learnings

What we took with us.

  • 01Picking Convex was a force multiplier — namespace-isolated retrieval was a storage primitive, not a code-review item.
  • 02Designing voice as a plugin (not a feature) cost a week and bought permanent optionality.
  • 03Refusing to ever have a "chat KB" and a separate "voice KB" was the single most important product decision.
// ready when you are

Have a build that needs this level of thinking?

Free 30-min audit. We'll tell you what to build, what it'd cost, and whether we're the right shop.