Dojo Roleplay
A multi-tenant SaaS platform that lets martial-arts schools run realistic AI voice roleplays, auto-scores every conversation with OpenAI, and manages staff, scenarios, analytics and subscription limits across many schools.
A scripted preview — the AI plays the prospect, staff rehearse, then every call is auto-scored. Loops for illustration.
The problem
The conversations that decide a school's revenue — inbound leads, outbound callbacks, enrollment conferences, renewals, and cancellation saves — are handled by front-desk staff who only ever get to practice on real prospects, where mistakes cost members. And owners have no real visibility into who handles them well or where calls fall apart.
What I built
A full multi-tenant SaaS product — not a demo. Schools sign in, their staff train against AI, and every call is scored automatically.
- Realtime AI voice roleplay — staff start a practice call with an AI prospect over Vapi, choose the scenario and difficulty, and talk it through out loud.
- Automated AI scorecards — each call is transcribed and scored by OpenAI against scenario-specific rubrics: weighted categories, highlights, missed opportunities, and coaching suggestions.
- Multi-tenant management — schools, users, roles, scenarios, calls, scorecards, and usage limits, with every query scoped to its tenant.
- Role-based access — global admins, school admins, and staff each get their own workspace and permissions.
- Subscription-aware logic — Starter, Team, and AIOS plans gate member counts, monthly roleplay minutes, and custom-scenario access.
- Custom scenarios — higher-tier schools author their own prompts, character behaviour, voice settings, and scoring criteria.
- Analytics & leaderboards — recent calls, top performers, usage snapshots, and score trends at the school level.
Under the hood
A layered backend — Route → Controller → Service → DB query → Supabase — with Joi validation, Supabase Auth behind a backend-only service-role key, tenant-scoped queries with ownership checks, rate limiting, CORS allowlists, structured Pino logging, and global error handling.
The front end is React 18 + Vite with React Router, TanStack Query, Zustand, shadcn/Radix UI, and Recharts, keeping API calls, hooks, auth state, and UI state cleanly separated. Vapi webhooks feed call data in, OpenAI handles scoring, n8n automates onboarding and invites, and the whole thing deploys on Render.
Outcome
Staff get unlimited low-stakes reps on the exact conversations that decide enrolments, and owners finally get visibility — who's improving, where calls break down — through automatic scoring and leaderboards. It's live and in use across schools.