Build an AI SDR chatbot without code
Copy page
Step-by-step tutorial to build a public chatbot that answers product and pricing questions from your knowledge base, then books a meeting in-chat the moment a visitor shows sales intent.
Overview
In this tutorial, you'll build a public-facing AI SDR chatbot in the Inkeep Visual Builder. It does two jobs in a single conversation — no handoff:
- Answers product and pricing questions grounded in your knowledge base, with citations.
- When a visitor shows sales intent — pricing, a demo, "talk to sales" — it shows a booking button that opens a Cal.com calendar so they can schedule a meeting without leaving the chat.
After they book, the agent confirms the meeting in-chat and keeps answering questions. One agent meets the visitor at the speed they expect: instant answers, and a booked meeting while the intent is still warm.
The agent logic is configured entirely in the Visual Builder (no code). The in-chat booking experience requires a small React component (~60 lines) to render the Cal.com calendar.
You'll need Inkeep to run this. The agent is built in the Inkeep Visual Builder, and the in-chat experience — the chat thread, citations, and the booking calendar — is rendered by the Inkeep embedded chat UI. Both require an Inkeep account. Get Inkeep →
Prerequisites
- An Inkeep account with access to the Visual Builder and embedded chat UI — schedule a demo if you don't have one yet.
- A docs-grounded assistant built from the Customer Assistant setup and Citations guides — a sub agent connected to Inkeep Unified Search that answers with citations. That's the Q&A foundation this tutorial extends.
- A Cal.com account with a bookable event type (e.g.
your-name/30min). - A React app where you'll embed the chat widget, with the Cal.com embed installed:
npm install @calcom/embed-react. See App Credentials for your App ID.
Create the sales-booking skill
A skill is a reusable instruction block you attach to a sub agent. Putting the booking SOP in a skill — rather than the agent prompt — keeps the trigger list and the acknowledge-then-book flow in one place. When you later add a second intent path, you drop in another skill instead of rewriting the prompt.
Go to the Skills tab in the left sidebar, then click Create skill.
Fill in:
- Name:
book-meeting-with-sales - Description: Paste the description below — the agent uses it to decide when the skill applies.
- Content: Paste the body below.
Click Save.
Description:
Content:
Swap the trigger examples for your own product's language. Keep the body shorter than your instinct says — the agent doesn't need ceremony, and an always-loaded skill sits in the prompt on every turn.
Create the scheduler data component
A data component lets the agent emit a structured UI block — here, the booking calendar — that your app renders. You'll define the schema now and wire up the React renderer later.
Go to the Data Components tab in the left sidebar, then select New data component.
Fill in:
- Name:
SalesScheduler(must match the key you'll register in your chat widget) - Description:
Renders a booking button that opens a Cal.com modal so the user can schedule a meeting. Just render it — the calendar is pre-configured.
Paste the schema below into the Props schema field, then click Save.
Props schema:
Teach the agent when to book
Your sub agent already answers from the knowledge base with citations. Now give it the one override that makes the booking flow fire: on a sales-intent turn, skip docs Q&A and surface the scheduler instead.
Open your agent canvas and click the sub agent to open its config.
Replace the Prompt with the version below.
Scroll to the Skills picker and add book-meeting-with-sales. Turn on Always loaded so the booking SOP is in every prompt without a load_skill round-trip.
Scroll to Data Components and add SalesScheduler.
Click Save Changes in the top right corner.
Prompt:
Replace [Your Product] with your product name. This prompt assumes you've already added the citation artifact from the Citations guide.
Render the scheduler and confirm the booking in your app
The agent emits a SalesScheduler component; your app renders it as a booking button that opens a Cal.com modal. After the visitor books, Cal.com fires a callback — you relay that back to the agent as a chat message so it can confirm the meeting. This is the interactive components pattern: a components map plus chatFunctionsRef to submit on the user's behalf.
Because SalesScheduler is rendered by the Inkeep widget — not your own React tree — it can't call chatFunctionsRef directly. So it dispatches a window-level inkeep-send-message event; your host component listens for that event and relays it via submitMessage.
First, register the component and listen for the booking relay in your chat settings:
Then build the scheduler component. It opens the Cal.com calendar in a modal and, on a successful booking, dispatches inkeep-send-message with the meeting details:
Replace YOUR_APP_ID with the App ID from your project's Apps settings (see App Credentials), and your-name/30min with your Cal.com event path.
The round-trip: the visitor books → Cal.com fires bookingSuccessfulV2 → your component dispatches inkeep-send-message → the listener calls submitMessage → the agent receives "I've just booked a meeting…" and confirms it, following step 3 of the skill.
Test the full flow
Click Try it in the top right corner of the Visual Builder. Ask a product question your docs cover — e.g. "What does the product do?". The agent searches the knowledge base and answers with citations. No scheduler.
Now show sales intent — "How much does it cost?" or "Can I get a demo?". The agent responds with a short acknowledgement and emits the SalesScheduler component.
In your embedded app, pick a time and book. Confirm the agent replies with a booking confirmation and offers to keep answering questions.
When working correctly, one agent carries the visitor from "what is this?" to a booked meeting and back to Q&A — all in the same thread, no human handoff.
Next steps
Add a second intent path — say, routing enterprise visitors to a different calendar or capturing a qualified lead — by dropping in another skill and a matching data component. The booking skill you built here is the template: trigger list, acknowledge-then-act SOP, one component to render. No prompt rewrite needed.
In-Product Copilot
Build a logged-in, account-aware copilot that diagnoses live account, integration, and usage state and resolves issues in-product — without escalating to a human.
Fact Finder Agent
Step-by-step tutorial to build a fact finder agent using the TypeScript SDK with web search and citations.