Use casesRecipes

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.

DifficultyIntermediate
TrackBuilder Track or Developer Track
ChannelsWhatsAppWeb Chat
IntegrationsGoogle Calendar (availability)Stripe (payment)

What you'll build

An agent that takes a customer from "I'd like to book" to "payment confirmed" without leaving the conversation. It checks real-time availability via Google Calendar, holds the slot while the customer pays via Stripe, and confirms the booking only after payment clears — preventing double-bookings on high-demand schedules.

Customer journey

A customer uses WhatsApp or Web Chat to book a workshop or session. The agent quotes pricing, holds a Google Calendar slot, generates a Stripe payment link, and confirms once payment clears.

Loading diagram…

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 and Stripe connected in the Console dashboard (see Step 4)
  • WhatsApp Business 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: "booking payment" });
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="booking payment")
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: "Booking and payment agent",
  system_prompt: "You take customers from booking request to confirmed payment, checking availability and holding the slot until Stripe payment clears.",
});
console.log(workflow.id);
workflow = client.workflows.create(
    name="Booking and payment agent",
    system_prompt="You take customers from booking request to confirmed payment, checking availability and holding the slot until Stripe payment clears.",
)
print(workflow.id)

2. Create the agent

const agent = await bimpe.agents.create(
  {
    name: "Booking and payment agent",
    description: "Handles bookings that require payment before confirmation.",
    workflow_id: workflow.id,
  },
  { idempotencyKey: "create-booking-payment-agent-v1" },
);

console.log(agent.id);
agent = client.agents.create(
    name="Booking and payment agent",
    description="Handles bookings that require payment before confirmation.",
    workflow_id=workflow.id,
    idempotency_key="create-booking-payment-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.

Add booking policy and pricing so the agent can quote accurately and handle cancellation questions without improvising.

// Pricing and service durations
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Service pricing",
  content:
    "Consultation (30 min): £75\n" +
    "Strategy session (60 min): £140\n" +
    "Full-day workshop (6 hours): £650\n" +
    "Group session (up to 5 people, 60 min): £200\n" +
    "All prices include VAT.",
});

// Booking and cancellation policy
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Booking policy",
  content:
    "Slots are held for 15 minutes after a payment link is sent. " +
    "If payment is not received within 15 minutes, the slot is released.\n" +
    "Full payment is required at the time of booking — no deposits.\n" +
    "Cancellations more than 48 hours before the appointment: full refund via Stripe.\n" +
    "Cancellations within 48 hours: 50% refund.\n" +
    "No-shows: no refund.\n" +
    "Reschedules are free if requested at least 24 hours in advance.",
});
# Pricing and service durations
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Service pricing",
    "content": (
        "Consultation (30 min): £75\n"
        "Strategy session (60 min): £140\n"
        "Full-day workshop (6 hours): £650\n"
        "Group session (up to 5 people, 60 min): £200\n"
        "All prices include VAT."
    ),
})

# Booking and cancellation policy
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Booking policy",
    "content": (
        "Slots are held for 15 minutes after a payment link is sent. "
        "If payment is not received within 15 minutes, the slot is released.\n"
        "Full payment is required at the time of booking — no deposits.\n"
        "Cancellations more than 48 hours before the appointment: full refund via Stripe.\n"
        "Cancellations within 48 hours: 50% refund.\n"
        "No-shows: no refund.\n"
        "Reschedules are free if requested at least 24 hours in advance."
    ),
})

4. Connect channels and integrations (dashboard)

Google Calendar, Stripe, and channels are configured 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.

  1. In the Console dashboard, pick your agent from the switcher at the top, then open Deploy.
  2. Under Messaging & Chat, click Connect on the WhatsApp card and follow the prompts to link your WhatsApp Business number.
  3. Under Messaging & Chat, click Connect on the Web Chat Widget card to add the widget to your booking page.
  4. Open Integrations, find Google Calendar, and click Connect. The agent checks availability and creates events on confirmed bookings.
  5. Open Integrations, find Stripe, and click Connect. The agent retrieves payment links and listens for payment confirmation.

