She checks the calendar before she says yes.
This is Sophie, an AI receptionist I built for a dental practice. A caller wants a filling on Thursday at 1pm. She checks availability first, takes their details, reads them back, and books it — the appointment lands in Google Calendar in under 5 seconds.
No hold music. No missed call. No human on the phone.
I build voice agents like this for clinics, salons, and service businesses that lose customers every time nobody picks up.
Want one answering your phone? DM me.
I built a WhatsApp AI agent in n8n for a demo skincare brand. It answers customers from the business's own documents, remembers past chats, and understands voice notes.
Here's how it works
The stack:
• WhatsApp Trigger to receive messages
• Switch to split text and voice notes
• OpenAI to transcribe voice and power the AI Agent
• Supabase with pgvector as the knowledge base
• Postgres Chat Memory
• WhatsApp node to send the reply
Knowledge: the business documents are split into chunks, turned into embeddings, and stored in Supabase.
Before answering, the agent searches them for the most relevant pieces. So it answers from the business's real info, not from guesses.
Memory: chat history lives in Postgres.
The trick is the Session Key. Set it to the customer's phone number so every customer gets their own memory. When someone comes back tomorrow, the agent knows what they asked yesterday.
Voice notes: the Switch checks the message type. Voice notes get downloaded and transcribed; text goes straight through, and both reach the agent as plain text.
Customers can talk or type. The agent handles both.
Biggest lesson: RAG is only as good as your documents.
Clean up the FAQ, remove outdated prices and contradictions, then embed. Messy docs give you confident wrong answers.
@noahinx Thank you! Your friend is right, it's never instant, especially with voice notes.
But on WhatsApp it matters less than on a call. People don't mind waiting a few seconds in chat, they just want to know you saw their message. Showing "typing..." helps a lot.
If you run a home services business, HVAC, plumbing, cleaning, etc., these are 3 things I’d automate first:
Missed call → text them back right away with a booking link
New lead → add them to the CRM and notify the tech on call
Job done → send a review request a few hours later
You really don’t need an AI agent for this.
A few simple automations can handle most of it.
Yes, I will.
I’ve abandoned this page before because of low engagement. I’m not making that mistake again.
No likes. No replies. No validation.
I’m still posting.
@FReza1984 Exactly. It’s simple, but it solves a real problem immediately. A fast, relevant response after a missed call can be the difference between losing the lead and getting the booking.
The Docker setup I'm showing runs on my own computer, so I use it for building, testing and demos, and it only runs while my machine and Docker are on. I wouldn't put a client's live agent on it. For a brand that depends on the agent, it should run on an always-on host, either n8n Cloud or a small server, with the container set to restart on its own, and an error workflow that alerts me if something fails. That way it doesn't depend on me being at my desk.
Thanks! Session key as the phone number keeps every customer's chat separate, and it also makes returning customers easy to recognise. On hosting, it depends on the brand. My default for a real client is that n8n runs on their side, in their own n8n account or on their own server, so they own their data and credentials, and I build and maintain it for them. For smaller brands who don't want to manage anything, it can run on my side instead and I handle it. I've also just set up n8n locally with Docker, and I'll be sharing a video on how I installed it soon.
No, I didn't test that one, and you're right that it's a gap. Right now the conversation history and the FAQ both land in the same context, so if a price changed overnight the model is looking at two answers and nothing tells it which is current. It'll lean toward the FAQ most of the time, but "most of the time" isn't good enough for pricing.
Two things I'd add. First, a line in the system prompt that says the FAQ is the source of truth for prices, hours, and policies, and anything in earlier messages is historical and should not be quoted as current. Second, store facts in memory with a date, so a reply can say "I quoted you ₦2,000 yesterday, that's since changed to ₦2,500" instead of silently contradicting itself. The second version is actually a better customer experience than either source alone.
Adding this to the test cases, thanks for flagging it.