Use casesRecipes

Photography Session Booking

Let clients browse packages, pick a location, schedule a session, and pay a deposit — across WhatsApp, Instagram, and web chat.

DifficultyBeginner
TrackBuilder Track
ChannelsWhatsAppInstagramWeb Chat
IntegrationsGoogle Calendar (scheduling)Stripe (deposit)Packages (knowledge base)

What you'll build

An agent that guides clients through booking a photography session: package browsing, location selection, schedule checking via Google Calendar, and deposit collection via Stripe. The agent handles all pre-booking questions from a knowledge base so you spend your time behind the camera, not the inbox.

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, 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: "photography" });
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="photography")
workflow = page.data[0]
print(workflow.id, workflow.name)

2. Create the agent

const agent = await bimpe.agents.create(
  {
    name: "Photography booking agent",
    system_prompt:
      "You help clients book photography sessions. " +
      "Describe packages, locations, and what to expect on the day from the knowledge base. " +
      "Collect the client's preferred package, location, session date, and number of people. " +
      "Check availability via the Google Calendar integration. " +
      "Once a date is confirmed, direct the client to pay the deposit via Stripe to secure the booking.",
    agent_workflow_id: workflow.id,
  },
  { idempotencyKey: "create-photography-booking-agent-v1" },
);

console.log(agent.id);
agent = client.agents.create(
    name="Photography booking agent",
    system_prompt=(
        "You help clients book photography sessions. "
        "Describe packages, locations, and what to expect on the day from the knowledge base. "
        "Collect the client's preferred package, location, session date, and number of people. "
        "Check availability via the Google Calendar integration. "
        "Once a date is confirmed, direct the client to pay the deposit via Stripe to secure the booking."
    ),
    agent_workflow_id=workflow.id,
    idempotency_key="create-photography-booking-agent-v1",
)

print(agent.id)

3. Add knowledge bases

Two knowledge bases cover the session packages and the available shoot locations. The agent draws on both to answer client questions before booking.

// Session packages
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Packages",
  content:
    "MINI SESSION — £150 — 30 min — 1 location — 10 edited digital images delivered in 7 days\n" +
    "STANDARD SESSION — £280 — 60 min — 1–2 locations — 25 edited digital images delivered in 7 days\n" +
    "PREMIUM SESSION — £450 — 90 min — up to 3 locations — 50 edited digital images + 1 printed 30x40cm canvas — delivered in 5 days\n" +
    "FAMILY PORTRAIT — £320 — 60 min — 1 location — up to 6 people — 30 edited digital images — delivered in 7 days\n\n" +
    "All packages include: online gallery for download, print-release licence, pre-shoot style consultation.\n" +
    "Deposit: 30% of package price required to secure the date. Balance due on the day of the shoot.\n" +
    "Rescheduling: free up to 72 hours before the session. Within 72 hours a rescheduling fee of £30 applies.\n" +
    "Cancellation: deposit is non-refundable if cancelled within 14 days of the session.",
});

// Shoot locations
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Locations",
  content:
    "URBAN STREETS (East London) — industrial backdrop, brick walls, neon signs — suitable year-round\n" +
    "BOTANICAL GARDENS (Kew, SW London) — lush greenery, glasshouses, open lawns — best spring/summer\n" +
    "CLIFFSIDE (Brighton, 60 min from London) — dramatic coastal views — best April–September\n" +
    "IN-STUDIO (Shoreditch, E1) — controlled lighting, seamless backdrops, props available — year-round\n\n" +
    "Travel: sessions within 10 miles of Central London included. Beyond 10 miles a £0.45/mile travel fee applies.\n" +
    "Brighton sessions include a £35 travel supplement.",
});
# Session packages
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Packages",
    "content": (
        "MINI SESSION — £150 — 30 min — 1 location — 10 edited digital images delivered in 7 days\n"
        "STANDARD SESSION — £280 — 60 min — 1–2 locations — 25 edited digital images delivered in 7 days\n"
        "PREMIUM SESSION — £450 — 90 min — up to 3 locations — 50 edited digital images + 1 printed 30x40cm canvas — delivered in 5 days\n"
        "FAMILY PORTRAIT — £320 — 60 min — 1 location — up to 6 people — 30 edited digital images — delivered in 7 days\n\n"
        "All packages include: online gallery for download, print-release licence, pre-shoot style consultation.\n"
        "Deposit: 30% of package price required to secure the date. Balance due on the day of the shoot.\n"
        "Rescheduling: free up to 72 hours before the session. Within 72 hours a rescheduling fee of £30 applies.\n"
        "Cancellation: deposit is non-refundable if cancelled within 14 days of the session."
    ),
})

