Use casesRecipes

Product Recommendation Agent

Deliver personalised product suggestions through web chat or WhatsApp by grounding the agent in your product catalogue knowledge base.

DifficultyIntermediate
TrackDeveloper Track
ChannelsWeb ChatWhatsApp
IntegrationsProduct catalogue (knowledge base)CRM (optional)

What you'll build

An agent that learns what a customer is looking for and surfaces relevant products from your catalogue, with optional CRM context to personalise suggestions based on purchase history.

Customer journey

A visitor on your site opens Web Chat or WhatsApp asking for gift ideas. The agent asks about budget and recipient, recommends products from the catalogue KB, and can deep-link to product pages or hand off to checkout.

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
  • A product catalogue accessible as a URL or structured text
  • (Optional) CRM integration connected in the Console dashboard

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: "product recommendation" });
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="product recommendation")
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: "Product recommender",
  system_prompt: "You recommend relevant products from the catalogue based on each customer's needs and budget.",
});
console.log(workflow.id);
workflow = client.workflows.create(
    name="Product recommender",
    system_prompt="You recommend relevant products from the catalogue based on each customer's needs and budget.",
)
print(workflow.id)

2. Create the agent

const agent = await bimpe.agents.create(
  {
    name: "Product recommender",
    description: "Recommends products from the catalogue based on customer needs.",
    workflow_id: workflow.id,
  },
  { idempotencyKey: "create-recommender-agent-v1" },
);

console.log(agent.id);
agent = client.agents.create(
    name="Product recommender",
    description="Recommends products from the catalogue based on customer needs.",
    workflow_id=workflow.id,
    idempotency_key="create-recommender-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.

Index your product catalogue. A url source is ideal if your catalogue is kept up to date at a stable endpoint; use text for a static export. Add a second entry for recommendation rules so the agent applies consistent logic.

// Live catalogue
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "url",
  name: "Product catalogue",
  url: "https://example.com/catalogue.json",
});

// Recommendation rules
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Recommendation rules",
  content:
    "Always surface 2-3 options across different price points.\n" +
    "Highlight the best-value option.\n" +
    "Do not recommend items marked Out of stock.\n" +
    "If budget is under £50, focus on the budget range first.",
});
# Live catalogue
client.agents.knowledge_bases.create(agent.id, {
    "type": "url",
    "name": "Product catalogue",
    "url": "https://example.com/catalogue.json",
})

# Recommendation rules
client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Recommendation rules",
    "content": (
        "Always surface 2-3 options across different price points.\n"
        "Highlight the best-value option.\n"
        "Do not recommend items marked Out of stock.\n"
        "If budget is under £50, focus on the budget range first."
    ),
})

4. Connect channels and integrations (dashboard)

Channels 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 messaging channels on the Deploy screen and your CRM 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 Web Chat Widget card to add the widget to your storefront.
  3. Under Messaging & Chat, click Connect on the WhatsApp card and follow the prompts to link your WhatsApp Business number.
  4. (Optional) Open Integrations, find your CRM, and click Connect so the agent can personalise based on purchase history.

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: "Looking for a gift under £50 for someone who loves coffee — any ideas?",
  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="Looking for a gift under £50 for someone who loves coffee — any ideas?",
    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. Verify channels and go live

List the connected channels to confirm setup before directing traffic to the agent. The conversation flows live on the workflow, so inspect them with workflows.retrieve(workflow.id).flows if you need to review them.

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

// 2. Create agent
const agent = await bimpe.agents.create(
  {
    name: "Product recommender",
    description: "Recommends products from the catalogue based on customer needs.",
    workflow_id: workflow.id,
  },
  { idempotencyKey: "create-recommender-agent-v1" },
);

// 3. Add catalogue and rules knowledge bases
await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "url",
  name: "Product catalogue",
  url: "https://example.com/catalogue.json",
});

await bimpe.agents.knowledgeBases.create(agent.id, {
  type: "text",
  name: "Recommendation rules",
  content:
    "Always surface 2-3 options across different price points.\n" +
    "Highlight the best-value option.\n" +
    "Do not recommend items marked Out of stock.",
});

// 4. Verify connected channels (configured in the 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 an active 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="product recommendation")
workflow = page.data[0]

# 2. Create agent
agent = client.agents.create(
    name="Product recommender",
    description="Recommends products from the catalogue based on customer needs.",
    workflow_id=workflow.id,
    idempotency_key="create-recommender-agent-v1",
)

# 3. Add catalogue and rules knowledge bases
client.agents.knowledge_bases.create(agent.id, {
    "type": "url",
    "name": "Product catalogue",
    "url": "https://example.com/catalogue.json",
})

client.agents.knowledge_bases.create(agent.id, {
    "type": "text",
    "name": "Recommendation rules",
    "content": (
        "Always surface 2-3 options across different price points.\n"
        "Highlight the best-value option.\n"
        "Do not recommend items marked Out of stock."
    ),
})

# 4. Verify connected channels (configured in the 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 an active 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 Product catalogue 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).
  • 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

Keep catalogue KB in sync with inventory. Narrow recommendations by category via system_prompt if needed.

Variations

  • Add a seasonal knowledge base entry (e.g. "Summer picks 2026") and update it each season.
  • Restrict recommendations to a price range by adding the constraint to the workflow's system_prompt (e.g. "Only recommend items under £100 unless the customer asks for premium options").
  • Connect a CRM integration in the dashboard to let the agent reference past orders and avoid repeating previous purchases.

On this page