Counselling Practice · Singapore
A Singapore counselling practice, 29 therapists, one WhatsApp intake.
WhatsApp AI Intake Agent
Alliance Counselling is a counselling practice in Singapore running 29 therapists across three locations (Cluny Court, East Coast and telehealth) on Cliniko.
The brief was a WhatsApp intake agent that could take a new client enquiry and book it. The difficulty was not the conversation. It was everything underneath it.
The problem
29 therapists, one calendar, and no two the same.
Every therapist has a different skill set. One does couples therapy, another does not. They are not interchangeable, so matching a client to an available slot is not a scheduling problem. It is a matching problem that happens to end in a slot.
The timetables are unstructured. A single therapist might work Monday to Wednesday at Cluny Court from 10am to 2pm, Tuesday from noon to 5pm, Wednesday online only, Thursday at East Coast, and not at all on Friday. Nothing is consistent between one therapist and the next.
And the practice does not run a separate Cliniko calendar per location. Everything sits in one single calendar, with the location encoded in a naming convention the practice invented themselves: CC for Cluny Court, EC for East Coast, prefixed for new clients. Any automation has to read that convention correctly before it can offer anybody anything.
What we built
A matching engine, a custom dashboard, and a model kept on a short leash.
We built a WhatsApp intake agent that takes the enquiry, and matching logic that reads two systems at once: Cliniko for therapist availability, working hours and the practice's own appointment-type labels, and a custom dashboard we built for everything Cliniko cannot express. The agent then offers the client only the appointments they are genuinely eligible for, and writes the booking into Cliniko.
The conversation itself is a deterministic state machine. The language model is confined to two jobs: reading what the client just said, and pulling out a single field. It never decides what to ask next, never advances the conversation on its own, and never makes the booking. Crisis language is caught by fixed rules that run before the model is involved at all, and goes straight to a human.
The dashboard gives the practice control over the parts that change week to week: taking over a conversation, switching an individual therapist off for one appointment type without touching Cliniko, setting opening hours and holiday closures, and maintaining each therapist's profile.
How it works
From first message to a booked therapist.
- 01
Take the enquiry on WhatsApp
The agent greets the client, establishes whether they are new or existing, and collects their contact details in a single message rather than an interrogation.
- 02
Understand what they need
Service type, location, therapist preference, preferred days and times, language, and what has brought them in. For couples work it also collects the partner's details.
- 03
Screen for crisis first, by rule
A fixed keyword list runs independently of the language model. Anything matching self-harm or crisis language is handed to a person immediately, so that safety path can never depend on a model call.
- 04
Match against who can actually help
Service capability, location and the practice's on/off switches are hard filters: they exclude. Language, presenting concern and preferred timing are scores that rank the shortlist rather than shrinking it. A client who names a therapist is treated as an instruction.
- 05
Read real availability from Cliniko
Cliniko remains the single source of truth for each therapist's hours, breaks and existing bookings, so the slots offered are ones that genuinely exist.
- 06
Book it, without double-booking
Cliniko has no server-side guard against two people taking the same slot, so we hold a lock of our own before writing. The appointment is created in Cliniko with the correct appointment type, client, date and time.
- 07
Hand to a human when it needs one
Admins can take over any conversation from the dashboard. Outside opening hours and during closures, the agent says so rather than pretending the office is open.
Platforms we used
Two systems, read together.
- WhatsApp Cloud API
- The client-facing channel, on Meta's official API
- Cliniko
- The practice's system of record: availability, appointment types and the bookings themselves
- Custom dashboard
- Human takeover, per-therapist service switches, opening hours and holiday closures, therapist profiles
- Supabase
- Conversation state and the slot locking that prevents double-booking
- Modal & Vercel
- Hosting for the agent and the dashboard
The outcome
29
therapists, 3 locations, one intake flow
One intake flow now covers 29 therapists, three locations and a single shared Cliniko calendar, reading a labelling convention the practice built for itself rather than asking them to change how they work.
Phase one covers five service types: individual therapy, couples therapy, Gottman Method couples therapy, single sessions and the Dad Check-in. A further five follow in phase two.
How this works, explained
A care-first intake for your practice.
Tell us how new client enquiries reach you today and we will map the intake agent that fits a counselling practice, usually live in one to three weeks.