Connect WhatsApp

Customers message your WhatsApp Business number for support and transactions.

  1. Open the Deploy screen in the Console dashboard and select your agent.
  2. Under Messaging & Chat, click Connect on the WhatsApp card.
  3. Follow the prompts to link your WhatsApp Business number.
  4. 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.

  1. Open Deploy and select your agent.
  2. Under Messaging & Chat, click Connect on the Web Chat Widget card.
  3. Copy the embed snippet and paste it into your site's HTML before the closing body tag.
  4. 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: "Can I book a 60-minute strategy session for Thursday afternoon?",
  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="Can I book a 60-minute strategy session for Thursday afternoon?",
    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. 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: "booking payment" });
const workflow = page.data[0];

// 2. Create agent
const agent = await bimpe.agents.create(
  {
    name: "Booking and payment agent",
    description: "Handles bookings that require payment before confirmation.",
    workflow_id: workflow.id,
  },
  { idempotencyKey: "create-booking-payment-agent-v1" },
);

// 3. Add knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Service pricing",
  content:
    "Consultation (30 min): £75. Strategy session (60 min): £140.\n" +
    "Full-day workshop: £650. Group session (up to 5): £200. All prices include VAT.",
});

await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Booking policy",
  content:
    "Slot held 15 minutes after payment link sent. Full payment required at booking.\n" +
    "Cancellations >48 hours: full refund. Within 48 hours: 50% refund. No-shows: no refund.\n" +
    "Reschedules free if requested 24 hours in advance.",
});

// 4. Verify integrations (Google Calendar + Stripe must be connected in 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 WhatsApp booking conversations
const controller = new AbortController();
const conversations = await bimpe.conversations.list(agent.id, { channel: "whatsapp" });
const conv = conversations.data[0];

if (conv) {
  for await (const event of bimpe.conversations.messages.stream(agent.id, conv.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="booking payment")
workflow = page.data[0]

# 2. Create agent
agent = client.agents.create(
    name="Booking and payment agent",
    description="Handles bookings that require payment before confirmation.",
    workflow_id=workflow.id,
    idempotency_key="create-booking-payment-agent-v1",
)

# 3. Add knowledge bases
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Service pricing",
    "content": (
        "Consultation (30 min): £75. Strategy session (60 min): £140.\n"
        "Full-day workshop: £650. Group session (up to 5): £200. All prices include VAT."
    ),
})

client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Booking policy",
    "content": (
        "Slot held 15 minutes after payment link sent. Full payment required at booking.\n"
        "Cancellations >48 hours: full refund. Within 48 hours: 50% refund. No-shows: no refund.\n"
        "Reschedules free if requested 24 hours in advance."
    ),
})

# 4. Verify integrations (Google Calendar + Stripe must be connected in 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 WhatsApp booking conversations
conversations = client.conversations.list(agent.id, channel="whatsapp")
if conversations.data:
    conv = conversations.data[0]
    for msg in client.conversations.messages.stream(agent.id, conv.id):
        print(msg.role, msg.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.list or is connected in the dashboard.
  • Confirm Stripe appears in integrations.list or is connected in the dashboard.
  • Verify WhatsApp is connected on the Deploy screen (agents.channels.list shows it enabled).
  • Verify Web Chat is connected on the Deploy screen (agents.channels.list shows it enabled).
  • Set Escalation Email under Settings → Agent if humans must take over.
  • Switch the agent to live with updateLiveStatus / update_live_status.
  • Monitor the Conversations screen (or stream via SDK) after launch.

After go-live

Both Google Calendar and Stripe must appear in integrations.list — missing Stripe means payment links never generate.

Variations

  • Add a group booking knowledge base entry with capacity rules so the agent can offer group sessions and enforce the five-person maximum automatically.
  • Use conversations.send (create-or-send by channel) to deliver a booking confirmation summary after Stripe confirms payment.
  • Extend cancellation handling by adding a knowledge base entry with your refund processing timeline and pointing the agent to it when customers ask about their refund status.

On this page