Recipe 11.2: Appointment Scheduling Bot
Complexity: Simple-Medium ยท Phase: Quick-win to Foundational ยท Estimated Cost: ~$0.02-0.10 per completed booking (depends on conversation length, model choice, and back-end integration overhead)
The Problem
Marcus is a 47-year-old patient who needs to follow up with his cardiologist after a stress test. His cardiologist's office sent him a postcard. The postcard says "please call to schedule your follow-up." It is 7:43 PM on a Wednesday. Marcus is finally home, finally has a minute, and would like to get this over with. He pulls up the practice's website on his phone and sees the same "Schedule Online" button he has clicked before.
The Schedule Online flow opens a calendar widget. The widget asks him to choose a provider. He picks his cardiologist. The widget says "no available appointments." He removes the provider filter, hoping to see anything at all. The widget shows him appointments two months out with a different cardiologist he has never met. He picks one tentatively, gets to step 4 of 6, and the form asks him for his insurance plan from a dropdown. He picks "Aetna PPO." The form rejects this and says he needs to call the office to verify his insurance. Marcus closes the tab.
He calls the next morning during his lunch break. The phone tree says the call volume is high and the wait time is 18 minutes. He puts the phone on speaker, balances it on his desk, and tries to keep working. After 14 minutes, a scheduler picks up. She asks his name, his date of birth, his insurance, the reason for the visit, and which provider. She asks if he is flexible on day or time. He says he can do early mornings or after 4 PM. She finds him a slot four weeks out at 4:30 PM with his cardiologist. She reads it back. He confirms. She tells him to expect a confirmation text. The whole call took twenty-two minutes from when he started waiting on hold.
This is appointment scheduling in healthcare, and it is one of the most expensive, most demoralizing, most patient-hostile workflows that the industry runs at scale. The cost of a single scheduling phone call has been estimated at somewhere between $5 and $15 in fully-loaded scheduler time, and a mid-sized health system runs millions of these per year. The patient experience is roughly what Marcus had: a self-service path that almost works, a phone path that works but takes twenty minutes during the patient's workday, and a constant low-grade friction that erodes loyalty over time.
The frustrating part is that scheduling is, conceptually, one of the simplest interactions in healthcare. There is a person who needs an appointment. There is a calendar with slots. The interaction's job is to match the person to a slot. There is no clinical judgment. There is no record of what is medically wrong with the patient that needs to be analyzed. The success criterion is unambiguous: at the end of the interaction, either there is an appointment on the calendar or the patient has agreed to a call-back from a human. The hard parts are not clinical. They are the rules: provider preference, location preference, insurance constraints, visit-type duration, follow-up versus new-patient, blocked time on the schedule for surgery or for paperwork or for the doctor's mother-in-law's birthday, the sixteen different special cases in the practice's own scheduling protocol that the schedulers have memorized but that no patient knows about.
The previous generation of online scheduling tools struggled with this complexity by exposing it. The patient was asked to fill out a form that surfaced every constraint as a field: provider, location, visit type, insurance, reason for visit, preferred day, preferred time. The patient did not know what visit type to pick. The patient did not know whether their insurance was accepted at the location they preferred. The patient did not know whether the provider was accepting new patients. So the patient picked the wrong combination, hit a "no available appointments" wall, picked something else, and either eventually got through or gave up and called.
The previous-generation tools that tried a more guided experience used button-tree chatbots. Same failure mode as the FAQ bots from recipe 11.1: the chatbot offered five buttons; none of the buttons matched what the patient wanted; the patient typed something in their own words; the chatbot responded with the same five buttons. The chatbot achieved a high "containment rate" by frustrating the patient into giving up before the system had to do anything hard.
The modern conversational scheduling bot looks like this. The patient says, in plain English, "I need to follow up with Dr. Patel after my stress test, ideally early morning or after 4 PM, and I have Aetna PPO." The bot responds, "Got it. I see Dr. Patel has openings on Tuesday May 28 at 7:30 AM and Thursday June 6 at 4:45 PM. Both are at the Riverside Cardiology office on Main Street. Either work?" The patient picks one. The bot says, "Booked. You'll get a confirmation text shortly. Anything else?" The interaction took ninety seconds. Marcus finishes booking from his couch at 7:43 PM on a Wednesday, while the children are watching a cartoon in the next room.
That is the recipe in this section. Conversational appointment scheduling that actually completes the booking, integrates with the institution's scheduling system, respects the institution's business rules, and gracefully hands off to a human when the patient's request does not fit. It is the most common transactional conversational AI use case in healthcare, the one that delivers the most operational savings per deployed bot, and the one where the difference between a well-built bot and a poorly-built bot is the difference between Marcus's twenty-two-minute phone call and his ninety-second chat.
A few things this recipe is and is not.
It is the bot that books the kind of appointment Marcus needs: a follow-up with an established provider, a routine new-patient visit, a wellness exam, a lab draw, an imaging appointment, a routine specialty referral. It handles rescheduling and cancellation through the same interface. It integrates with the institution's scheduling system through the system's APIs and respects the rules the practice operations team has codified.
It is not the symptom checker from recipe 11.6. Scheduling is administrative. Triage is clinical. The scheduling bot can ask "what's the reason for the visit?" to route the patient to the right visit type and (sometimes) to flag situations that should not be self-scheduled, but it does not assess clinical urgency or recommend whether the patient should be seen.
It is not the FAQ bot from recipe 11.1. The FAQ bot answers questions and points to resources; it does not take actions on the patient's account. The scheduling bot takes actions: it puts something on the calendar, it changes the calendar, or it removes something from the calendar. The transactional success criterion makes the engineering and operational profile different from the FAQ bot, even when they share a chat surface.
It is not the universal scheduling system. The scheduling bot operates inside the constraints of the institution's existing scheduling system, which has its own data model, its own business rules, and its own quirks. The bot's job is to be a better front end to that system, not to replace it. Most of the integration complexity in this recipe lives at the boundary between the conversational layer and the institution's scheduling system.
The thing to understand before building this is that the bot's quality is bounded above by the underlying scheduling system. A bot that exposes a confusingly-configured scheduling system to patients in plain English is a bot that lets patients book the wrong appointments more efficiently. The institutional discipline of cleaning up visit-type definitions, provider preferences, insurance acceptance rules, and slot-template configurations is the prerequisite that nobody talks about. Without it, the scheduling bot is the digital front end to a mess.
Let's get into it.
The Technology: Tool-Using Conversational AI Plus the Healthcare Scheduling Reality
Why the Old Online Scheduling Tools Felt Hostile
The first generation of patient-facing online scheduling, roughly 2010 through the early 2020s, was a form. The form had a field for provider, a field for location, a field for visit type, a field for insurance, a field for the patient's preferred day. The patient filled out the form. The system queried the schedule with those filters and showed whatever slots came back. If the filters did not match available slots, the system showed "no appointments available."
This produced a specific failure mode that anyone who has tried to schedule online will recognize. The patient is fundamentally guessing about what the system wants. They do not know the institution's visit-type taxonomy. They do not know whether "follow-up cardiology" or "established patient cardiology" or "post-procedure cardiology follow-up" is the right pick for their post-stress-test follow-up. So they pick something, get no results, pick something else, get different results, eventually find one available slot, and book it without knowing whether they have booked the right type of appointment. The schedulers later have to clean up the mis-bookings, often by calling the patient back to reschedule. The "self-service" channel produced more downstream work, not less.
The button-tree chatbot that appeared on top of this same scheduling system in the late 2010s did not fix the underlying problem. It hid the form behind a sequence of buttons, but the buttons had to map to the same fields the form had. The patient was still guessing about the institution's visit-type taxonomy; they were just guessing one button at a time. The bot's "natural language" was a thin veneer over a rigid form.
The thing that did work, eventually, was tool-using LLMs. The shift was architectural. Instead of the bot navigating the patient through the institution's scheduling-form taxonomy, the bot understands the patient's request in natural language, translates it into a structured query against the scheduling system, and renders the response back into natural language. The patient says "I need to follow up with Dr. Patel after my stress test, early morning or after 4 PM, Aetna PPO." The bot extracts the intent (follow-up appointment), the provider (Dr. Patel), the visit-type clue (post-stress-test follow-up, which the bot maps to the institution's "cardiology established patient follow-up" visit type), the time-window preferences (early morning, after 4 PM), the insurance (Aetna PPO), and possibly the urgency. It calls the scheduling system's slot-search API with those parameters. The slot-search API returns available slots. The bot picks the two or three best matches and renders them in plain English. The patient picks one. The bot calls the scheduling system's booking API. Done.
The architectural pattern, which the rest of this section will walk through, is conversational tool use. The conversational layer is a thin natural-language interface to a small, well-defined set of tools (slot-search, slot-hold, slot-book, slot-cancel, slot-reschedule, patient-lookup, sometimes insurance-eligibility-check). The LLM decides which tool to call when, with what arguments, given the patient's request. The tools execute against the institution's scheduling system. The LLM composes the response from the tool's output.
What Tool-Using LLMs Actually Do
The chapter preface introduced tool use generically. For an appointment scheduling bot, the pattern decomposes into a few specific tools, each with a well-defined input schema and output schema. The LLM is responsible for the conversation; the tools are responsible for the actions.
Patient identification. Before the bot can do anything that affects a specific patient's record, it needs to know which patient it is talking to. The patient identification tool takes some combination of the patient's stated name, date of birth, phone number, email, and (where the patient is logged into the patient portal) their authenticated patient ID. It returns either a matched patient identifier with a confidence score or a "not matched, need more information" signal.
Slot search. Given a set of search parameters (provider, location, visit type, time-window preference, insurance, patient identifier), the slot-search tool queries the scheduling system and returns a ranked list of available slots. The ranking encodes the institution's preferences: prefer slots with the patient's established provider over slots with other providers, prefer slots that satisfy more of the patient's preferences, prefer slots that are sooner (or later, depending on the visit type's clinical guidance), prefer slots at locations the patient has previously visited.
Slot hold. A short-term hold (typically a few minutes) on a specific slot, so that the bot can offer the slot to the patient and the patient can confirm without the slot being grabbed by a competing booking attempt. The hold expires automatically if the booking is not completed.
Slot book. Convert the held slot into a confirmed appointment. The booking tool writes to the scheduling system, creates the patient-facing confirmation, triggers the institution's standard notification workflow (confirmation text or email, calendar attachment, pre-visit instructions), and returns the confirmation details.
Slot reschedule. Move an existing appointment to a new slot. Functionally, this is a coordinated cancel-and-book operation, but the institution often wants it logged as a reschedule rather than as separate cancel and book events for analytics and patient-experience reasons. The reschedule tool handles this as a single operation.
Slot cancel. Cancel an existing appointment. The cancel tool writes the cancellation, triggers the standard notification workflow, and (when applicable) flags the slot for re-offering through the institution's wait-list mechanism.
Eligibility check (optional). Verify the patient's insurance eligibility for the proposed appointment. Many institutions check eligibility either at booking time (some do) or at a later batch process (most do). The eligibility check tool, when present, calls the institution's eligibility verification API and returns either "eligible," "not eligible, here is the reason," or "could not verify, here is the workaround."
Patient communication preferences (optional). Some institutions allow patients to update their notification preferences (text vs. email, language preference, opt-in for reminders) through the conversational interface. A small set of preference-management tools handles these.
A scheduling bot is, architecturally, an LLM with a system prompt that tells it what scheduling assistant it is, a conversation history of the patient's chat so far, and access to those tools. The LLM does the reasoning ("the patient wants a follow-up with Dr. Patel; I should call slot_search with provider=Patel and visit_type=cardiology_followup"); the tools do the execution. The thing the LLM does well, and that previous-generation systems did not, is handle the patient's natural-language input, the messy reality of patient phrasing ("anytime next week is fine but not Wednesday because I have a thing"), and the conversational flow ("oh wait, can we do the day after that instead?"). The thing the tools do well, and that the LLM cannot do reliably, is execute the deterministic actions against the scheduling system.
The architectural decision that matters most: the LLM does not modify the schedule directly. Every action that affects the schedule goes through a tool with a well-defined contract. This separation is what makes the system safe enough to put in front of patients and trustworthy enough for the practice operations team to allow it to write to the scheduling system at all.
Why a Generic LLM Cannot Schedule Appointments
A naive product approach would be: take a generalist LLM, give it a chat surface, and let it negotiate appointment scheduling with the patient. This does not work for several specific reasons.
The model has no view of the actual schedule. The patient asks "do you have anything Tuesday?" The LLM has no idea what is on Tuesday's schedule. If the LLM is asked to guess, it will guess. The guess will be plausible and will be wrong. The patient will accept the guess, will show up on Tuesday at the time the LLM made up, and there will be no appointment on the schedule. The only way the bot can answer "do you have anything Tuesday?" correctly is by calling the scheduling system, which means a tool layer.
The model cannot write to the schedule transactionally. Booking an appointment is a transactional operation: read the slot, hold the slot, confirm the slot, release the hold if the patient changes their mind, all under appropriate concurrency control. The LLM is a stochastic function. Asking the LLM to produce a "BOOK_APPOINTMENT" command and then trusting the institutional system to execute it loses the transactional guarantees that scheduling needs. The tool layer provides the transactional contract; the LLM proposes; the tool executes.
The model cannot enforce the institution's business rules. The scheduling rules are an arcane mix of institutional policy ("new patients to cardiology cannot self-schedule, they must be triaged first"), payer requirements ("Medicare wellness visits can only be booked at certain visit-type templates"), provider preferences ("Dr. Patel does not see new patients on Tuesdays because that is his administrative day"), location-specific quirks ("the Riverside location does not do contrast imaging on Fridays because the radiologist is at the other location"), and a hundred other rules. These rules live in the institution's scheduling system as configuration, in the schedulers' heads as tribal knowledge, and in the institution's policy documents as dense prose. The LLM cannot know all of these. The tool layer encodes them.
The model has no audit trail of what it actually did. Every appointment booked or canceled is a clinical-administrative event that needs to be auditable. Who initiated it. When. What was on the schedule before and after. What identifier represents the patient who initiated the change. The LLM produces conversational text; the tool layer produces transactional records. Without the tool layer, the audit trail is unstructured chat logs, which is not enough for the operational and regulatory floor.
The model cannot handle real-time concurrency. Two patients try to book the same 7:30 AM Tuesday slot simultaneously. The scheduling system handles this with transactional locking. The LLM has no notion of locking; if both LLMs were allowed to "book" the slot, both would succeed in their conversations and the institution would have a double-booked slot to clean up later. The tool layer's slot-hold-and-book contract is what prevents this.
The model cannot rate-limit itself. A bot that can book an appointment is a bot that can be exploited to spam-book appointments under fake patient identities, which a malicious actor can do to deny appointments to real patients. The tool layer applies the rate limits, the identity verification, the abuse detection. The LLM cannot enforce its own throttle.
The model has no way to recover from partial failures. Booking an appointment touches multiple systems: the scheduling system, the patient communication system, sometimes the EHR, sometimes the billing eligibility system. Some of those calls succeed and some fail. The LLM does not know how to compensate for a partial failure. The tool layer wraps the multi-system orchestration in well-defined operations that either succeed atomically, fail with a clean rollback, or surface the partial state for human reconciliation.
The model produces output that has compliance implications. Every conversation a patient has with the scheduling bot is potentially a HIPAA-relevant interaction, and the appointment-booking action specifically is a clinical-administrative event. The conversation log, the audit trail of tool calls, the resulting appointment record, are all PHI-relevant data. The architecture has to produce the durable audit pipeline that the FAQ bot did not strictly need.
What the Scheduling Bot Has To Do That the FAQ Bot Did Not
Recipe 11.1 (FAQ chatbot) established the conversational AI patterns that apply broadly: input safety screening with crisis detection, intent classification with scope filtering, RAG over institutional content, output safety screening, audit logging, per-cohort monitoring. The scheduling bot inherits all of those and adds three structural commitments that the FAQ bot did not have.
Identity verification. The FAQ bot serves anonymous patients. "Do you take Aetna?" has the same answer for everyone. The scheduling bot serves identified patients. "Do I have an appointment Thursday?" has a different answer for every patient. The scheduling bot has to verify identity before it does anything that touches the patient's record. The identity verification has to be strong enough to be defensible (at minimum, name plus date of birth plus a confirmation factor like the last four of the phone number on file; better, an authenticated session through the patient portal) and gentle enough that legitimate patients are not blocked. The bot's design has to handle the "I don't know my patient ID" case gracefully and not embarrass patients who do not remember which email they used to register.
Transactional fulfillment. The bot does not just answer questions; it acts. The action either succeeds (appointment is on the calendar) or fails (appointment is not on the calendar). There is no in-between. The transactional commitment changes the testing posture, the error-handling posture, the auditing posture, and the failure-mode catalog. The bot's design treats the booking as the success criterion and tracks every step from "patient initiated" through "confirmed appointment with notification sent" with explicit telemetry.
Compensation when something goes wrong. Sometimes the bot books an appointment that the institution then needs to undo. Maybe the patient was double-booked because of a race with the call center. Maybe the visit-type was wrong and the appointment needs to be rescheduled to the right visit type. Maybe the patient called the office five minutes after the bot booked and asked for a different time. The bot's architecture has to support the operational team in cleaning up these cases without losing the audit trail. This is the operational work that the FAQ bot did not have.
The rest is largely the same as recipe 11.1: the same RAG-style retrieval over institutional knowledge for things the bot needs to know (visit-type taxonomy, provider preferences, location details), the same scope filtering, the same crisis detection, the same per-cohort monitoring, the same conversation logging. The new structure is the tool layer plus the identity layer plus the transactional commitment.
The Healthcare Scheduling Reality
Before going deeper into the architecture, a few notes on what makes healthcare scheduling specifically harder than, say, restaurant scheduling or salon scheduling.
Visit-type taxonomy is the institution's hardest hidden complexity. Every healthcare practice has a list of visit types, and the list is long, and the list contains semantically similar entries that are operationally distinct. "New patient cardiology" and "established patient cardiology follow-up" and "post-procedure cardiology" and "cardiology consult" might all look like the same thing to the patient ("I need to see a cardiologist") but the institution treats them differently. They have different durations, different scheduling rules, different billing implications, different prep requirements. A scheduling bot that does not get this right books the wrong visit type, and the practice operations team has to clean it up. Mapping the patient's natural-language reason for visit to the right visit type is one of the bot's hardest tasks.
Provider preferences are codified, but the codification is uneven. Dr. Patel does not see new patients on Tuesdays. Dr. Patel does see established patients on Tuesdays. Dr. Patel will see urgent established patients on Tuesdays even when his template is full. Dr. Patel will not see anyone on December 23 because that is his daughter's school's holiday concert. Some of this is in the scheduling system as configuration. Some of it is in the head of the scheduler who knows Dr. Patel personally. The bot can only use what is in the scheduling system; the operational discipline of getting the rules into the system is the prerequisite.
Insurance acceptance is not a global property. "Does this practice take Aetna?" is a misleading question. The answer is "for which provider, at which location, for which visit type." Provider A at location X may accept Aetna PPO; provider B at the same location may not, because provider B is contracted as out-of-network for that plan. This complexity is largely hidden from patients in the call-center workflow because the scheduler knows or looks it up. The bot has to surface it correctly without making the patient feel like they are being grilled about their insurance.
Slot inventory is a moving target. Slots open up because of cancellations. Slots get blocked because of provider sick days. Slots get reorganized because the practice rebuilt the schedule. The "available appointments" view that the bot sees is a snapshot, and the snapshot is stale by the time the patient finishes typing their question. The bot's architecture has to handle the case where the slot it offered is no longer available by the time the patient confirms (slot-hold helps; graceful "that slot is no longer available, here are the next options" recovery is the safety net).
Wait times for in-demand specialties can be brutal. Cardiology, dermatology, gastroenterology, and several other specialties routinely run six-week to four-month new-patient wait times in many markets. The bot's job is not to hide this; the bot's job is to surface it honestly and offer alternatives (waitlist enrollment, alternative providers, alternative locations, alternative visit types like a telehealth consult). A bot that says "the next available is October 15" when it is May is doing its job; a bot that papers over the long wait time with cheerful filler is not.
Patient phrasing about time is incredibly varied. "Tomorrow morning." "Next Tuesday." "The Thursday after Memorial Day." "Sometime in June, but not the first week because we are out of town." "ASAP." "Whenever Dr. Patel has the next opening." "Within two weeks." Each of these is a constraint on the slot search. The bot has to translate them into structured search parameters. Modern LLMs are surprisingly good at this; older systems were terrible at it.
No-show is a real cost. Patients book and do not show up at rates that vary substantially by specialty, payer mix, and patient population, but commonly fall in the 5-20% range. The institution invests in reminders, double-booking strategies, and over-booking models to manage this. The bot interacts with all of these: it can book into a slot that is intentionally over-booked, it triggers the reminder workflow, it sometimes is the cancellation channel that opens up a slot for somebody on the wait list. The bot's architecture has to integrate cleanly with the institution's no-show management systems rather than fighting them.
Some appointments cannot be self-scheduled. New patients to certain specialties (cardiology and oncology are common examples) often need to be triaged before scheduling, because the right visit type and the right urgency depend on clinical assessment. Some procedures (colonoscopy, certain imaging) require pre-visit instructions and clearance that the call-center handles. Some patient categories (pediatric scheduling, vulnerable adult scheduling, scheduling for patients with custody or guardianship issues) need human handling. The bot has to know what is in scope and what is not, and the scope rules are not universal across institutions. This is operational policy encoded in the bot's configuration.
Where the Field Has Moved
A few practical updates worth knowing.
Scheduling APIs have matured but remain heterogeneous. Most major EHR and scheduling systems now expose APIs for slot search and booking. The FHIR Scheduling resources (Schedule, Slot, Appointment) provide a standard data model. Most large EHR vendors implement at least a subset of the FHIR scheduling APIs, but the implementations vary in completeness, in the rules they enforce, and in the operations they expose. The integration work for the scheduling bot is mostly at this layer: building a stable, well-tested wrapper around the institution's specific scheduling API and treating that wrapper as the bot's tool surface.
Tool-using LLMs are the default architecture. The pattern of "LLM with structured-output function calling against a small, well-defined tool surface" became the default architecture for transactional conversational AI sometime around 2023-2024. The major LLM vendors (Anthropic, OpenAI, Google, Amazon Bedrock) all support function calling in their APIs. Building a scheduling bot today on the function-calling pattern is a quarter-year project for a competent team; building one without function calling, with parsed-text-as-commands, is a six-month project that produces a worse result.
Multi-turn coherence has gotten dramatically better. The patient saying "actually, can we do the day after instead?" five turns into a conversation used to be a hard problem. The system had to maintain conversation state about the proposed slot, understand the modifier, and refine the search. Modern LLMs handle this naturally because the conversation history is in the prompt and the LLM is good at understanding referential modifications. The scheduling bot does not need to build this from scratch; it inherits the capability from the LLM.
Slot hold is becoming a first-class operation. Older scheduling systems exposed only "search" and "book" with no "hold." This created the race condition that bot architectures had to work around with retry logic. Newer scheduling APIs expose explicit slot-hold operations, which makes the bot's transactional contract cleaner.
Voice channels are increasingly viable. The same conversational scheduling logic that works in chat works in voice with the addition of ASR (recipe 10.5 patterns) and TTS. Several institutions have deployed voice-channel scheduling bots that handle the call that Marcus would have made, with the same booking outcome and a fraction of the wait time. The voice channel adds latency and ASR-error sensitivity but otherwise reuses the architecture.
Build-vs-buy economics favor buy for many institutions. Several commercial vendors offer healthcare-specific conversational scheduling products that integrate with major EHRs. The buy path is faster and comes with EHR-integration maintenance. The build path makes sense for institutions with unusual scheduling rules, for institutions with research interest in the technology, or for institutions that have already built significant in-house conversational AI infrastructure.
The scheduling bot is increasingly a starter capability for broader patient-engagement platforms. Institutions that ship the scheduling bot well usually expand it: add the refill bot from recipe 11.3, add the pre-visit intake bot from recipe 11.4, add the benefits navigator from recipe 11.5. The same chat surface, the same conversation engine, the same audit pipeline, with new tool surfaces for each capability. The scheduling bot is often the second recipe a digital-front-door program ships, after the FAQ bot, and it is the recipe that proves the institution can do transactional conversational AI safely.
General Architecture Pattern
A healthcare appointment scheduling bot decomposes into eight logical stages: channel entry, input safety screening, intent classification, identity verification, conversational slot negotiation (search and refine), transactional fulfillment (hold, confirm, book), output safety screening, and audit logging. The cross-cutting concerns from the FAQ bot (knowledge-base curation, persona and prompt management, escalation, per-cohort monitoring) all carry forward; this recipe adds three new ones (tool-surface contract management, identity-assurance lifecycle, transactional-failure compensation).
โโโโโโโโโโโ CHANNEL ENTRY โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Patient connects through one of the configured โ
โ channels: web chat widget, in-app chat, SMS, โ
โ voice (with ASR/TTS), authenticated patient-portal โ
โ embed] โ
โ โ
โ [Greeting and disclosure] โ
โ - Identifies as a chatbot, not a human โ
โ - States the bot's scope (scheduling, rescheduling, โ
โ cancellation; not clinical) โ
โ - Offers an immediate path to a human โ
โ โ
โ [Conversation session bootstrap] โ
โ - Generate session_id โ
โ - Capture channel, authentication context (if any), โ
โ and any deep-link parameters (e.g., the patient โ
โ clicked a "schedule follow-up" link in their โ
โ after-visit summary) โ
โ โ โ
โ โผ โ
โ [Output: session_id, channel, auth context] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ INPUT SAFETY SCREENING โโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Same primitive as recipe 11.1, including:] โ
โ - Crisis detection (preempts everything) โ
โ - Prompt-injection detection โ
โ - PHI minimization (before identity verification, โ
โ the bot does not need PHI; after identity โ
โ verification, the bot needs only what the โ
โ scheduling task requires) โ
โ โ โ
โ โผ โ
โ [Output: input passes / input blocked-with-disposition] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ INTENT CLASSIFICATION โโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Map the user's request to one of the bot's intents] โ
โ - new_appointment โ
โ - reschedule_appointment โ
โ - cancel_appointment โ
โ - check_appointment โ
โ - update_preferences โ
โ - out_of_scope (defer to FAQ bot, to a human, or โ
โ to the appropriate other handler) โ
โ โ
โ [Out-of-scope handoff] โ
โ - Clinical questions -> nurse triage โ
โ - Refill requests -> recipe 11.3 path โ
โ - Benefits-specific questions -> recipe 11.5 path โ
โ - General FAQ -> recipe 11.1 path โ
โ โ โ
โ โผ โ
โ [Output: in-scope intent | out-of-scope handoff] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ IDENTITY VERIFICATION โโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Verify the patient's identity at the assurance level โ
โ appropriate for the intent and the channel] โ
โ โ
โ [Authenticated session path] โ
โ - Patient is logged into the patient portal โ
โ - The session conveys an authenticated patient_id โ
โ - The bot accepts the patient_id as verified and โ
โ proceeds โ
โ โ
โ [Unauthenticated channel path] โ
โ - Patient enters name, date of birth โ
โ - Bot asks for a confirmation factor (last four of โ
โ the phone number on file, ZIP code on file, or โ
โ a one-time code sent to the phone or email on file) โ
โ - Identity verification tool returns a match โ
โ confidence score and a verified patient_id โ
โ โ
โ [Identity verification failures] โ
โ - Below-threshold match -> "I'm having trouble โ
โ finding your record. Let me get you to someone โ
โ who can help." โ
โ - Multiple matches -> request additional โ
โ disambiguating information โ
โ - No match -> "I don't see a record matching that. โ
โ Are you a new patient? I can help you start the โ
โ new-patient process." โ
โ โ
โ [Step-up authentication for sensitive actions] โ
โ - Cancellation of certain visit types may require โ
โ additional verification โ
โ - Same-day cancellation has different policy than โ
โ cancellation a week out โ
โ โ โ
โ โผ โ
โ [Output: verified patient_id, assurance_level] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ CONVERSATIONAL SLOT NEGOTIATION โโโโโโโโโโโโโโโโ
โ โ
โ [Extract scheduling parameters from the conversation] โ
โ - Provider preference (named provider, specialty, โ
โ established vs. new, language preference) โ
โ - Location preference โ
โ - Visit type (mapped from natural language reason โ
โ for visit through institutional taxonomy) โ
โ - Time-window preference (specific date, day of โ
โ week, time of day, urgency) โ
โ - Insurance plan (validated against the institution's โ
โ accepted-plans list for the proposed provider and โ
โ location) โ
โ โ
โ [Tool: slot_search] โ
โ - Given the parameters, query the scheduling system โ
โ - Return ranked candidate slots with provenance โ
โ - Apply the institution's ranking (preference for โ
โ established provider, preference for sooner, โ
โ preference for previously-visited locations) โ
โ โ
โ [Render candidate slots in plain English] โ
โ - Show 2-3 options, not 30 โ
โ - Include the provider, the location, the time, โ
โ and any notable details (telehealth vs in-person, โ
โ prep instructions for certain procedures) โ
โ โ
โ [Refinement loop] โ
โ - Patient asks for variations ("anything earlier?", โ
โ "different day?", "different provider?") โ
โ - LLM updates parameters and calls slot_search again โ
โ - Convergence when patient picks a slot or asks for โ
โ handoff โ
โ โ
โ [No-results handling] โ
โ - When slot_search returns nothing, the bot honestly โ
โ says so and offers alternatives: โ
โ - Wait-list enrollment โ
โ - Different provider โ
โ - Different location โ
โ - Different visit type (e.g., telehealth) โ
โ - Handoff to live scheduler โ
โ โ โ
โ โผ โ
โ [Output: chosen slot identifier] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ TRANSACTIONAL FULFILLMENT โโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Tool: slot_hold] โ
โ - Place a short-term hold on the chosen slot โ
โ - Hold expires automatically (typical TTL: 5 minutes) โ
โ - Hold prevents concurrent booking from another โ
โ channel โ
โ โ
โ [Confirmation prompt to the patient] โ
โ - Restate the proposed appointment โ
โ ("Tuesday May 28 at 7:30 AM with Dr. Patel at โ
โ the Riverside Cardiology office") โ
โ - Mention any pre-visit prep, parking, what to bring โ
โ (drawn from the institution's knowledge base) โ
โ - Ask for explicit confirmation โ
โ โ
โ [Tool: slot_book] โ
โ - Convert the hold to a confirmed appointment โ
โ - Triggers the institution's standard notification โ
โ workflow (confirmation text/email, calendar โ
โ attachment, pre-visit instructions) โ
โ - Returns the confirmation details โ
โ โ
โ [Optional Tool: eligibility_check] โ
โ - Verifies insurance eligibility for the booked โ
โ appointment โ
โ - When the institution's policy is to verify at โ
โ booking time, this runs synchronously โ
โ - When the institution's policy is to verify in โ
โ batch later, this is skipped โ
โ โ
โ [Failure handling] โ
โ - Slot no longer available -> graceful recovery, โ
โ offer next alternatives โ
โ - Booking system error -> queue the request for โ
โ human follow-up, tell the patient honestly that โ
โ something went wrong โ
โ - Notification system error -> the appointment is โ
โ booked; the failed notification is queued for retry โ
โ and surfaced in the operational dashboard โ
โ โ โ
โ โผ โ
โ [Output: confirmation_id, appointment details, or โ
โ failure with disposition] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ OUTPUT SAFETY SCREENING โโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Same primitive as recipe 11.1] โ
โ - Scope filter on generated response โ
โ - Vendor-managed guardrail layer โ
โ - Hallucination check (especially: did the bot โ
โ confirm an appointment that the booking tool โ
โ did not actually return?) โ
โ โ โ
โ โผ โ
โ [Output: response cleared for delivery, or replaced โ
โ with a refusal-and-handoff] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโ AUDIT, LOG, AND TELEMETRY โโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ [Durable conversation record] โ
โ - User utterances (scrubbed of inadvertent PHI) โ
โ - Tool calls with arguments and results โ
โ - Generated responses โ
โ - Active model and prompt versions โ
โ - Identity-verification outcome and assurance level โ
โ - Transactional outcomes (booked, rescheduled, โ
โ canceled, failed, abandoned) โ
โ โ
โ [Operational telemetry] โ
โ - Booking completion rate โ
โ - Median time to booking โ
โ - Handoff rate per intent and per failure mode โ
โ - Identity-verification failure rate โ
โ - Slot-hold-but-not-confirmed rate โ
โ - Tool-call failure rate per tool โ
โ - Per-cohort metric slices (language, channel, โ
โ identity-verification path) โ
โ โ
โ [Sampled review queue] โ
โ - Random sample plus targeted sample of low- โ
โ confidence and escalated conversations โ
โ - Reviewers tag failure modes (wrong visit type, โ
โ mis-ranked slots, identity-verification friction, โ
โ booking error, etc.) โ
โ โ โ
โ โผ โ
โ [Output: audit trail, telemetry, learning signals] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
A few cross-cutting design points specific to the scheduling bot.
The tool surface is the bot's contract with the scheduling system. The tools have versioned schemas. The schemas are owned jointly by the engineering team and the practice operations team. Changes to the tool surface (adding a parameter, changing the rank order in slot search, deprecating a tool) go through a documented change-management process. The bot's behavior is reproducible from the conversation log plus the active tool-surface version plus the active prompt and model versions. This is the load-bearing contract that makes the system safe to put in front of patients.
Identity verification is graduated by intent and channel. A patient who is logged into the patient portal and asks to check their next appointment needs lower assurance than a patient who is in an unauthenticated web chat asking to cancel a same-day appointment. The bot's policy table maps (intent, channel, additional context) to required assurance level. The identity-verification tool can step the assurance up by asking for additional factors. The patient experience for high-assurance flows is intentionally a little more friction than for low-assurance flows, because the cost of a wrong action is higher.
Visit-type mapping is a managed asset. The mapping from natural-language reasons for visit ("I need to follow up after my stress test") to institutional visit types ("cardiology established patient follow-up, 30 min") is a curated artifact owned by the practice operations team. The bot uses an LLM to do the mapping with the curated visit-type catalog as context, and the operations team reviews mis-mapped cases through the sampled review queue. The mapping evolves as the institution adds, retires, or restructures visit types.
Slot hold is the safety net for concurrency. Without slot hold, two patients can race to book the same slot through different channels and one of them ends up double-booked. Slot hold with a TTL is the mechanism that prevents this. The bot's flow is always search-then-hold-then-confirm-then-book, never search-then-book. The TTL is short enough that abandoned holds release quickly (5 minutes is typical) and long enough that a patient deliberating over options has time to choose.
The booking is durable; the conversation is not. Once the appointment is booked, the source of truth is the scheduling system. The conversation log is the audit trail of how the booking happened, but the appointment itself lives in the scheduling system. The bot's job after booking is to confirm successfully and make sure the patient understands what was booked; the bot is not the appointment's home.
Compensation is a first-class operation. When the bot books an appointment that turns out to be wrong (wrong visit type, wrong provider, wrong location, wrong time, wrong patient), the operational team needs to be able to undo and redo the booking cleanly. The architecture supports this with explicit "view this booking's history" and "compensate this booking" operations in the operational tooling. The audit trail for the original booking and the compensation is preserved together so that the institution can reproduce the full sequence of events for any patient complaint or any audit request.
No-show and reminder workflows are integrations, not features. The institution's existing reminder workflow (text reminders, phone-call reminders, email reminders) is a separate system. The booking tool triggers it as part of the standard booking flow. The cancellation tool similarly triggers the cancellation notification. The bot does not own these workflows; the bot's job is to integrate cleanly with them so that the patient's experience is consistent regardless of whether the appointment was booked through the bot, the call center, or the portal.
Scope filtering in the output checks for unauthorized actions. The output safety screening from recipe 11.1 carries forward, with one new check: did the bot tell the patient an appointment was booked when the booking tool did not actually return success? This is a hallucination-style failure that has higher consequences in the scheduling context, because the patient may show up at an appointment that does not exist on the schedule. The output check verifies that any "your appointment is confirmed" claim in the response is supported by an actual successful booking-tool result.
Per-cohort monitoring is non-negotiable. Booking completion rates and identity-verification success rates can vary substantially by language, age cohort, channel, and (where available) other equity-relevant axes. The institution monitors these from launch and treats per-cohort disparity as a launch-gate criterion, not a post-launch dashboard.
The AWS build lives in a companion page. This recipe covers the problem, the underlying technology, and the vendor-agnostic architecture. For the AWS services, architecture diagram, prerequisites, and the step-by-step pseudocode walkthrough, see the Architecture and Implementation companion. The Python example is linked from there.
The Honest Take
The scheduling bot is the recipe in this chapter where the operational improvement is most measurable, the patient experience improvement is most tangible, and the integration complexity is most underestimated.
The first trap, like with the FAQ bot, is treating the institutional content as someone else's problem. With the FAQ bot the content is the parking policy and the accepted insurance plans; with the scheduling bot the content is the visit-type catalog. The single largest determinant of bot quality is the visit-type catalog's quality. Most institutions discover, when they start the project, that their visit-type catalog has accumulated cruft for a decade: visit types that nobody remembers why they exist, overlapping definitions that schedulers handle by tribal-knowledge convention, undocumented rules in the schedulers' heads. Cleaning this up is the most important pre-deployment work, and it is rarely scoped into the project plan because nobody owns the catalog formally. The institutions that ship a scheduling bot well start with three months of visit-type cleanup and end up with a bot that maps patient requests correctly. The institutions that ship a scheduling bot badly start with the LLM and end up with a bot that books the wrong visit types until somebody has the unpleasant conversation with the operations team about who owns the catalog.
The second trap is underestimating the EHR integration. The scheduling bot's tool layer is the integration point with the institution's EHR or scheduling system. Major EHRs (Epic, Oracle Health, athenahealth, eClinicalWorks) all expose scheduling APIs, but the APIs vary substantially in their completeness, in the rules they enforce, and in how they handle edge cases. Slot hold may or may not be a first-class operation. Reschedule may be a single API or a coordinated cancel-and-book transaction. Eligibility check may be available real-time or only in batch. The bot's tool wrappers absorb these differences. Building the wrappers carefully, with explicit handling of every documented error code, is the difference between a bot that handles edge cases gracefully and a bot that crashes on the first ambiguous response from the EHR. Plan multiple sprints for the integration; the LLM work is comparatively easy.
The third trap is shipping with too narrow a scope. A scheduling bot that only handles new-patient appointments for primary care, with a generic visit type, is not worth deploying because the patient calls or emails for almost everything else. The right starting scope is roughly: new and established patient appointments across the major specialties, reschedule and cancel for those appointments, visit-type mapping for the most common reasons-for-visit, identity verification through the standard institutional path, and graceful handoff for everything else. Any narrower is a pilot.
The fourth trap is shipping with too broad a scope. The scheduling bot is not a clinical triage system. It is not a benefits navigator. It is not a refill bot. The scope-discipline work from recipe 11.1 is just as important here. The LLM, by default, will attempt to negotiate scheduling decisions that have clinical implications ("oh, your symptoms sound urgent, let me find an emergency slot"). The institution does not want this; the institution wants the bot to detect clinical content and hand off to triage. The scope filter, the clinical-content detection, the handoff templates are the layered defenses, and underweighting them produces a bot that occasionally takes scheduling actions that should have gone through clinical triage.
The fifth trap is treating identity verification as a friction problem to minimize rather than as a safety primitive to design. Identity-verification friction is real, and minimizing it for legitimate users is a genuine product goal. But the cost of getting identity wrong on a scheduling bot is concrete: actions taken on the wrong patient's record. The right design is graduated assurance: easier paths for low-risk actions (looking up a future appointment), harder paths for higher-risk actions (canceling within 24 hours, rescheduling across providers). The patient-experience team and the privacy officer co-own this design. Engineering enforces it.
The sixth trap is treating the slot-hold-and-book transactional contract as an engineering nicety. It is not; it is the safety net that prevents double-bookings. Without slot hold, a bot operating in a multi-channel environment will eventually tell two patients they have the same slot, and the institution will have to clean up double-bookings. The transactional contract is an architectural primitive, not an optimization.
The seventh trap is shipping without a plan for measuring quality across cohorts. Booking completion rate alone is not enough. The metric mix includes: booking completion rate, time to booking, identity-verification success rate, mis-booked visit type rate, slot-hold-but-not-confirmed rate, tool-call success rate per tool, handoff rate per intent and per failure mode, patient-feedback distribution, per-cohort metric slices, and (where the institution has the data) downstream outcomes (did the patient show up, was the visit type correct, was the patient satisfied). Build the dashboards before launch and review them weekly.
The thing that surprises engineers coming from generic-chatbot backgrounds is how much of the engineering value is in the unglamorous integration work. The wrapper around the EHR's scheduling API. The slot-hold transactional contract. The visit-type mapping with the institutional catalog as context. The identity-verification graduated assurance levels. The clinical-content detection in the reason-for-visit. The compensation operations for booked-but-wrong appointments. The cross-channel slot-inventory consistency. None of this is exotic technology, and all of it is critical.
The thing that surprises healthcare professionals coming from clinical-software backgrounds is how much of the bot's value comes from the LLM's natural-language understanding of patient phrasing. The patient who says "the day after Memorial Day, but not too early because I have to drop the kids off first" is a parse that the bot handles trivially and that no previous-generation system handled at all. The bot's value to the patient is, in large part, "you can phrase it however you want, and the bot will figure out what you mean." This capability did not exist five years ago and now is taken for granted; underweighting it understates the patient-experience improvement the bot can deliver.
The thing about Amazon Bedrock specifically: Bedrock Agents is the right level of abstraction for this recipe in most cases. The agent handles the multi-step LLM-and-tool orchestration; the action groups are the bot's tool surface; Knowledge Bases provides the institutional content; Guardrails provides the safety filtering. The custom Lambda orchestrator is the alternative for institutions that need fine-grained control over the orchestration behavior. Both work; the tradeoff is build time versus flexibility.
The thing about cost: the per-booking infrastructure cost is small relative to the operational savings versus a live-scheduler call. A live-scheduler call costs $5-15 in fully-loaded scheduler time; a bot booking costs $0.02-0.10 in infrastructure. The bot does not handle every booking (a meaningful fraction hand off to humans, especially in early deployment), but the bookings the bot handles are a substantial cost saving. The dominant cost is engineering and operational overhead, not the AWS infrastructure.
The thing about scope: the scheduling bot is the most contained transactional bot in this chapter. Refill bot (11.3) adds clinical review pathways; pre-visit intake (11.4) adds clinical-information collection; benefits navigator (11.5) adds payer-specific reasoning; triage (11.6) adds clinical decision-making. Each of those expands scope substantially. The scheduling bot's scope is bounded enough to be operationally manageable while still delivering meaningful patient experience and operational savings improvement.
The thing I would do differently the second time: invest more, earlier, in the visit-type catalog cleanup. Every successful scheduling bot deployment I have seen had three to six months of catalog cleanup before the engineering work. The deployments that skipped this step shipped on time and then spent the following six to twelve months chasing visit-type-mapping bugs.
The last thing, because it is the easiest one to underestimate: the scheduling bot is the recipe where the institutional politics are most visible. The visit-type catalog is owned by no one in particular; the cleanup forces the question of who owns it. The provider preferences are encoded partly in the scheduling system and partly in tribal knowledge; the bot forces the question of where the system of record lives. The identity-verification policy is enforced inconsistently across channels; the bot forces the question of what the consistent policy is. Building the bot well surfaces these questions and forces resolutions that the institution has previously avoided. The work is genuinely valuable, and it is also genuinely uncomfortable. Plan for the conversations the project will surface, not just the technology you will build.
The scheduling bot is the right second recipe in this chapter, after the FAQ bot, because it is the recipe where the patient-experience improvement is most visible (Marcus's twenty-two-minute phone call versus his ninety-second chat), the operational savings are most measurable, and the operational practices it builds (tool-surface contract management, identity-assurance lifecycle, transactional-failure compensation) carry forward into every later transactional bot in this chapter. Build it carefully. Ship it incrementally. Monitor it rigorously. The patients who deserve a better front door than the previous generation of scheduling tools gave them are exactly the patients who will use this one if the institution does the operational work to make it good.
Related Recipes
- Recipe 11.1 (FAQ Chatbot): Same chapter, the foundational recipe. The scheduling bot inherits the input-screening pipeline, scope filtering, conversation logging, audit pattern, persona discipline, and per-cohort monitoring from the FAQ bot. The two bots can share a chat surface with cross-routing.
- Recipe 11.3 (Prescription Refill Request Bot): Same chapter, the next transactional bot. Refill is the transactional analog for medications: identity verification, action against the patient's account, fulfillment integration, audit trail. The scheduling bot's tool-surface and identity-verification patterns carry forward.
- Recipe 11.4 (Pre-Visit Intake Bot): Same chapter. The intake bot collects clinical information before a visit. The scheduling bot can hand off to the intake bot at booking time ("you have a new appointment, here is the intake to fill out") and the intake bot can hand off to the scheduling bot when intake reveals scheduling needs.
- Recipe 11.5 (Insurance Benefits Navigator): Same chapter. When the patient's question is benefit-specific ("is this procedure covered?"), the scheduling bot routes to the benefits navigator. When the benefits navigator surfaces a covered service, it routes to the scheduling bot for the booking.
- Recipe 11.6 (Symptom Checker / Triage Bot): Same chapter. When the scheduling bot detects clinical urgency in the reason-for-visit, it routes to the triage bot for clinical decision-making rather than booking the next available slot.
- Recipe 10.5 (Patient-Facing Voice Assistant): Chapter 10. The voice channel for scheduling builds on the voice assistant's ASR/TTS patterns; the conversational logic from the scheduling bot is shared.
- Recipe 4.1 (Appointment Reminder Channel Optimization): Chapter 4. The booked appointment from the scheduling bot triggers the reminder workflow optimized through recipe 4.1's patterns.
- Recipe 4.6 (Care Gap Prioritization): Chapter 4. Care gaps surfaced through recipe 4.6 can drive pre-emptive outreach from the scheduling bot to fill the gap with a booked appointment.
- Recipe 3.2 (Patient No-Show Pattern Detection): Chapter 3. The no-show prediction model from recipe 3.2 informs the bot's slot-fill behavior and over-booking strategies.
- Recipe 5.1 (Internal Duplicate Patient Detection): Chapter 5. The bot's identity-verification flow may surface duplicate patient records; the duplicate-detection pipeline from recipe 5.1 is the institutional capability that resolves these.
- Recipe 5.5 (Cross-Facility Patient Matching): Chapter 5. For health systems with multiple facilities, the patient's identity may need to be matched across facility boundaries, leveraging the cross-facility patient matching capability.
Tags
conversational-ai ยท scheduling-bot ยท appointment-scheduling ยท patient-facing ยท patient-engagement ยท digital-front-door ยท tool-using-llm ยท function-calling ยท bedrock-agents ยท transactional-bot ยท identity-verification ยท slot-hold ยท slot-search ยท visit-type-mapping ยท fhir-scheduling ยท ehr-integration ยท intent-classification ยท scope-containment ยท crisis-detection ยท prompt-injection-defense ยท prompt-versioning ยท persona-design ยท multilingual ยท accessibility ยท equity-monitoring ยท cohort-stratified-accuracy ยท bedrock ยท bedrock-knowledge-bases ยท bedrock-guardrails ยท comprehend-medical ยท lambda ยท api-gateway ยท waf ยท dynamodb ยท s3 ยท kms ยท secrets-manager ยท cloudwatch ยท cloudtrail ยท eventbridge ยท kinesis-firehose ยท glue ยท athena ยท connect ยท lex ยท simple-medium ยท quick-win ยท hipaa ยท phi-handling ยท audit-trail ยท booking-completion-rate ยท chapter11 ยท recipe-11-2
โ Recipe 11.1: FAQ Chatbot ยท Chapter 11 Index ยท Recipe 11.3: Prescription Refill Request Bot โ