Use casesRecipes

Short-Stay Self Check-in Agent

Give Airbnb and short-let guests instant access to key codes, house rules, Wi-Fi details, and checkout reminders — no external APIs required.

DifficultyBeginner
TrackBuilder Track
ChannelsWhatsApp
IntegrationsProperty details (knowledge base)

What you'll build

An agent that guides short-stay guests through self check-in: key safe codes, door entry instructions, house rules, Wi-Fi credentials, appliance guides, and a checkout reminder. Everything is served from a knowledge base — no external APIs are required, making this the fastest recipe to deploy.

Customer journey

A guest receives a WhatsApp message before check-in with door code instructions. They reply with questions about Wi-Fi, parking, or early access; the agent answers from the property FAQ and escalates maintenance issues to the host.

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
  • WhatsApp Business 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: "check-in" });
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="check-in")
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: "Self check-in assistant",
  system_prompt: "You guide short-stay guests through self check-in, key codes, house rules, Wi-Fi details, and checkout reminders.",
});
console.log(workflow.id);
workflow = client.workflows.create(
    name="Self check-in assistant",
    system_prompt="You guide short-stay guests through self check-in, key codes, house rules, Wi-Fi details, and checkout reminders.",
)
print(workflow.id)

2. Create the agent

const agent = await bimpe.agents.create(
  {
    name: "Self check-in assistant",
    description: "Guides short-stay guests through self check-in, house rules, and checkout.",
    workflow_id: workflow.id,
  },
  { idempotencyKey: "create-self-checkin-agent-v1" },
);

console.log(agent.id);
agent = client.agents.create(
    name="Self check-in assistant",
    description="Guides short-stay guests through self check-in, house rules, and checkout.",
    workflow_id=workflow.id,
    idempotency_key="create-self-checkin-agent-v1",
)

print(agent.id)

3. Add the property knowledge base (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.

One knowledge base covers everything the guest needs for their stay. Update it whenever you change codes or rules — no agent reconfiguration required.

// All property details in a single knowledge base
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Property details",
  content:
    "ADDRESS: 14 Maple Street, Flat 3, London E1 6RF\n\n" +
    "ARRIVAL:\n" +
    "  Key safe is on the right of the front door, code: 4821.\n" +
    "  Flat 3 is on the second floor, turn left at the top of the stairs.\n" +
    "  Park in the bay marked '14' on Maple Street — free after 18:30 weekdays, all day weekends.\n\n" +
    "WI-FI:\n" +
    "  Network: MapleFlat3\n" +
    "  Password: sunny2026!\n\n" +
    "APPLIANCES:\n" +
    "  Boiler: press the red button on the right side to boost hot water (30-min boost).\n" +
    "  Washing machine: powder in the drawer on the left, programme 2 for a standard wash.\n" +
    "  Hob: turn the dial to the flame icon, then press and hold for 3 seconds to ignite.\n\n" +
    "HOUSE RULES:\n" +
    "  No smoking anywhere in the property.\n" +
    "  No parties or gatherings over 4 people.\n" +
    "  Quiet hours: 22:00–08:00.\n" +
    "  Bins: recycling (blue) and general waste (black) collected on Wednesday morning.\n\n" +
    "CHECKOUT:\n" +
    "  Checkout by 11:00. Strip the beds and leave towels in the bathroom.\n" +
    "  Return the key to the key safe and set the code back to 0000.\n" +
    "  Leave the heating on the frost setting (turn the dial to the snowflake icon).",
});
# All property details in a single knowledge base
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Property details",
    "content": (
        "ADDRESS: 14 Maple Street, Flat 3, London E1 6RF\n\n"
        "ARRIVAL:\n"
        "  Key safe is on the right of the front door, code: 4821.\n"
        "  Flat 3 is on the second floor, turn left at the top of the stairs.\n"
        "  Park in the bay marked '14' on Maple Street — free after 18:30 weekdays, all day weekends.\n\n"
        "WI-FI:\n"
        "  Network: MapleFlat3\n"
        "  Password: sunny2026!\n\n"
        "APPLIANCES:\n"
        "  Boiler: press the red button on the right side to boost hot water (30-min boost).\n"
        "  Washing machine: powder in the drawer on the left, programme 2 for a standard wash.\n"
        "  Hob: turn the dial to the flame icon, then press and hold for 3 seconds to ignite.\n\n"
        "HOUSE RULES:\n"
        "  No smoking anywhere in the property.\n"
        "  No parties or gatherings over 4 people.\n"
        "  Quiet hours: 22:00–08:00.\n"
        "  Bins: recycling (blue) and general waste (black) collected on Wednesday morning.\n\n"
        "CHECKOUT:\n"
        "  Checkout by 11:00. Strip the beds and leave towels in the bathroom.\n"
        "  Return the key to the key safe and set the code back to 0000.\n"
        "  Leave the heating on the frost setting (turn the dial to the snowflake icon)."
    ),
})

4. Connect the WhatsApp channel (dashboard)

WhatsApp is connected in the dashboard

The API cannot create channel connections. Connect your messaging channels on the Deploy 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. Share the WhatsApp link with guests in your booking confirmation email so they can message the agent on arrival.

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.

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.

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: "Hi, I've just arrived — what's the key safe code?",
  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="Hi, I've just arrived — what's the key safe code?",
    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

Verify the channel is connected before your first guest arrives:

const channels = await bimpe.agents.channels.list(agent.id);
console.log("Channels:", channels.map((c) => c.type));
channels = client.agents.channels.list(agent.id)
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: "check-in" });
const workflow = page.data[0];

// 2. Create agent
const agent = await bimpe.agents.create(
  {
    name: "Self check-in assistant",
    description: "Guides short-stay guests through self check-in, house rules, and checkout.",
    workflow_id: workflow.id,
  },
  { idempotencyKey: "create-self-checkin-agent-v1" },
);

// 3. Add property knowledge base
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Property details",
  content:
    "Key safe code: 4821 (reset to 0000 on departure).\n" +
    "Wi-Fi: MapleFlat3 / sunny2026!\n" +
    "Checkout: 11:00. Strip beds, leave towels in bathroom.",
});

// 4. Verify channel (configured via dashboard)
const channels = await bimpe.agents.channels.list(agent.id);
console.log("Agent ID:", agent.id);
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="check-in")
workflow = page.data[0]

# 2. Create agent
agent = client.agents.create(
    name="Self check-in assistant",
    description="Guides short-stay guests through self check-in, house rules, and checkout.",
    workflow_id=workflow.id,
    idempotency_key="create-self-checkin-agent-v1",
)

# 3. Add property knowledge base
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Property details",
    "content": (
        "Key safe code: 4821 (reset to 0000 on departure).\n"
        "Wi-Fi: MapleFlat3 / sunny2026!\n"
        "Checkout: 11:00. Strip beds, leave towels in bathroom."
    ),
})

# 4. Verify channel (configured via dashboard)
channels = client.agents.channels.list(agent.id)
print("Agent ID:", agent.id)
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 Property management system appears in integrations.list or is connected in the dashboard.
  • Confirm Smart lock API appears in integrations.list or is connected in the dashboard.
  • Verify WhatsApp 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

Send pre-arrival messages with conversations.send from a scheduled script. Update property FAQ when amenities change.

Variations

  • Manage multiple properties by creating one agent per property, each with its own knowledge base containing that property's specific codes and rules.
  • Add a local area section to the knowledge base with supermarket locations, takeaway recommendations, and the nearest bus stop.
  • Send a checkout reminder the morning of departure using conversations.send (create-or-send by channel) from a scheduled script, triggered by the booking end date.

On this page