Catering & Event Orders Agent
Handle corporate and party catering inquiries — headcount-based pricing, dietary requirements, deposit collection via Stripe, and booking confirmation.
What you'll build
An agent that fields catering inquiries over web chat or inbound voice, calculates per-head pricing from headcount, gathers dietary requirements, checks availability via Google Calendar, and collects a deposit through Stripe — all before handing a confirmed booking to your team.
Customer journey
An event planner opens Web Chat on your catering site to ask about menus and headcount. The agent quotes from the pricing knowledge base, collects event details, and can take a deposit via Stripe. For large corporate events, they may call your inbound line to finalize details.
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, Stripe, and web chat channel connected in the Console dashboard (see Step 4)
- Inbound voice phone number 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: "catering" });
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="catering")
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: "Catering agent",
system_prompt: "You field catering inquiries, quote per-head pricing, gather dietary requirements, check availability, and collect a deposit.",
});
console.log(workflow.id);workflow = client.workflows.create(
name="Catering agent",
system_prompt="You field catering inquiries, quote per-head pricing, gather dietary requirements, check availability, and collect a deposit.",
)
print(workflow.id)2. Create the agent
const agent = await bimpe.agents.create(
{
name: "Catering agent",
description: "Fields catering inquiries, quotes per-head pricing, checks availability, and collects a deposit.",
workflow_id: workflow.id,
},
{ idempotencyKey: "create-catering-agent-v1" },
);
console.log(agent.id);agent = client.agents.create(
name="Catering agent",
description="Fields catering inquiries, quotes per-head pricing, checks availability, and collects a deposit.",
workflow_id=workflow.id,
idempotency_key="create-catering-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.
Three knowledge bases cover pricing, dietary options, and booking policy. The agent pulls from all three when building a quote.
// Per-head pricing tiers
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Catering pricing",
content:
"Essential tier (10–30 guests): £18 per head — 2 mains, 1 dessert, soft drinks\n" +
"Classic tier (10–80 guests): £26 per head — 3 mains, 2 desserts, tea/coffee\n" +
"Premium tier (10–200 guests): £38 per head — 4 mains, 3 desserts, welcome drink\n" +
"Minimum booking: 10 guests. Groups over 80 require 14 days notice.",
});
// Dietary options
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Dietary options",
content:
"All tiers include vegan and vegetarian options at no extra charge.\n" +
"Gluten-free alternatives available for all mains (+£2 per head).\n" +
"Nut-free kitchen available on request — declare at booking.",
});
// Booking policy
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Booking policy",
content:
"A 25% deposit is required to confirm the booking.\n" +
"Deposits are non-refundable within 7 days of the event.\n" +
"Final headcount must be confirmed 48 hours before the event.\n" +
"Payment in full is due 24 hours before the event.",
});# Per-head pricing tiers
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Catering pricing",
"content": (
"Essential tier (10–30 guests): £18 per head — 2 mains, 1 dessert, soft drinks\n"
"Classic tier (10–80 guests): £26 per head — 3 mains, 2 desserts, tea/coffee\n"
"Premium tier (10–200 guests): £38 per head — 4 mains, 3 desserts, welcome drink\n"
"Minimum booking: 10 guests. Groups over 80 require 14 days notice."
),
})
# Dietary options
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Dietary options",
"content": (
"All tiers include vegan and vegetarian options at no extra charge.\n"
"Gluten-free alternatives available for all mains (+£2 per head).\n"
"Nut-free kitchen available on request — declare at booking."
),
})
# Booking policy
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Booking policy",
"content": (
"A 25% deposit is required to confirm the booking.\n"
"Deposits are non-refundable within 7 days of the event.\n"
"Final headcount must be confirmed 48 hours before the event.\n"
"Payment in full is due 24 hours before the event."
),
})4. Connect channels and integrations (dashboard)
Channels and voice are connected in the dashboard; Google Calendar and Stripe on the Integrations screen
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 Web Chat Widget card to add the widget to your catering 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. The agent uses it to check real-time availability for event dates.
- Open Integrations, find Stripe, and click Connect. The agent uses it to collect the deposit at the end of the booking flow.
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: "Catering for 40 at a corporate lunch next Friday?",
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="Catering for 40 at a corporate lunch next Friday?",
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: "catering" });
const workflow = page.data[0];
// 2. Create agent
const agent = await bimpe.agents.create(
{
name: "Catering agent",
description: "Fields catering inquiries, quotes per-head pricing, checks availability, and collects a deposit.",
workflow_id: workflow.id,
},
{ idempotencyKey: "create-catering-agent-v1" },
);
// 3. Add knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Catering pricing",
content:
"Essential tier: £18 per head (10–30 guests)\n" +
"Classic tier: £26 per head (10–80 guests)\n" +
"Premium tier: £38 per head (10–200 guests)",
});
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Dietary options",
content:
"Vegan and vegetarian included. Gluten-free +£2 per head. Nut-free on request.",
});
await bimpe.agents.knowledgeBases.create(agent.id, {
type: "text",
name: "Booking policy",
content: "25% deposit required to confirm. Non-refundable within 7 days of event.",
});
// 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="catering")
workflow = page.data[0]
# 2. Create agent
agent = client.agents.create(
name="Catering agent",
description="Fields catering inquiries, quotes per-head pricing, checks availability, and collects a deposit.",
workflow_id=workflow.id,
idempotency_key="create-catering-agent-v1",
)
# 3. Add knowledge bases
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Catering pricing",
"content": (
"Essential tier: £18 per head (10–30 guests)\n"
"Classic tier: £26 per head (10–80 guests)\n"
"Premium tier: £38 per head (10–200 guests)"
),
})
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Dietary options",
"content": "Vegan and vegetarian included. Gluten-free +£2 per head. Nut-free on request.",
})
client.agents.knowledge_bases.create(agent.id, {
"type": "text",
"name": "Booking policy",
"content": "25% deposit required to confirm. Non-refundable within 7 days of event.",
})
# 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 Stripe 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 and Stripe appear in integrations.list before go-live. Update seasonal pricing via knowledgeBases.update.
Variations
- Send a booking confirmation message server-side using
conversations.send(create-or-send by channel) once the deposit clears. - Restrict the agent to corporate bookings of 20 or more guests by adding that constraint to the workflow's
system_prompt. - Add a seasonal menu knowledge base entry and swap it in quarterly without touching the agent configuration.
Booking with Stripe Payment
Let customers check availability, pick a slot, and pay via Stripe — all in a single WhatsApp or web chat conversation before the booking is confirmed.
Event Venue Inquiry Agent
Qualify event leads, answer capacity and pricing questions, and book viewing appointments — over inbound voice calls and web chat.