AI agent · 2025
AI WhatsApp Booking Agent
A hybrid human-plus-AI booking system for a golf booking service. The AI handles the golfer conversation on WhatsApp; a human operator confirms club availability and verifies payments from a dashboard. Both work from the same data and stay in sync without a refresh.
- typing per booking, down from 20 to 25
- <10 min
- bookings per operator
- 2.5 to 3x
- Role
- Tech lead, team of one or two
- Built at
- Amphibia Digital
- Channel
- Stack
- Convex
- Next.js
- FastAPI
- OpenAI API
- WhatsApp Cloud API


Overview
Before the system, an operator spent most of each booking typing: reading the request, asking for the club, date, time, and player count, relaying availability, sending bank details, and writing the confirmation. Twenty to thirty messages per booking, across several conversations at once, and some slipped through unanswered.
The agent now absorbs that messaging. One OpenAI call per inbound message returns the reply, the booking fields it extracted, and an intent, and the booking state machine in Convex does the rest. The operator's job shrinks to the parts that need judgement: phoning the club, checking a payment screenshot, and clicking a status button. That was a deliberate choice. Clubs only take phone calls, and a wrong automatic payment check would be worse than a 60-second human look.
Related:GolfXS
What I built
- Structured output per message: reply text, extracted booking fields (club, date, time, players), and an intent such as confirming_yes, so the code branches in TypeScript instead of chaining model calls.
- System prompt anchored on today's date and the live club list from the database, so the model doesn't invent clubs or misread "Saturday". Declines prompt-injection attempts without leaking internal data.
- Conversation history bounded to the last twelve messages; payment screenshots sent over WhatsApp are stored and attached to the booking automatically.
- Operator dashboard on Next.js and Convex: every status change fires the right WhatsApp message and email, and the operator never opens WhatsApp.
- FastAPI handles only the Meta webhook ingress, where the raw-body HMAC signature is validated in isolation.
Screens
2 captioned views. Select any to enlarge.
Conversations
2 views
01Opening & guardrails
The agent lists the clubs it can book, then declines an "ignore all previous instructions" prompt-injection attempt without revealing internal data.
02Booking flow
From a free-text request ("cyberjaya lakes club tomorrow at 2pm"), it normalises the club and time, asks for party size, and recaps before submitting.
Open to senior / lead roles · remote or relocating to Singapore
Hiring for a senior or lead role?
I take systems from requirements to production: mobile, web, backend, and AI agents. Tell me about the problem and I will reply within a day on weekdays.