Event Venue Inquiry Agent
Qualify event leads, answer capacity and pricing questions, and book viewing appointments — over inbound voice calls and web chat.
What you'll build
An agent that handles inbound venue inquiries end to end: answers availability, capacity, and pricing questions from a knowledge base, qualifies leads by collecting event type and headcount, and books site viewings directly into Google Calendar. An optional CRM integration captures qualified leads for your sales team.
Customer journey
A couple planning a wedding browses your site and uses Web Chat to ask about capacity and pricing. The agent quotes packages, books a viewing in Google Calendar, and can answer follow-ups. Some clients prefer to call to discuss bespoke layouts.
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)
- Inbound voice phone number and 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: "venue" });
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="venue")
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: "Venue inquiry agent",
system_prompt: "You qualify event leads, answer capacity and pricing questions, and book site viewings.",
});
console.log(workflow.id);workflow = client.workflows.create(
name="Venue inquiry agent",
system_prompt="You qualify event leads, answer capacity and pricing questions, and book site viewings.",
)
print(workflow.id)2. Create the agent
const agent = await bimpe.agents.create(
{
name: "Venue inquiry agent",
description: "Qualifies event leads, answers capacity and pricing questions, and books viewing appointments.",
workflow_id: workflow.id,
},
{ idempotencyKey: "create-venue-inquiry-agent-v1" },
);
console.log(agent.id);agent = client.agents.create(
name="Venue inquiry agent",
description="Qualifies event leads, answers capacity and pricing questions, and books viewing appointments.",
workflow_id=workflow.id,
idempotency_key="create-venue-inquiry-agent-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 venue's spaces and the pricing structure. The agent draws on both when answering detailed inquiries.
// Venue spaces and facilities
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Venue spaces",
content:
"Grand Hall — capacity 400 seated / 600 standing — full AV rig, stage, dance floor, in-house bar\n" +
"Garden Room — capacity 120 seated / 200 standing — floor-to-ceiling windows, terrace access\n" +
"Boardroom — capacity 20 seated — projector, video conferencing, natural daylight\n" +
"Outdoor Terrace — capacity 150 standing — covered, heated, suitable April–October\n\n" +
"Facilities: 4 dressing rooms, dedicated loading bay, 200-space car park (free), full catering kitchen.\n" +
"AV: in-house technician available for Grand Hall bookings. External AV for other spaces at client's cost.\n" +
"Accessibility: step-free access to all spaces, hearing loop in Grand Hall and Boardroom.",
});
// Pricing and packages
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Pricing",
content:
"Grand Hall — full day (08:00–00:00): £3,500 — half day (am or pm): £2,000\n" +
"Garden Room — full day: £1,200 — half day: £700\n" +
"Boardroom — full day: £450 — half day: £280 — per hour (min 2h): £80\n" +
"Outdoor Terrace — per session (4h): £600\n\n" +
"Catering: in-house only. Canapes from £18/head, three-course dinner from £55/head.\n" +
"Minimum spend applies for Saturday evening Grand Hall bookings: £8,000 total.\n" +
"A 30% non-refundable deposit is required to hold the date. Balance due 30 days before the event.\n" +
"Site viewings: free, weekdays 09:00–17:00, weekends by arrangement.",
});# Venue spaces and facilities
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Venue spaces",
"content": (
"Grand Hall — capacity 400 seated / 600 standing — full AV rig, stage, dance floor, in-house bar\n"
"Garden Room — capacity 120 seated / 200 standing — floor-to-ceiling windows, terrace access\n"
"Boardroom — capacity 20 seated — projector, video conferencing, natural daylight\n"
"Outdoor Terrace — capacity 150 standing — covered, heated, suitable April–October\n\n"
"Facilities: 4 dressing rooms, dedicated loading bay, 200-space car park (free), full catering kitchen.\n"
"AV: in-house technician available for Grand Hall bookings. External AV for other spaces at client's cost.\n"
"Accessibility: step-free access to all spaces, hearing loop in Grand Hall and Boardroom."
),
})
# Pricing and packages
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Pricing",
"content": (
"Grand Hall — full day (08:00–00:00): £3,500 — half day (am or pm): £2,000\n"
"Garden Room — full day: £1,200 — half day: £700\n"
"Boardroom — full day: £450 — half day: £280 — per hour (min 2h): £80\n"
"Outdoor Terrace — per session (4h): £600\n\n"
"Catering: in-house only. Canapes from £18/head, three-course dinner from £55/head.\n"
"Minimum spend applies for Saturday evening Grand Hall bookings: £8,000 total.\n"
"A 30% non-refundable deposit is required to hold the date. Balance due 30 days before the event.\n"
"Site viewings: free, weekdays 09:00–17:00, weekends by arrangement."
),
})4. Connect channels and integrations (dashboard)
Channels, Google Calendar, and your CRM are connected in the dashboard
The API cannot create channel connections, but integrations can now be configured through it; see Configuring integrations. Connect your web chat and voice channels on the Deploy screen and Google Calendar (and your CRM) 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 Web Chat Widget card to add the widget to your venue website.
- Under Voice, click Set up on the Telephony card — it is an add-on with usage-based pricing. Provision or link a number under Team settings → Phone numbers, then set the agent's voice and greeting under Settings → Voice.
- Open Integrations, find Google Calendar, and click Connect so the agent can check viewing slot availability and book appointments.
- Optionally, open Integrations, find your CRM connector, and click Connect so qualified leads are captured automatically.
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.
Connect Telephony (inbound)
Customers dial your published support or sales line.
- Open Deploy and click Set up on the Telephony card (usage-based add-on).
- Under Team settings → Phone numbers, provision or link a number and assign it to this agent.
- Under Settings → Voice, choose the voice profile and greeting callers hear.
- Share the published phone number — inbound calls route to the agent automatically.
Full reference: Deploying and testing channels.
5. Test your agent
Before going live, exercise the agent on the web chat test channel. Fetch the test code (created on first request), then inject a customer message from your server — or test the agent live in the Playground on the dashboard.
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.
Test Telephony (inbound)
Human tester: dial the linked phone number from a mobile phone and walk through the script.
Playground: use Playground → Voice to hear the agent before publishing the number.
Full reference: Deploying and testing channels.
await bimpe.agents.getTestCode(agent.id); // creates the test code on first request
await bimpe.conversations.send(agent.id, {
message: "Do you have space for a 150-person wedding reception in September?",
channel_type: "webchat",
channel_user_id: "<tester-id>",
is_test_channel: true,
});client.agents.get_test_code(agent.id) # creates the test code on first request
client.conversations.send(
agent.id,
message="Do you have space for a 150-person wedding reception in September?",
channel_type="webchat",
channel_user_id="<tester-id>",
is_test_channel=True,
)To exercise the phone path too, place a test call with bimpe.calls.make(agent.id, { destination, is_test_call: true }) (Python: client.calls.make(agent.id, {"destination": ..., "is_test_call": 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: "venue" });
const workflow = page.data[0];
// 2. Create agent
const agent = await bimpe.agents.create(
{
name: "Venue inquiry agent",
description: "Qualifies event leads, answers capacity and pricing questions, and books viewing appointments.",
workflow_id: workflow.id,
},
{ idempotencyKey: "create-venue-inquiry-agent-v1" },
);
// 3. Add knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Venue spaces",
content:
"Grand Hall — 400 seated / 600 standing — AV, stage, bar\n" +
"Garden Room — 120 seated / 200 standing — terrace access\n" +
"Boardroom — 20 seated — projector, video conferencing",
});
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Pricing",
content:
"Grand Hall full day: £3,500 / half day: £2,000\n" +
"Garden Room full day: £1,200 / half day: £700\n" +
"Boardroom full day: £450 / per hour: £80\n" +
"Deposit: 30% non-refundable to hold the date.",
});
// 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 web chat 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="venue")
workflow = page.data[0]
# 2. Create agent
agent = client.agents.create(
name="Venue inquiry agent",
description="Qualifies event leads, answers capacity and pricing questions, and books viewing appointments.",
workflow_id=workflow.id,
idempotency_key="create-venue-inquiry-agent-v1",
)
# 3. Add knowledge bases
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Venue spaces",
"content": (
"Grand Hall — 400 seated / 600 standing — AV, stage, bar\n"
"Garden Room — 120 seated / 200 standing — terrace access\n"
"Boardroom — 20 seated — projector, video conferencing"
),
})
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Pricing",
"content": (
"Grand Hall full day: £3,500 / half day: £2,000\n"
"Garden Room full day: £1,200 / half day: £700\n"
"Boardroom full day: £450 / per hour: £80\n"
"Deposit: 30% non-refundable to hold the date."
),
})
# 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 web chat 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 CRM appears in
integrations.listor is connected in the dashboard. - Verify Web Chat is connected on the Deploy screen (
agents.channels.listshows it enabled). - Verify Telephony (inbound) 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 appears in integrations.list — without it the agent cannot book viewings. Update pricing KB entries at the start of each year.
Variations
- Add a seasonal availability blackout section to the pricing knowledge base (e.g. Christmas party season minimum spend) so the agent quotes correctly for peak dates.
- Send a viewing confirmation message using
conversations.send(create-or-send by channel) once the calendar slot is booked. - Create separate agents for corporate and private event inquiries, each with a system prompt and pricing knowledge base tuned for that audience.
Catering & Event Orders Agent
Handle corporate and party catering inquiries — headcount-based pricing, dietary requirements, deposit collection via Stripe, and booking confirmation.
Fitness & Wellness Class Booking
Let members browse class schedules, view trainer profiles, choose a membership tier or pay per session, and book — over WhatsApp and web chat.