Hotel Reservation & Concierge
Let guests check room availability, make reservations, ask about amenities, and get local recommendations — across WhatsApp and web chat.
What you'll build
An agent that handles the full pre-arrival journey: room availability questions checked against Google Calendar, reservation requests, amenity Q&A answered from a knowledge base, and curated local recommendations. Stripe can optionally collect a holding deposit at confirmation.
Customer journey
A guest messages on WhatsApp or uses Web Chat on the hotel site to check availability, book a room, or ask about amenities. The agent checks Google Calendar, quotes rates from the room inventory KB, and can collect a holding deposit via Stripe.
See Deploying and testing channels for connect and test steps per channel.
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 and/or web chat widget connected in the Console dashboard (see Step 4)
Steps
1. Find or create 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: "hotel" });
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="hotel")
workflow = page.data[0]
print(workflow.id, workflow.name)Or build a new workflow from scratch with workflows.create instead of finding one. name and system_prompt are required; it returns the new Workflow whose id you bind the agent to. See Anatomy of a workflow agent for the full set of optional fields like rules and flows.
const workflow = await bimpe.workflows.create({
name: "Hotel concierge",
system_prompt: "You help guests check room availability, make reservations, answer amenity questions, and get local recommendations.",
});
console.log(workflow.id);workflow = client.workflows.create(
name="Hotel concierge",
system_prompt="You help guests check room availability, make reservations, answer amenity questions, and get local recommendations.",
)
print(workflow.id)2. Create the agent
const agent = await bimpe.agents.create(
{
name: "Hotel concierge",
description: "Handles room availability, reservations, amenity questions, and local recommendations.",
workflow_id: workflow.id,
},
{ idempotencyKey: "create-hotel-concierge-v1" },
);
console.log(agent.id);agent = client.agents.create(
name="Hotel concierge",
description="Handles room availability, reservations, amenity questions, and local recommendations.",
workflow_id=workflow.id,
idempotency_key="create-hotel-concierge-v1",
)
print(agent.id)3. Add knowledge bases (optional)
Knowledge bases are optional; an agent whose workflow and integrations already cover everything it needs to say can skip this step. This recipe uses one to ground the agent in the details it must quote accurately.
Two knowledge bases cover the room catalogue and the local area guide. A third holds booking policy so the agent quotes cancellation terms accurately.
// Room inventory with rates
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Room inventory",
content:
"Standard Double — £95/night — sleeps 2, city view, free Wi-Fi, tea/coffee\n" +
"Deluxe King — £135/night — sleeps 2, garden view, mini-bar, free Wi-Fi\n" +
"Family Suite — £185/night — sleeps 4, living area, two bathrooms, free Wi-Fi\n" +
"Executive Suite — £260/night — sleeps 2, king bed, lounge, espresso machine, late checkout",
});
// Amenities and local guide
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Amenities and local guide",
content:
"Hotel amenities: rooftop pool (07:00–22:00), gym (24h), spa (09:00–20:00), " +
"restaurant (breakfast 07:00–10:30, dinner 18:00–22:00), bar (12:00–00:00).\n" +
"Local recommendations:\n" +
" Dining: The Old Mill (5 min walk, British cuisine), Spice Garden (10 min, Indian)\n" +
" Attractions: City Museum (15 min walk), Botanical Gardens (20 min walk)\n" +
" Transport: nearest tube station 3 min walk, airport express from Central Station",
});
// Booking and cancellation policy
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Booking policy",
content:
"Check-in: 15:00. Check-out: 11:00. Early check-in subject to availability (£20 fee).\n" +
"Cancellation: free up to 48 hours before arrival. Within 48 hours: one night charged.\n" +
"Pets: not permitted. Breakfast: £14 per person, bookable at check-in or via this agent.",
});# Room inventory with rates
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Room inventory",
"content": (
"Standard Double — £95/night — sleeps 2, city view, free Wi-Fi, tea/coffee\n"
"Deluxe King — £135/night — sleeps 2, garden view, mini-bar, free Wi-Fi\n"
"Family Suite — £185/night — sleeps 4, living area, two bathrooms, free Wi-Fi\n"
"Executive Suite — £260/night — sleeps 2, king bed, lounge, espresso machine, late checkout"
),
})
# Amenities and local guide
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Amenities and local guide",
"content": (
"Hotel amenities: rooftop pool (07:00–22:00), gym (24h), spa (09:00–20:00), "
"restaurant (breakfast 07:00–10:30, dinner 18:00–22:00), bar (12:00–00:00).\n"
"Local recommendations:\n"
" Dining: The Old Mill (5 min walk, British cuisine), Spice Garden (10 min, Indian)\n"
" Attractions: City Museum (15 min walk), Botanical Gardens (20 min walk)\n"
" Transport: nearest tube station 3 min walk, airport express from Central Station"
),
})
# Booking and cancellation policy
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Booking policy",
"content": (
"Check-in: 15:00. Check-out: 11:00. Early check-in subject to availability (£20 fee).\n"
"Cancellation: free up to 48 hours before arrival. Within 48 hours: one night charged.\n"
"Pets: not permitted. Breakfast: £14 per person, bookable at check-in or via this agent."
),
})4. Connect channels and integrations (dashboard)
Channels, Google Calendar, and Stripe are connected in the dashboard
The API cannot create channel connections, but integrations can now be configured through it; see Configuring integrations. Connect your messaging channels on the Deploy screen and Google Calendar and Stripe on the Integrations screen of the Console dashboard. The SDK lists what is active but cannot modify channel connections.
- In the Console dashboard, pick your agent from the switcher at the top, then open Deploy.
- Under Messaging & Chat, click Connect on the WhatsApp card and follow the prompts to link your WhatsApp Business number.
- Under Messaging & Chat, click Connect on the Web Chat Widget card to add the widget to your hotel website.
- Open Integrations, find Google Calendar, and click Connect. The agent uses it to check room availability against confirmed bookings.
- Open Integrations, find Stripe, and click Connect if you want the agent to collect a holding deposit at confirmation.
Connect WhatsApp
Customers message your WhatsApp Business number for support and transactions.
- Open the Deploy screen in the Console dashboard and select your agent.
- Under Messaging & Chat, click Connect on the WhatsApp card.
- Follow the prompts to link your WhatsApp Business number.
- Once connected, customers can message your business number and the agent replies within WhatsApp's 24-hour session window.
Full reference: Deploying and testing channels.
Connect Web Chat
Visitors use the chat widget embedded on your website or app.
- Open Deploy and select your agent.
- Under Messaging & Chat, click Connect on the Web Chat Widget card.
- Copy the embed snippet and paste it into your site's HTML before the closing body tag.
- Publish your site — the chat bubble appears in the corner and routes messages to this agent.
Full reference: Deploying and testing channels.
Also on Instagram and Messenger: the same Deploy → Connect flow applies. Testers use the Deploy panel links or getTestCode deep links for each network. Instagram · Messenger
5. Test your agent
Before going live, exercise the agent on a test channel. Fetch the test code (created on first request), then test on WhatsApp — share the deep link or start message with a human tester, or inject a message from your server.
Test WhatsApp
Human tester: fetch the test code with agents.getTestCode (or use the Deploy panel). Share the deep link or start <code> message with a tester.
SDK injection: call conversations.send with is_test_channel: true and the matching channel_type.
Full reference: Deploying and testing channels.
Test Web Chat
Playground: open Playground → Chat in the dashboard for a quick sanity check.
SDK injection: call conversations.send with channel_type: "webchat" and a stable channel_user_id, or set is_test_channel: true before go-live.
Full reference: Deploying and testing channels.
const { channels } = await bimpe.agents.getTestCode(agent.id);
// A tester opens channels.whatsapp.url, or sends channels.whatsapp.start_message
// to channels.whatsapp.phone_number, to open a 24-hour test window.
console.log(channels.whatsapp.start_message, channels.whatsapp.url);
// Or inject a test message yourself:
await bimpe.conversations.send(agent.id, {
message: "Do you have a deluxe king available this Friday and Saturday for two?",
channel_type: "whatsapp",
channel_user_id: "<tester-whatsapp-number>",
is_test_channel: true,
});test_code = client.agents.get_test_code(agent.id)
# A tester opens .url, or sends .start_message to .phone_number, to open a 24-hour window.
print(test_code.channels.whatsapp.start_message, test_code.channels.whatsapp.url)
# Or inject a test message yourself:
client.conversations.send(
agent.id,
message="Do you have a deluxe king available this Friday and Saturday for two?",
channel_type="whatsapp",
channel_user_id="<tester-whatsapp-number>",
is_test_channel=True,
)See Test your agent for the other test channels and the pause-AI rule.
6. 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: "hotel" });
const workflow = page.data[0];
// 2. Create agent
const agent = await bimpe.agents.create(
{
name: "Hotel concierge",
description: "Handles room availability, reservations, amenity questions, and local recommendations.",
workflow_id: workflow.id,
},
{ idempotencyKey: "create-hotel-concierge-v1" },
);
// 3. Add knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Room inventory",
content:
"Standard Double — £95/night — sleeps 2, city view\n" +
"Deluxe King — £135/night — sleeps 2, garden view, mini-bar\n" +
"Family Suite — £185/night — sleeps 4, two bathrooms\n" +
"Executive Suite — £260/night — sleeps 2, lounge, late checkout",
});
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Booking policy",
content:
"Check-in: 15:00. Check-out: 11:00.\n" +
"Cancellation: free up to 48 hours before arrival. Within 48 hours: one night charged.",
});
// 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 messages in a guest conversation
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="hotel")
workflow = page.data[0]
# 2. Create agent
agent = client.agents.create(
name="Hotel concierge",
description="Handles room availability, reservations, amenity questions, and local recommendations.",
workflow_id=workflow.id,
idempotency_key="create-hotel-concierge-v1",
)
# 3. Add knowledge bases
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Room inventory",
"content": (
"Standard Double — £95/night — sleeps 2, city view\n"
"Deluxe King — £135/night — sleeps 2, garden view, mini-bar\n"
"Family Suite — £185/night — sleeps 4, two bathrooms\n"
"Executive Suite — £260/night — sleeps 2, lounge, late checkout"
),
})
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Booking policy",
"content": (
"Check-in: 15:00. Check-out: 11:00.\n"
"Cancellation: free up to 48 hours before arrival. Within 48 hours: one night charged."
),
})
# 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 messages in a guest conversation
for event in client.conversations.messages.stream(agent.id, "<conversation_id>"):
print(event.role, event.message)Deploy and go live
Go-live checklist
- Store your API key in
BIMPEAI_API_KEY(server-side only). - Confirm Google Calendar appears in
integrations.listor is connected in the dashboard. - Confirm Stripe appears in
integrations.listor is connected in the dashboard. - Verify WhatsApp is connected on the Deploy screen (
agents.channels.listshows it enabled). - Verify Web Chat is connected on the Deploy screen (
agents.channels.listshows it enabled). - Set Escalation Email under Settings → Agent if humans must take over.
- Switch the agent to
livewithupdateLiveStatus/update_live_status. - Monitor the Conversations screen (or stream via SDK) after launch.
After go-live
Confirm Google Calendar before opening reservations. Update room inventory KB when rates change.
Variations
- Add a local events knowledge base entry and update it weekly so the agent can recommend what is on during a guest's stay.
- Narrow the agent to upsell spa packages by adding package details and an upsell instruction to the workflow's
system_prompt. - Send a pre-arrival message to the guest's WhatsApp the day before check-in using
conversations.send(create-or-send by channel) from a scheduled script.
General E-commerce Store Agent
Help shoppers browse products, check stock, place orders, and get post-purchase support — all through WhatsApp or web chat.
Loan Inquiry Agent
Build a banking virtual assistant that answers loan questions, grounds replies in rate and eligibility FAQs, looks up application status via a custom API, and supports webchat plus outbound voice.