# Shoot locations
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Locations",
    "content": (
        "URBAN STREETS (East London) — industrial backdrop, brick walls, neon signs — suitable year-round\n"
        "BOTANICAL GARDENS (Kew, SW London) — lush greenery, glasshouses, open lawns — best spring/summer\n"
        "CLIFFSIDE (Brighton, 60 min from London) — dramatic coastal views — best April–September\n"
        "IN-STUDIO (Shoreditch, E1) — controlled lighting, seamless backdrops, props available — year-round\n\n"
        "Travel: sessions within 10 miles of Central London included. Beyond 10 miles a £0.45/mile travel fee applies.\n"
        "Brighton sessions include a £35 travel supplement."
    ),
})

4. Connect channels and integrations (dashboard)

Google Calendar, Stripe, and channels are configured in the dashboard

The API cannot create integrations or channel connections. Connect Google Calendar, Stripe, and your messaging channels in the Console dashboard. The SDK lets you list what is active but cannot modify the connections.

  1. Open Console dashboardAgents → select your agent.
  2. Under Channels, connect your WhatsApp Business number.
  3. Under Channels, connect your Instagram business account.
  4. Under Channels, enable the web chat widget and paste the embed snippet into your photography website or portfolio.
  5. Under Integrations, connect Google Calendar to check shoot date availability.
  6. Under Integrations, connect Stripe to collect the 30% deposit that secures the booking.

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: "photography" });
const workflow = page.data[0];

// 2. Create agent
const agent = await bimpe.agents.create(
  {
    name: "Photography booking agent",
    system_prompt:
      "You help clients book photography sessions. Describe packages and locations, check calendar " +
      "availability, and direct clients to pay the 30% deposit via Stripe to confirm.",
    agent_workflow_id: workflow.id,
  },
  { idempotencyKey: "create-photography-booking-agent-v1" },
);

// 3. Add knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Packages",
  content:
    "Mini Session — £150 — 30 min — 10 images\n" +
    "Standard Session — £280 — 60 min — 25 images\n" +
    "Premium Session — £450 — 90 min — 50 images + canvas print\n" +
    "Deposit: 30% required to secure the date.",
});

await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Locations",
  content:
    "Urban Streets (East London) — year-round\n" +
    "Botanical Gardens (Kew) — best spring/summer\n" +
    "In-Studio (Shoreditch) — year-round, controlled lighting",
});

// 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="photography")
workflow = page.data[0]

# 2. Create agent
agent = client.agents.create(
    name="Photography booking agent",
    system_prompt=(
        "You help clients book photography sessions. Describe packages and locations, check calendar "
        "availability, and direct clients to pay the 30% deposit via Stripe to confirm."
    ),
    agent_workflow_id=workflow.id,
    idempotency_key="create-photography-booking-agent-v1",
)

# 3. Add knowledge bases
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Packages",
    "content": (
        "Mini Session — £150 — 30 min — 10 images\n"
        "Standard Session — £280 — 60 min — 25 images\n"
        "Premium Session — £450 — 90 min — 50 images + canvas print\n"
        "Deposit: 30% required to secure the date."
    ),
})

client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Locations",
    "content": (
        "Urban Streets (East London) — year-round\n"
        "Botanical Gardens (Kew) — best spring/summer\n"
        "In-Studio (Shoreditch) — year-round, controlled lighting"
    ),
})

# 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 that both Google Calendar and Stripe appear in integrations.list before opening bookings — an unconnected Stripe means the deposit step will fail. Update the packages knowledge base whenever pricing changes using knowledgeBases.update. Use a stable idempotencyKey to prevent duplicate agents on redeploy.

Variations

  • Add a seasonal promotions knowledge base entry (e.g. a Christmas mini session offer) and update it around the relevant period.
  • Add a FAQ knowledge base covering what to wear, how to prepare children for a shoot, and image delivery timelines.
  • Send a session preparation guide to the client's WhatsApp or Instagram the day before using conversations.messages.send from a scheduled script.

On this page