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. Everything lands on one calendar.

Founder product, live in early-access beta. Built for fitness studios, salons, clinics and any operator whose customers already use WhatsApp. WhatsApp comes first, then Instagram, Messenger and Viber.

Discuss a similar project

Case study by Aggelos Konstantilieris

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 help decide what we build next.

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

At a glance

By the numbers

turns with deterministic shortcuts
~40%
regex-first bilingual routing
lines of code
~529K
105 Nest modules
test cases
~15,900
plus ~270 agent eval scenarios
agent tools
24
Zod-validated I/O
ports / adapters
263 / 273
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 bookings grow, messages get missed, slots get double booked, and someone spends the evening chasing confirmations.

Customers want to book the way they already talk: a WhatsApp message. No app, no waiting for the front desk. The assistant has to understand Greek and English, offer only slots that are free, and never let two people take the last place. The booking page and the team calendar must agree with it at all times.

How we approached it

Solution

Matcha gives a business two ways to take bookings and one place to see them. A customer can message the business on WhatsApp, for example "any reformer pilates thursday evening?". The assistant answers, finds a free time and asks for confirmation before it books. Or the customer opens the business's own booking page and picks a slot. Both paths land on the same calendar, and confirmations and reminders go out automatically.

The assistant is a LangGraph agent. Model, tools and providers sit behind ports so each can change on its own. Its tools cover sessions, bookings, staff, locations, memberships and credit packs. Routine requests are matched by rules first, so about 40% of turns never call a model. Answers about hours, prices and availability are checked against the database before they go out. When a request is beyond it, the assistant hands over to a person.

The multi-tenant NestJS backend books with atomic MongoDB operations, so two requests cannot take the same place. When a place opens, the waitlist promotes the next person. Stripe handles payments and credit packs, and Google Calendar stays in sync. The dashboard updates live over SSE. Each tenant's data is kept apart, and every action is logged.

Impact

Outcomes

  • - Live in early-access beta at my.bookmatcha.app: six months free, no card, Greek and English out of the box.
  • - 50 parallel requests for a 10-place session: exactly 10 succeed.
  • - Each channel has a latency budget. Timeouts, retries and circuit breakers keep every reply inside it.
  • - Every agent change must pass a ~15,900-case test suite and a ~270-scenario eval harness.
  • - Confirmations and reminders run on 38 scheduled jobs and an outbox, with Redis caching and MongoDB indexes behind them.
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

  • Putting the LangGraph agent behind ports, so model, provider and domain code stay apart.
  • Making sure two parallel requests can never take the same place, using atomic MongoDB writes.
  • Running agent tools in parallel with checks before each call, timeouts and recovery from errors.
  • Securing the WhatsApp webhook with signature checks, rate limits and idempotent handling.

How I worked

  • Worked with my co-founders on how the assistant talks. It books only after the customer confirms and hands over to a person when needed.
  • Built the tests and evals, including end-to-end chat-to-booking flows and simulated multi-turn users.
  • Added production monitoring with performance metrics, tracing with personal data removed, and circuit breakers.

What's next

Roadmap

Phase 1

More channels

Instagram, Messenger and Viber after WhatsApp.

Phase 2

Suggestions

Suggest sessions from what a customer has booked before.

Phase 3

Reports

Occupancy and revenue per class, per location.

Matcha: booking that happens in chat

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

Conversational booking on WhatsApp

Customers write "I want yoga tomorrow at 7pm" and the assistant books it in the chat.

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 slots, bookings, staff, credits and memberships.

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

Atomic Booking Operations

Atomic MongoDB writes stop two people booking the same place.

race_test.log

// Booked successfully

// Rejected (capacity full)

10/50 booked

Smart Session Management

Each session tracks its places and promotes the waitlist when one opens.

session_dashboard.tsx

Yoga

7/10€25

Pilates

FULL€30

HIIT

4/12€20

// Waitlist queue

3 waiting+1 promoted!

Flexible Payment System

Card, cash, credit or membership, with a full refund for cancels 2 hours or more before the session.

cancellation_policy.ts

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

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

More work

Related case studies

TypeScript development servicesDiscuss your project