How to Build an AI Appointment Booking Agent in CogniAgent

Not every call about a service enquiry should end in a scheduled job. A lot of them should end in someone coming out to look at the property or site first, an estimate meeting, and that’s a narrower, safer thing to hand to a voice agent than the job itself. There’s no price to get wrong and no availability to promise, only a meeting to get on the calendar. This build stays inside that scope deliberately, and the configuration reflects it: one calendar action enabled, one job to do.

The architecture at a glance

A single actor, Scheduling Actor, answers the phone and books estimate meetings, nothing else. It collects a fixed set of contact and meeting details, summarizes them back, and asks for explicit confirmation before booking anything. Once the actor finishes, a Hook fires and creates the calendar event through a connected Google Calendar integration, where only the Create Event action is enabled. No availability check, and no rescheduling or cancellation; the actor’s instructions are written to match what the integration can do.

Step 1: Add the phone channel

Add Phone Number as the channel in Flow Settings, since this is where a prospective customer’s call comes in. Set Execution Mode to Responder.

To test over the phone without provisioning your own number, claim one from CogniAgent’s pool of shared test numbers. Ten are available, all US-based, one claim per workspace at a time. A claimed number is leased to your workspace for 24 hours, capped at 30 minutes of total call time, and inbound only; testing outbound calls needs your own Twilio number. Claim one from the Phone Numbers section, then call it directly to test the flow.

Step 2: Add the Scheduling Actor and its Context

Add an actor named Scheduling Actor. In Context, keep it short and factual: “You are the appointment-booking assistant for [Company Name], a professional service business serving [Service Area].” Context here has a 4,000-character limit, so there’s room to add more if a specific role needs it, but this actor doesn’t.

Under Inherit Context, check both Global flow context and Collected information so far, so the actor has access to whatever the rest of the flow already knows about the caller, not only what it collects itself.

Step 3: Scope the role tightly in Instructions

The most important line in this actor’s Instructions is the one that limits it: “Your only role is to book estimate meetings between prospective customers and the service team. You do not book jobs, calculate prices, reschedule appointments, cancel appointments, or provide detailed service advice.”

This isn’t a style choice; it matches what Step 8 connects. Only Create Event is enabled on the calendar integration, so an actor that offered to reschedule or check availability would be promising something no connected action can deliver. Write the Instructions to match the integration, not the other way around.

Step 4: Add the greeting

Add a ## Greeting section to Instructions: on the first spoken turn, say “Hello! Thank you for calling [Company Name]. How can I help you today?” If the caller has already explained what they need before that greeting finishes, acknowledge it afterward rather than asking them to repeat it. Keep responses short, warm, and conversational, and ask one question at a time; a voice call has no patience for a form read aloud.

Step 5: Add the information-required section

Add a ## Information required section: before creating the meeting, collect the customer’s full name, email address, phone number, requested meeting type, the general service they’re interested in, preferred meeting date and time, time zone, a property address if it’s an on-site meeting, and a short note about the enquiry.

State explicitly what the actor should never ask for: “Do not collect payment information, passwords, alarm codes, lockbox codes, or other sensitive information.” A caller volunteering a lockbox code unprompted is exactly the case this line exists for; the actor shouldn’t ask for it, and shouldn’t act on it if offered.

Step 6: Add the booking-process section

Add a ## Booking_process section: once the required information is collected, summarize meeting type, date, start time, time zone, duration, address or meeting method, and the customer’s name and email. Then ask directly: “Would you like me to submit this meeting request?”

This confirmation is the actual consent gate before anything gets created. Nothing in Step 9’s Hook should fire ahead of a clear yes here.

Step 7: Set Definition of Done, Model, and Focus Mode

Set Definition of Done: “A slot has been booked and confirmed with the customer, including service type, date, and time.” Set Model to Anthropic: Claude Sonnet 5. Set Focus Mode to Persistent, so a caller who drifts into unrelated questions gets steered back toward finishing the booking rather than the actor abandoning the task.

Step 8: Connect Google Calendar with only Create Event enabled

Open the actor’s Capabilities panel, go to Integrations, and add Google Calendar. Connect the account that should own these bookings. In the actions list, check only Create Event, and leave every other action unchecked, including anything related to availability, rescheduling, or cancellation. The panel notes that checked actions are abilities, not commands: the actor only reaches for one when a When to use note or its own Instructions call for it, or the caller asks for it directly. Leaving an action unchecked is what enforces the boundary Step 3 states in words.

If a second, legacy version of the Google Calendar integration is already connected alongside the newer one, confirm what it’s being used for before assuming it’s redundant; a Calendar List Get action enabled there, for instance, retrieves calendar metadata rather than booking anything, and might be doing something Step 3’s Instructions don’t mention at all, so it’s worth checking before removing it.

Step 9: Add the Book Calendar Slot hook

Go to Capabilities → Hooks and add a hook triggered on Actor completed, set to run once per conversation.

Name it Book calendar slot. Its underlying step is an Act action. In What should happen here?, write: “Book the appointment with the details collected, and send confirmation to the customer once they’ve chosen a time slot.” Reference the actual booking fields by name, for example the service type and chosen slot, so the action pulls from what the conversation collected rather than guessing.

Leave Definition of Done for this action empty; CogniAgent will infer it from the instruction above, and this action’s job is narrow enough that spelling it out further doesn’t add much. Leave Wait for the user to reply off. This step fires once the conversation is already done, right after the customer confirmed in Step 6, so there’s no reply left to wait for.

Step 10: Test representative calls

Call the flow through a shared test number and confirm: a complete request ends with an event created and the customer told it’s booked; a caller who states their need before the greeting finishes doesn’t get asked to repeat it; a caller with a missing or unclear email gets a short follow-up rather than a skipped field; an ambiguous date like “next Friday” gets confirmed against a specific calendar date before booking. Then confirm the boundary holds: a caller asking to reschedule an existing appointment, cancel one, or get a price quote gets a clear explanation that this line only books new estimate meetings, not an attempt to do any of those anyway.

Step 11: Deploy

Confirm the calendar integration is connected to the correct account, only Create Event is checked, and the hook’s toggle is on, before publishing the flow. A hook left off after testing is the kind of thing that passes every test conversation and then silently does nothing once it’s live.

What this saves the business

A caller asking about an estimate today either gets booked live if someone’s free to answer, or leaves a message and waits for a callback that might happen hours later, by which point they’ve often called someone else. This build books the meeting on the same call, with no window for the lead to go cold between the enquiry and the appointment landing on a calendar.

Keeping the scope this narrow is what makes that safe to automate. An agent that only creates a calendar event, and is only allowed to create one after the caller explicitly says yes, has a small enough job that there’s very little room for it to go wrong on a live call.

 

Other Guides