Salon & Spa Booking Agent
Let clients browse services, match with a stylist, and book appointments across WhatsApp, Instagram, and web chat — with Google Calendar handling availability.
What you'll build
An agent that takes clients from "I want a haircut" to a confirmed appointment in one conversation: service descriptions and pricing from a knowledge base, stylist matching based on preference or expertise, real-time availability checked via Google Calendar, and a booking confirmation sent back to the client.
Prerequisites
- BimpeAI account with an API key (
sk_…) - Read Anatomy of a workflow agent first — this recipe skips steps covered there
- Google Calendar connected in the Console dashboard (see Step 4)
- WhatsApp Business number, Instagram account, and/or web chat widget connected in the Console dashboard (see Step 4)
Steps
1. Find the workflow
import { BimpeAI } from "@bimpeai/sdk";
const bimpe = new BimpeAI({ apiKey: process.env.BIMPEAI_API_KEY! });
const page = await bimpe.workflows.list({ scope: "public", search: "salon" });
const workflow = page.data[0];
console.log(workflow.id, workflow.name);import os
from bimpeai import BimpeAI
client = BimpeAI(api_key=os.environ["BIMPEAI_API_KEY"])
page = client.workflows.list(scope="public", search="salon")
workflow = page.data[0]
print(workflow.id, workflow.name)2. Create the agent
const agent = await bimpe.agents.create(
{
name: "Salon booking agent",
system_prompt:
"You help clients book salon and spa appointments. " +
"Describe services and pricing from the knowledge base. " +
"Ask the client for their preferred service, stylist (if any preference), and desired date and time. " +
"Check stylist availability via the Google Calendar integration before confirming. " +
"Send a clear confirmation summary once the booking is made.",
agent_workflow_id: workflow.id,
},
{ idempotencyKey: "create-salon-booking-agent-v1" },
);
console.log(agent.id);agent = client.agents.create(
name="Salon booking agent",
system_prompt=(
"You help clients book salon and spa appointments. "
"Describe services and pricing from the knowledge base. "
"Ask the client for their preferred service, stylist (if any preference), and desired date and time. "
"Check stylist availability via the Google Calendar integration before confirming. "
"Send a clear confirmation summary once the booking is made."
),
agent_workflow_id=workflow.id,
idempotency_key="create-salon-booking-agent-v1",
)
print(agent.id)3. Add knowledge bases
Two knowledge bases cover the service menu and the staff profiles. The agent draws on both when matching clients to stylists.
// Service menu with durations and prices
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Services",
content:
"HAIR:\n" +
" Women's cut and blow-dry — 60 min — £45\n" +
" Men's cut — 30 min — £25\n" +
" Full highlights — 120 min — £95\n" +
" Balayage — 150 min — £120\n" +
" Keratin treatment — 180 min — £140\n\n" +
"NAILS:\n" +
" Manicure — 45 min — £28\n" +
" Gel manicure — 60 min — £38\n" +
" Pedicure — 60 min — £35\n\n" +
"SPA:\n" +
" Swedish massage (60 min) — £65\n" +
" Deep tissue massage (60 min) — £75\n" +
" Classic facial — 60 min — £55\n" +
" Luxury facial — 90 min — £80\n\n" +
"Cancellation policy: 24 hours notice required. Late cancellations charged at 50% of service price.",
});
// Staff profiles and specialisms
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Staff",
content:
"Maya — Senior Stylist — specialises in colour work (balayage, highlights, creative colour)\n" +
"James — Stylist — specialises in men's cuts, beard trims, and fades\n" +
"Priya — Senior Stylist — specialises in textured hair, natural styles, and keratin treatments\n" +
"Sofia — Nail Technician — all nail services including nail art\n" +
"Tom — Massage Therapist — Swedish, deep tissue, sports massage\n" +
"Aisha — Beauty Therapist — facials, waxing, brow and lash treatments\n\n" +
"All stylists are qualified and insured. Junior stylists available at a 20% discount — ask to specify.",
});# Service menu with durations and prices
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Services",
"content": (
"HAIR:\n"
" Women's cut and blow-dry — 60 min — £45\n"
" Men's cut — 30 min — £25\n"
" Full highlights — 120 min — £95\n"
" Balayage — 150 min — £120\n"
" Keratin treatment — 180 min — £140\n\n"
"NAILS:\n"
" Manicure — 45 min — £28\n"
" Gel manicure — 60 min — £38\n"
" Pedicure — 60 min — £35\n\n"
"SPA:\n"
" Swedish massage (60 min) — £65\n"
" Deep tissue massage (60 min) — £75\n"
" Classic facial — 60 min — £55\n"
" Luxury facial — 90 min — £80\n\n"
"Cancellation policy: 24 hours notice required. Late cancellations charged at 50% of service price."
),
})
# Staff profiles and specialisms
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Staff",
"content": (
"Maya — Senior Stylist — specialises in colour work (balayage, highlights, creative colour)\n"
"James — Stylist — specialises in men's cuts, beard trims, and fades\n"
"Priya — Senior Stylist — specialises in textured hair, natural styles, and keratin treatments\n"
"Sofia — Nail Technician — all nail services including nail art\n"
"Tom — Massage Therapist — Swedish, deep tissue, sports massage\n"
"Aisha — Beauty Therapist — facials, waxing, brow and lash treatments\n\n"
"All stylists are qualified and insured. Junior stylists available at a 20% discount — ask to specify."
),
})4. Connect channels and integrations (dashboard)
Google Calendar and channels are configured in the dashboard
The API cannot create integrations or channel connections. Connect Google Calendar and your messaging channels in the Console dashboard. The SDK lets you list what is active but cannot modify the connections.
- Open Console dashboard → Agents → select your agent.
- Under Channels, connect your WhatsApp Business number.
- Under Channels, connect your Instagram business account.
- Under Channels, enable the web chat widget and paste the embed snippet into your salon website.
- Under Integrations, connect Google Calendar. Each stylist's calendar should be shared with the connected Google account so the agent can check individual availability.
5. Verify and go live
const integrations = await bimpe.agents.integrations.list(agent.id);
const channels = await bimpe.agents.channels.list(agent.id);
console.log("Integrations:", integrations.map((i) => i.name));
console.log("Channels:", channels.map((c) => c.type));integrations = client.agents.integrations.list(agent.id)
channels = client.agents.channels.list(agent.id)
print("Integrations:", [i.name for i in integrations])
print("Channels:", [c.type for c in channels])Full example
import { BimpeAI } from "@bimpeai/sdk";
const bimpe = new BimpeAI({ apiKey: process.env.BIMPEAI_API_KEY! });
// 1. Find workflow
const page = await bimpe.workflows.list({ scope: "public", search: "salon" });
const workflow = page.data[0];
// 2. Create agent
const agent = await bimpe.agents.create(
{
name: "Salon booking agent",
system_prompt:
"You help clients book salon and spa appointments. Describe services, match clients to stylists, " +
"and check availability via Google Calendar before confirming.",
agent_workflow_id: workflow.id,
},
{ idempotencyKey: "create-salon-booking-agent-v1" },
);
// 3. Add knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Services",
content:
"Women's cut and blow-dry — 60 min — £45\n" +
"Men's cut — 30 min — £25\n" +
"Balayage — 150 min — £120\n" +
"Swedish massage — 60 min — £65",
});
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Staff",
content:
"Maya — Senior Stylist — colour work specialist\n" +
"James — Stylist — men's cuts and fades\n" +
"Priya — Senior Stylist — textured hair and keratin treatments",
});
// 4. Verify integrations and channels (configured via dashboard)
const integrations = await bimpe.agents.integrations.list(agent.id);
const channels = await bimpe.agents.channels.list(agent.id);
console.log("Agent ID:", agent.id);
console.log("Integrations:", integrations.map((i) => i.name));
console.log("Channels:", channels.map((c) => c.type));
// 5. Stream incoming booking conversations
const controller = new AbortController();
for await (const event of bimpe.conversations.messages.stream(
agent.id,
"<conversation_id>",
{ signal: controller.signal },
)) {
console.log(event.role, event.message);
}import os
from bimpeai import BimpeAI
client = BimpeAI(api_key=os.environ["BIMPEAI_API_KEY"])
# 1. Find workflow
page = client.workflows.list(scope="public", search="salon")
workflow = page.data[0]
# 2. Create agent
agent = client.agents.create(
name="Salon booking agent",
system_prompt=(
"You help clients book salon and spa appointments. Describe services, match clients to stylists, "
"and check availability via Google Calendar before confirming."
),
agent_workflow_id=workflow.id,
idempotency_key="create-salon-booking-agent-v1",
)
# 3. Add knowledge bases
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Services",
"content": (
"Women's cut and blow-dry — 60 min — £45\n"
"Men's cut — 30 min — £25\n"
"Balayage — 150 min — £120\n"
"Swedish massage — 60 min — £65"
),
})
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Staff",
"content": (
"Maya — Senior Stylist — colour work specialist\n"
"James — Stylist — men's cuts and fades\n"
"Priya — Senior Stylist — textured hair and keratin treatments"
),
})
# 4. Verify integrations and channels (configured via dashboard)
integrations = client.agents.integrations.list(agent.id)
channels = client.agents.channels.list(agent.id)
print("Agent ID:", agent.id)
print("Integrations:", [i.name for i in integrations])
print("Channels:", [c.type for c in channels])
# 5. Stream incoming booking conversations
for event in client.conversations.messages.stream(agent.id, "<conversation_id>"):
print(event.role, event.message)Deploy
Store your API key in BIMPEAI_API_KEY. Confirm Google Calendar appears in integrations.list before going live — without it the agent cannot check stylist availability. Update the services knowledge base whenever prices change using knowledgeBases.update. Use a stable idempotencyKey to prevent duplicate agents on redeploy.
Variations
- Add a promotions knowledge base entry and update it weekly to let the agent surface current deals (e.g. midweek colour discount).
- Add a loyalty card section to the services knowledge base so the agent can explain how points are earned and redeemed.
- Send an appointment reminder to the client's WhatsApp 24 hours before their visit using
conversations.messages.sendfrom a scheduled script.
SaaS Helpdesk Agent
Answer tier-1 support questions from your help docs, create and track tickets in your ticketing system, and route complex cases to a human agent.
Short-Stay Self Check-in Agent
Give Airbnb and short-let guests instant access to key codes, house rules, Wi-Fi details, and checkout reminders — no external APIs required.