AK
WorkExperienceCase StudiesTimelineWritingContact
Resume
AK

Case Study · Live product

Matcha — AI Booking Platform for Appointments & Classes

Customers book by messaging the business on WhatsApp or from a hosted booking page. An AI assistant answers, finds a time and books once they confirm — and everything lands on one calendar.

Founder product, live in early-access beta. Built for fitness studios, salons, clinics and any operator whose customers already live on WhatsApp. WhatsApp Cloud API first; Instagram, Messenger and Viber next.

Try Matcha at my.bookmatcha.app

More work

Related case studies

LLM Infrastructure

Forge

Provider-agnostic system for running LLM batch and realtime jobs across OpenAI and Anthropic, with automatic retries and crash recovery.

View case study
AI Integration Architecture

Omni AI Integration Architecture

AI-augmented maritime CRM architecture for classification, entity extraction, prompt-action workflows, and operational automation.

View case study
Operations CRM

Apollon CRM

Full-stack CRM for pet boarding teams with room scheduling, client records, booking management, and financial reporting.

View case study
Founder productFitness / Service BusinessesLive product

Matcha — AI Booking Platform

Matcha is a booking system for appointments and classes, live in early-access beta at my.bookmatcha.app. An AI assistant answers customer messages on WhatsApp and books once they confirm, a hosted booking page takes direct bookings, and one calendar keeps the team in sync — in Greek and English. As co-founder I designed the architecture, lead development, and shape product direction.

RoleCo-Founder & Lead Developer
Team3-person founding team
TimelineMay 2025 – present · live in beta
IndustryFitness / Service Businesses
Livemy.bookmatcha.app

At a glance

By the numbers

~40%
turns with deterministic shortcuts

regex-first bilingual routing

~529K
lines of code

105 Nest modules

~15,900
test cases

plus ~270 agent eval scenarios

24
agent tools

Zod-validated I/O

263 / 273
ports / adapters

hexagonal architecture

What we were solving

Context & problem

Small service businesses like fitness studios, salons and clinics juggle bookings across messaging apps, calendars, and payment links. As volume increases, missed messages, double bookings, and manual follow-ups become the norm.

Customers want to book the way they already communicate — by sending a WhatsApp message — without installing an app or waiting for the front desk. Building an assistant that understands natural language in two languages, only books times that are genuinely free, manages capacity in real time and prevents race conditions is a hard engineering problem, and it has to sit next to a booking page and a team calendar that never disagree.

How we approached it

Solution

Matcha gives a business two ways to take bookings and one place to see them. Customers can message the business on WhatsApp — "any reformer pilates thursday evening?" — and the assistant answers the question, finds a free time and asks for confirmation before it books. Or they open the business's own booking page, see the classes and pick a slot. Both paths land on the same calendar for the team, with confirmations and reminders sent automatically.

The AI layer is a LangGraph agent built on a ports and adapters architecture, keeping model, tool and provider concerns isolated as the product evolves. Zod-typed tools handle session discovery, booking management, staff and location info, memberships, credit packs and business operations. Regex-first bilingual routing resolves most turns without an LLM call, and three-tier input guardrails plus preflight validators mean the assistant never invents hours, prices or availability — when something is beyond it, it holds the spot and hands the conversation to a human.

The multi-tenant NestJS backend uses MongoDB atomic operations so bookings are race-condition safe, with waitlists that promote automatically when spots open. Stripe handles payments and credit packs, Google Calendar stays in sync, and the dashboard updates live over SSE. Every tenant's data is fully isolated, with audit logs on every action.

Impact

Outcomes

  • - Live in early-access beta at my.bookmatcha.app: six months free, no card, Greek and English out of the box.
  • - Race-condition safe: 50 parallel booking requests on a 10-capacity session → exactly 10 succeed.
  • - Per-channel latency budgets, tool timeouts, retries, and circuit breakers keep conversational turns bounded.
  • - A ~15,900-case test suite and a ~270-scenario agent eval harness gate every agent change on measured behaviour rather than spot checks.
  • - Redis-backed caching, MongoDB indexes, 38 scheduled jobs and an outbox-style notification path keep confirmations and reminders reliable.
Booking pageAnimated flow
One calendarAnimated flow
Matcha brand card: More room to grow. Bookings, made simple. my.bookmatcha.app
Matcha todayScreenshot
Diagram: WhatsApp messages and the booking page flow through the AI agent onto one calendar, then a confirmation goes back to the customer
How a booking flowsScreenshot

Behind the scenes

Tech & delivery

Stack

  • NestJS 11
  • Next.js
  • MongoDB
  • Redis
  • LangGraph
  • LangChain
  • OpenAI
  • WhatsApp Cloud API
  • Stripe
  • Google Calendar
  • TypeScript

Challenges

  • Designing a LangGraph tool orchestration layer with ports and adapters around model, provider, and domain boundaries.
  • Implementing race-condition safe booking with atomic MongoDB operations and proper concurrency handling.
  • Building a reliable AI tool execution framework with parallel processing, preflight guards, timeouts, and error recovery.
  • Managing WhatsApp webhook security with signature validation, rate limiting, and idempotency.

How I worked

  • Collaborated with co-founders on product direction and conversational UX, so the assistant only books after the customer confirms and hands over to a human when a request is beyond it.
  • Built a comprehensive test and eval suite, including E2E chat-to-booking flow tests and simulated multi-turn users.
  • Implemented production monitoring with performance metrics, PII-redacted tracing and circuit breakers.

What's next

Roadmap

Phase 1

More channels

Instagram, Messenger and Viber following the WhatsApp launch

Phase 2

Smart Recommendations

Personalized session suggestions based on booking history

Phase 3

Business Analytics

Real-time occupancy rates, revenue optimization, demand forecasting

Matcha: booking that happens in chat

Customers book from WhatsApp or the business's own booking link. Matcha answers, finds a time and books once they confirm — in Greek or English — and the whole team works from one calendar.

Conversational, on any channel

Book classes with natural language like "I want yoga tomorrow at 7pm" - the AI understands context and handles the entire flow through conversation.

9:41

Matcha

online

I want yoga tomorrow at 7pm

10:30

Yoga tomorrow at 19:00 with Sarah is available. Want me to book it?

10:30

Yes please

10:30
Message

AI Tool Execution

A LangGraph agent with 24 Zod-typed tools for session and appointment-slot discovery, bookings, staff, locations, credit balances, memberships, and business details.

tool_registry.ts
>findSessions()✓
>findAppointmentSlots()✓
>createBooking()✓
>cancelBooking()✓
>findUserBookings()✓
>findStaff()✓
>getCreditBalance()✓
>listLocations()✓
>▌

Atomic Booking Operations

MongoDB atomic updates and guarded booking writes help prevent double-bookings under concurrent demand.

race_test.log

// Booked successfully

// Rejected (capacity full)

10/50 booked

Smart Session Management

Real-time capacity tracking, a waitlist that promotes automatically when a spot opens, and booking and cancellation deadlines per session.

session_dashboard.tsx

Yoga

7/10€25

Pilates

FULL€30

HIIT

4/12€20

// Waitlist queue

3 waiting+1 promoted!

Flexible Payment System

Multiple payment methods (card, cash, credit, membership), a per-business cancellation window (2 hours by default) with a full refund inside the policy and late cancels flagged, and complete payment lifecycle tracking.

cancellation_policy.ts

const cancellationWindowHours = 2; // per business, service or session

100%
cancel ≥ 2h before
0%
late cancel < 2h
booked2h beforestart