{"slug": "whatsapp-appointment-booking-with-calendly-and-ai", "title": "WhatsApp Appointment Booking with Calendly and AI", "summary": "A tutorial published by Quickchat AI shows how to build a WhatsApp appointment-booking assistant that uses the Model Context Protocol (MCP) to connect to Calendly's availability and booking tools. In a controlled test, a fictional bicycle shop, Harbor Cycle Workshop, booked a free 15-minute Repair assessment for 10:00 on 27 October 2026 in Europe/London, and the WhatsApp confirmation matched the Calendly appointment from 10:00 to 10:15. The setup requires a Quickchat AI commercial plan and AI credits plus a Calendly Standard or higher plan, because Calendly's Booking API needs a paid plan to create appointments even though the MCP connection itself is free.", "body_md": "Build a **WhatsApp appointment booking assistant** that answers a bicycle-repair question, offers live times and creates a **confirmed appointment in Calendly**. The customer asks about the service, chooses a time and supplies their details in the same WhatsApp conversation.\n\nThe example is **Harbor Cycle Workshop**, a fictional business offering a free **15-minute Repair assessment**. In our controlled WhatsApp test, the customer selected 10:00 on 27 October 2026 in Europe/London. The delivered confirmation matched the appointment in Calendly, from 10:00 to 10:15.\n\n*Real mobile WhatsApp screenshots. The confirmation matched the independently checked Calendly appointment. Emails and personal link details are hidden; contact labels are standardized to the workshop name.*\n\n## What will the WhatsApp booking assistant do?\n\nThe customer completes three steps in WhatsApp:\n\n| Customer step | What the Agent does | \n|---|---|\n| Ask about a puncture repair | Explain the £12 starting labour price, additional parts cost and free assessment | \n| Ask for an assessment date | Read Calendly availability and offer times in the workshop’s time zone | \n| Choose an offered time and give their name and email | Create the requested appointment in Calendly, then return its confirmation and management links | \n\nYou will build this in six steps: add the workshop knowledge, prepare the Calendly event, connect its tools, set the booking instructions, test the complete conversation and repeat it on WhatsApp. MCP (Model Context Protocol) is the connection that lets the Agent use Calendly’s availability and booking tools.\n\n### What you need\n\n1. [Create a Quickchat AI account](https://app.quickchat.ai/register) and verify your email if prompted. Business deployment needs a commercial plan and AI credits; Preview replies and Simulation Testing also use credits. Check[Quickchat AI pricing](https://quickchat.ai/pricing) .\n2. Use Calendly **Standard or above** . Its[Booking API reference](https://developer.calendly.com/api-docs/calendly-api/scheduled-events/create-event-invitee) requires a paid plan to create appointments, even if the[MCP connection itself is free](https://calendly.com/help/connect-calendly-to-your-ai-tools) .\n3. Have access to the intended Meta business account and WhatsApp Business Platform number. Follow the supported verification flow and check [Meta’s messaging rates](https://whatsappbusiness.com/products/platform-pricing/) .\n4. Prepare a controlled customer phone and test inbox. Label and cancel test appointments. Replace the fictional business details before deployment.\n\n[Download the Harbor Cycle Workshop kit](https://quickchat.ai/blog-assets/downloads/harbor-cycle-workshop-kit.zip) for the exact Main Prompt, five source articles, Calendly setup, handoff text and test inputs. These are editable setup files, not a one-click import. The [Main Prompt](#copyable-main-prompt) and [knowledge sources](#copyable-workshop-knowledge-sources) also appear at the end of this guide.\n\nBuild and test in **AI Preview** first, then repeat the conversation on WhatsApp. To delegate part of the setup, use the optional [ChatGPT or Claude walkthrough](#can-chatgpt-or-claude-prepare-this-whatsapp-assistant) with the same kit.\n\n## Step 1: Give the Agent its workshop knowledge\n\nFive short articles give the Agent its service facts while keeping prices, opening hours and bookable times distinct.\n\n*Use workshop knowledge for stable facts and Calendly for live times.*\n\n1. In account setup, choose the description route. Enter “A service assistant for Harbor Cycle Workshop that answers bicycle-repair questions and books a 15-minute Repair assessment”, then select **Create my AI Agent** .\n2. Continue with **Next** . Choose a plan or**Skip for now** to finish configuration. Open**Identity** and set the name to**Harbor Cycle Workshop** .\n3. Open **Knowledge Base > Add Article** . Enter the first source’s title in**Create custom article** , then select**Create article** .\n4. Paste the complete source into **Content** in**Edit Article** , select**Save** , and wait for**Ready** . Repeat for the other four sources. Each save processes its article.\n\n*Paste the complete source into **Content**, then save it and check processing. The local editor shows the opening of the Services article.*\n\n| Source to copy | What it establishes | \n|---|---|\n| [1. Services](#source-1-services) | The free 15-minute assessment is an inspection, not reserved repair work | \n| [2. Indicative prices](#source-2-prices) | Starting labour prices and additional parts costs | \n| [3. Hours and appointments](#source-3-hours-and-appointments) | Opening hours, appointment schedule and live availability are distinct | \n| [4. Location and contact](#source-4-location-and-contact) | In-person location and the route to staff | \n| [5. Human help and booking limits](#source-5-human-help-and-booking-limits) | Confirmation, uncertain results, management links and fallback | \n\nThe complete blocks are in the [copyable knowledge appendix](#copyable-workshop-knowledge-sources) and the kit’s `knowledge/` folder.\n\nLeave stock, final quotes and completion dates to staff when adapting [your own approved documentation](https://quickchat.ai/post/create-ai-support-agent-from-documentation).\n\n**Check the first result:** once all five sources are Ready, ask “My bike has a puncture. How much might it cost, and what does the assessment cover?” in **AI Preview**. Look for the £12 starting labour price, parts charged separately, and an assessment that does not reserve repair work.\n\n## Step 2: Prepare the Calendly appointment\n\nCreate one **Repair assessment** event with a fixed duration, location and schedule. The Agent will use this event’s identifier for availability and booking.\n\n| Calendly setting | Demonstration value | \n|---|---|\n| Event name and type | Repair assessment; one host and one customer | \n| Duration | 15 minutes | \n| Location | 14 Workshop Lane, Bristol, United Kingdom, explicitly fictional | \n| Availability time zone | Europe/London | \n| Tuesday to Friday | 10:00 to 16:00 | \n| Saturday | 10:00 to 13:00 | \n| Monday and Sunday | Unavailable | \n| Payment and extra required questions | None | \n\n1. In Calendly **Scheduling** , edit the intended event or select**+ Create** for a new one-on-one event. Fill**Event name** ,**Duration** ,**Location** and**Availability** , then select**Save changes** . Calendly’s[event-setup instructions](https://calendly.com/help/how-to-set-up-an-event-type) explain the controls.\n2. Connect the calendar that Calendly should check for conflicts. Set the event’s own availability zone and hours, then add real holiday exceptions and booking limits. Avoid changing a shared schedule used by unrelated events.\n3. In **More options > Notifications and automations** , edit the basic email or calendar-invitation notification. Enable**Include cancel and reschedule links in email invitations and reminders** , then save. These[personal management links](https://calendly.com/help/how-to-include-cancel-and-reschedule-links-for-invitees) give customers another route to manage their appointment.\n4. Open the event’s public page and check its name, 15-minute duration, address and available dates. In **Scheduling** , use**Copy link** for this specific event and keep it as the fallback URL for Step 4.\n\n*Check the assessment’s name, duration and location on its public scheduling page. This is the real demonstration event.*\n\nThe workshop opens at 09:00, but assessments start at 10:00. Calendly’s event schedule and connected calendar determine which appointments the Agent can offer.\n\n## Step 3: Connect Calendly and limit its tools\n\nThe Calendly MCP connection gives the Agent named operations. Enable the reads needed to find the event and its times, then add booking only when the instructions and checks are ready.\n\n*Concept: WhatsApp carries the conversation; Quickchat AI answers service questions and uses Calendly to find times and create the appointment.*\n\n### Connect and set the tool list\n\n1. Open **Actions & MCPs > Add Action > MCP** , choose**Calendly** in the catalog and complete its authorization flow with the controlled account.\n\n*Choose **Connect with Calendly** to authorize the account. Real local setup screen.*\n\n1. Open the resulting Action with **Edit Action** . Set**MCP action name** to**Harbor Cycle Workshop appointments** .\n2. Under **Tools** , set**Default tool activation** to**Off** , then apply the table below and**Save** . If you use**Use recommended** , review the resulting switches: its cancellation tool is outside this recipe.\n\n| Tool | During setup | During the booking test | \n|---|---|---|\n| `users-get_current_user` | On | On | \n| `event_types-list_event_types` | On | On | \n| `event_types-list_event_type_available_times` | On | On | \n| `meetings-create_invitee` | Off | On, after Step 4 and the service tests | \n| `meetings-cancel_event` and every other Calendly tool | Off | Off | \n| **Default tool activation** | Off | Off | \n\n*Enable booking for Step 5; keep it off during initial setup. Cancellation and Default tool activation stay off. Local settings example.*\n\nTool switches select the available operations. The Main Prompt specifies the workshop’s event, required customer details and when to book.\n\n### Copy the event identifier without guessing\n\nBefore replacing the prompt’s two operator values, start a new **AI Preview** conversation with only the three read tools enabled. This setup request asks for event details, without checking times or creating an appointment:\n\n## Copy the read-only event lookup request\n\n```\nFind the active Repair assessment event lasting 15 minutes in my connected Calendly account. Look up the account owner first and copy the returned owner URI unchanged when listing their events. Follow pagination if needed. Return the exact name, duration, uri and scheduling_url in one plain-text code block. Copy both URLs in full. If there is not exactly one match, stop and explain. Do not create, change or cancel anything.\n```\n\nHover the reply and select **Copy**. Match the name, duration and public link against the event from Step 2. Keep the complete `uri` and `scheduling_url` for the two prompt settings below. If the lookup is ambiguous or fails, resolve that before enabling booking.\n\nUse `uri` for tool calls and `scheduling_url` for the fallback page. Copy both complete values from the reply, including `https://`.\n\n### Save the booking references for later turns\n\nExpand `meetings-create_invitee`, even while its switch is off, to reveal **Save to memory**. Confirm these rows and **Save**:\n\n| JSONPath expression | Memory key | \n|---|---|\n| `$.resource.event` | `calendly_event_uri` | \n| `$.resource.cancel_url` | `calendly_cancel_url` | \n| `$.resource.reschedule_url` | `calendly_reschedule_url` | \n\n*Each JSONPath selects a response field; its memory key makes that value available to later messages. Local settings example.*\n\nAfter booking, “Can I change the time?” should return this appointment’s saved rescheduling link. [Step 5](#step-5-test-the-conversation-and-the-calendar-result) checks that exact value without another booking or an email lookup.\n\nUse **Europe/London** for the workshop’s appointment times. Quickchat AI converts the local dates in code and returns labelled options. The Agent uses the customer’s selected option to book.\n\n## How the event and appointment fields are filled\n\nWith both availability and booking enabled, the [Calendly tools accept local dates and an explicit time zone](https://docs.quickchat.ai/ai-agent/actions/mcp-actions/#calendly-appointment-times). Quickchat AI handles UTC conversion and checks the selected slot again before submitting it to Calendly. The tool names remain the same.\n\n| Value | Where it comes from | Where it goes | \n|---|---|---|\n| Approved event identifier | The verified event lookup | Availability `event_type` and booking`post_invitee_request.event_type` | \n| Requested date range | Midnight on the requested date to midnight on the next calendar date | Availability `local_start_time` ,`local_end_time` and`timezone` | \n| Offered local time | Each option’s returned `display_time` | Customer’s choice and the booking confirmation | \n| Selected appointment | The option’s `local_start_time` , including its offset, and`timezone` | Booking `post_invitee_request.local_start_time` and`booking_timezone` | \n| Customer details | Customer’s name, email and confirmed zone | `post_invitee_request.invitee` | \n| Fixed physical location | The event and workshop configuration | `post_invitee_request.location` | \n\nA clear request for an offered time plus the required customer details is enough to proceed. If the request is tentative or unclear, the Agent asks for confirmation first. Quickchat AI matches the chosen instant against current availability and sends Calendly its original timestamp.\n\n## Step 4: Set the booking instructions and staff route\n\nThe Main Prompt joins the service facts and calendar tools into one conversation: **check times, get a clear choice and the required details, book, then confirm the result**. “I’ll take 10:00” with the customer’s name and email can complete the request. A tentative choice or missing detail prompts a question before booking.\n\n### Install the complete Main Prompt\n\nOpen **Identity > Main Prompt** and paste the complete [Main Prompt](#copyable-main-prompt), also supplied as `main-prompt.txt` in the kit. Replace `NOT CONFIGURED` only on these two setting lines:\n\n| Prompt setting | Value to paste | \n|---|---|\n| **Approved Calendly event type URI** | Complete `uri` from Step 3 | \n| **Approved Calendly booking link** | Verified public `scheduling_url` | \n\nLeave the later guard sentence unchanged. Main Prompt saves automatically; wait for saving to finish and reopen it to check the stored text. The fictional location appears in the knowledge, event and booking instruction. Update all three together for a real workshop.\n\n*Set the event URI and fallback booking link in Main Prompt, then check the saved values. Real local editor.*\n\n### Configure Human Handoff\n\nOpen **Actions & MCPs > Human Handoff**, enable it and turn **AI summary** on. In **Handoff Rules**, use the plus control to add **Workshop handoff**, enable the rule and paste the following into **Description**:\n\n## Copy the Workshop handoff Description\n\n```\nOffer Human Handoff when the customer asks for a person; needs a final quote, parts availability or repair completion date; describes unsafe brakes, crash or frame damage, or an e-bike battery problem; or encounters a booking failure, uncertain booking result or problem with an existing appointment. Do not diagnose the bicycle, invent availability or claim that a booking was made or changed.\n```\n\nSet **Question** to:\n\n```\nWould you like me to pass this conversation to the workshop team?\n```\n\nSet **Confirmation** to:\n\n```\nYour conversation has been flagged for the workshop team to review. A member of staff can reply here when available. This handoff has not booked an appointment.\n```\n\n*The Question asks before handing off; Confirmation explains that staff can reply and no appointment was booked. Local settings example.*\n\nKeep the explicit-user-request behaviour and **Lack of knowledge** enabled. Leave **Human Agents’ availability** unrestricted so customers can enter the queue while staff are offline. Use **Email notifications** only with a real monitored address; the fictional `.example` address cannot receive them. Save the settings.\n\nTest this staff route after the booking conversation in Step 6.\n\n## Step 5: Test the conversation and the calendar result\n\nRun the four service questions first, then complete one booking conversation in **AI Preview**. Check the appointment in Calendly before moving the conversation to WhatsApp.\n\n### Check service answers in Simulation Testing\n\nKeep `meetings-create_invitee` off while checking the four service questions.\n\n*Open **Testing** to create or find the workshop dataset. Local configuration example.*\n\n1. Open **Testing** in the sidebar. The page title is**Simulation Testing** .\n2. Choose **Create Dataset > Paste messages** and name it**Workshop service checks** .\n3. Paste these four messages, separated by a line containing only `---` , then select**Create** :\n\n## Copy the four service test messages\n\n```\nMy bike has a puncture. How much might it cost, and what does the assessment cover?\n---\nAre you open on Monday? Can I bring my bike on Saturday?\n---\nDo you have my inner tube in stock, and can you finish the repair tomorrow?\n---\nWhat should I bring to my Repair assessment?\n```\n\nOpen the dataset, paste the following into **Evaluation criteria**, then **Save**:\n\n## Copy the service evaluation criteria\n\n```\nCheck service facts against the workshop knowledge. Puncture labour starts at £12 with parts extra. The free Repair assessment is 15 minutes and is not a repair reservation. Monday is closed. Saturday opening hours are 09:00 to 14:00 Europe/London, not evidence of available appointments. Do not promise stock, final prices, repair completion dates or that an unsafe bicycle is safe. Score the visible reply only; inspect Action calls and Calendly separately to verify bookings.\n```\n\n*The four service questions in the local dataset, ready for its first run.*\n\nTo run and review the checks:\n\n1. Select **Run** , give the run a label such as`workshop service baseline` , review the displayed credit cost and select**Start Run** .\n2. Open the completed run and read every reply, **AI Score** and evaluation justification. Use**View** to inspect its conversation.\n3. Check any handoff assignment and summary in **Inbox** .\n\nEach dataset item starts a fresh conversation. Use the continuous Preview test below for booking. The [support-agent testing guide](https://quickchat.ai/post/how-to-test-an-ai-support-agent) explains how to compare runs after an edit.\n\n### Run one complete booking conversation\n\n*Read availability, establish the requested appointment and collect its details. Confirm the booking only after Calendly returns success.*\n\nAfter completing Steps 1–4 and the service checks, turn `meetings-create_invitee` on in **Tools**, **Save**, and start a new **AI Preview** conversation. Use a future date within the event’s booking range and an inbox you control.\n\n| Send in order | Expected result | \n|---|---|\n| “My rear tyre has a puncture. What does a repair cost?” | Starting labour price, parts extra and no binding quote | \n| “I’d like a Repair assessment on [full future date], in Europe/London.” | Available times on the requested date, labelled in the workshop’s time zone | \n| “I’ll take option [number]. My name is [test name], my email is [controlled email].” | One appointment matching the selected date and time, followed by its confirmation | \n| “Can you send me the link to change the time?” | The saved rescheduling URL, without a new booking | \n| “What should I bring?” | Preparation advice from the workshop knowledge | \n\nReplace the bracketed instructions with your test values. Keep the full date and time zone explicit. If a detail is missing or the request is unclear, answer the Agent’s question before continuing; it should not invent a name, email or appointment choice.\n\n### Check the appointment and follow-up\n\n1. In the matching **Inbox** conversation, expand the action-call indicator. Check that the booking call follows a clear choice and the customer’s required details.\n2. Open the appointment in Calendly. Match its event, full date, time zone, duration, location and test customer with the requested appointment and delivered confirmation.\n3. Ask for the rescheduling link and preparation advice. Compare the link with **Inbox > Details > Memory** , as shown in the inspection guide below.\n\n*Expand the called Action to inspect its inputs and result. Local fixture with a synthetic booking response.*\n\n*Compare the selected date, time and zone with the provider record, then clean up the controlled test.*\n\n## Inspect the Action log and saved booking links\n\nFor the Action’s history, open **Actions & MCPs** and select **View logs** on **Harbor Cycle Workshop appointments**. Open the booking call and inspect **Parameters sent** for the event identifier, `post_invitee_request.local_start_time` and `booking_timezone` where they are visible. Match the call to its conversation before comparing it with the customer’s choice and details.\n\n*Choose **View logs** on the Action card to find its recorded calls. Local fixture.*\n\n*Match the visible **Parameters sent** with the selected appointment. Local fixture with a synthetic booking request.*\n\nOpen the appointment in Calendly for its full details and match them with the customer’s requested appointment. This table maps those details to their booking fields:\n\n| Requested detail | Booking request | Saved appointment | \n|---|---|---|\n| Repair assessment, 15 minutes | Approved `event_type` | Correct event and duration | \n| Full date, time and zone | Selected `local_start_time` and`booking_timezone` ; invitee’s`timezone` separately | The same instant, allowing for the operator’s display zone | \n| Name and email | `invitee` | The intended test customer | \n| Workshop address | Physical `location` | The same in-person location | \n\nFor “Can you send me the link to change the time?”, open **Inbox > Details > Memory**. Hover **Calendly Reschedule Url**, select **Copy**, and compare the complete value with the reply’s destination.\n\n*Open **Memory** and use **Copy** for the complete saved link. Local fixture with nonfunctional example URLs.*\n\nThis checks retrieval of this conversation’s link. It does not establish that the customer completed a reschedule.\n\n### Check the date and time zone\n\nUse the full date, including the year, and **Europe/London** for this in-person appointment. London changes between British Summer Time and GMT, so the same clock time can correspond to different UTC times. Quickchat AI’s Calendly integration handles that conversion in code and books with the matching timestamp returned by Calendly.\n\n*The same London clock time corresponds to different UTC times before and after the clock change.*\n\nWhen reading the appointment in Calendly, account for its displayed time zone when comparing it with the customer’s chosen time. For a clock-change date, the availability query must cover the whole local day: its two midnight boundaries can be 23 or 25 hours apart. If an hour differs, correct the date or zone handling and repeat the check before another booking.\n\n## Check changes of date, unavailable times and other edge cases\n\n| Control | Passing result | \n|---|---|\n| Change the date after selecting a time | Fresh availability and a clear choice of the new appointment before booking | \n| Ask for 09:00 because the workshop is open | No invented slot; uses the assessment’s actual availability | \n| Withhold the email or say “10:00 might work” | A question to establish the missing detail or clear intent; no booking yet | \n| Send only “yes” without an established current appointment | Clarification, not a new booking | \n| Repeat “yes” or ask for a management link after a successful booking | Acknowledge the existing appointment; no second booking | \n| Request an unavailable date or an occupied time | No offer for an absent slot and no claim that alternatives are held or reserved | \n| Ask to look up someone else’s booking by email | No lookup or disclosure | \n| Describe crash damage or brakes that may be unsafe | No remote safety assurance; advice not to ride and staff help | \n\nUse separate conversations where a handoff would end the test. Include a summer-time date and a winter-time date when they are available for testing.\n\n## Troubleshoot a test that does not complete\n\n| Symptom | What to inspect | Next step | \n|---|---|---|\n| No times for a day that looks open | Event activation, event schedule, conflict calendar and requested local date range and zone | Check the actual event’s availability; workshop opening hours do not establish slots | \n| A reply or appointment is one hour out | Returned `display_time` , approved local date/zone, selected`local_start_time` ,`booking_timezone` and provider display zone | Stop booking tests, identify the first mismatch and repeat the local-time check before another write | \n| Calendly rejects a booking | Actual error, booking entitlement and required event fields | Correct the specific configuration or missing field; do not infer failure from the chat alone | \n| The result is uncertain | Call history and the actual Calendly appointment | Have staff establish whether a booking exists before any retry or public-page submission | \n| The rescheduling link is missing | Booking response capture and **Details > Memory** in the same conversation | Check the three memory paths; use the customer’s confirmation or staff if no link was captured | \n| WhatsApp sends no reply | Matching Inbox item, connection/delivery state, remaining credits and assignee | Resolve delivery or credit problems; return assignment to **AI Agent** if a completed handoff still pauses replies | \n| A staff reply cannot be sent | Time of the latest customer message | Check the 24-hour window described in Step 6 before sending an ordinary reply | \n\nThe [action reliability guide](https://quickchat.ai/post/reliable-ai-agent-actions) explains how to trace a result to the relevant instruction, call and saved record. Repeat the affected case and an ordinary booking conversation after a change.\n\nCancel the labelled Preview test appointment after recording its result and verify the cancellation in Calendly.\n\n## Step 6: Complete the booking inside WhatsApp\n\nConnect the tested Agent to the business number, then complete the same service-to-booking conversation from a controlled customer phone.\n\n*The real local setup panel shows the number choices before connection. Select the route that matches your number.*\n\n1. Open **Channels > External Apps > WhatsApp** and select**Connect WhatsApp** . Complete Meta’s supported account and number setup. The[WhatsApp connection documentation](https://docs.quickchat.ai/channels/whatsapp/) covers the current verification options.\n2. Confirm that the intended number is enabled for this Agent. Send a customer-initiated service question from the test phone and inspect both the delivered reply and its Inbox conversation.\n3. In the channel setup, look for **AI reply delivered** .**Waiting for your first message** and**Waiting for the AI reply to be delivered** are intermediate states.\n4. Continue in that same conversation with the [booking sequence from Step 5](#run-one-complete-booking-conversation) . Establish the full date and zone, clearly choose a returned time and give the controlled name and email. Check the confirmation on the phone and the corresponding booking call in Inbox.\n5. Open the appointment in Calendly. Match its event, date, time zone, instant, duration and invitee with the WhatsApp request and confirmation.\n\nIn our WhatsApp test, the customer asked for a Repair assessment on **27 October 2026 in London**. The Agent offered 10:00, 10:30 and 11:00:\n\nThe customer then selected **10:00** and supplied the test name and email. The next reply confirmed the appointment and included Calendly’s management links:\n\nAn independent Calendly check found one matching **15-minute assessment**, with the same date, time and test customer. We cancelled it after verification and confirmed that no matching active appointment remained.\n\n## See the matching Calendly response\n\nThis excerpt comes from the real Calendly event read before cleanup. On 27 October 2026, Europe/London is on GMT, so `10:00:00Z` is 10:00 in London.\n\n```\n{\n  \"resource\": {\n    \"name\": \"Repair assessment\",\n    \"status\": \"active\",\n    \"start_time\": \"2026-10-27T10:00:00Z\",\n    \"end_time\": \"2026-10-27T10:15:00Z\"\n  }\n}\n```\n\nWe separately matched the test customer and event, then cancelled the appointment. Private identifiers and management links are omitted.\n\nFinish in the same WhatsApp thread by asking “What should I bring?” and requesting the saved rescheduling link. Keep **the delivered conversation and matching Calendly appointment** together as the result of the test. Check any configured email notification separately in the test inbox, then cancel the labelled appointment and verify its cancellation.\n\n## Check staff handoff and the return to the Agent\n\nTest Human Handoff after the booking conversation because it pauses AI replies. A queued conversation waits for staff to join; configure a monitored queue and avoid promising a response time.\n\n1. From the customer phone, ask to speak to a person.\n2. Open the matching **Inbox** conversation and check its handoff assignment and AI summary. Select**Assign to me** .\n3. Use **Send message** to send a customer-visible staff reply. Confirm that the same reply arrives on the phone and inspect its**Delivered** or**Read** status. An internal note is not a customer message.\n4. Select **AI Agent** in the assignee dropdown. Ask the preparation question from the phone again and check that the Agent resumes answering.\n\nWhatsApp permits ordinary replies within 24 hours of the customer’s latest message. A new customer message resets that window. After it closes, the operator must wait for another customer message or use an approved message template; the ordinary reply composer is disabled. See [Meta’s messaging policy](https://whatsappbusiness.com/policy/) and the [Inbox guide](https://docs.quickchat.ai/conversations/inbox/).\n\n*An **AI Note** gives staff the conversation context. Earlier local handoff example; inspect this view after your own test.*\n\n## Use the public booking page when chat booking cannot proceed\n\nWhen chat booking cannot proceed and no booking request is unresolved, offer the approved event link. Explain that the customer chooses the time, enters their details and confirms on Calendly. They should check the page’s displayed time zone and final confirmation. The Agent receives no automatic proof of that separate website submission.\n\nIf a booking may already exist, have staff check before trying again or sending the customer to submit through the page. For later changes, use this conversation’s saved management link or the customer’s Calendly confirmation; keep the cancellation tool off.\n\nBefore using the setup with customers, replace the fictional business details, check calendar exceptions and confirm who monitors the staff queue. Rerun the service checks and complete conversation after changing the knowledge, prompt or tools.\n\nThe [general Calendly scheduling tutorial](https://quickchat.ai/post/ai-scheduling-assistant-calendly) covers the broader tool and memory workflow; this build adds workshop knowledge and verification on WhatsApp.\n\n## WhatsApp appointment booking FAQ\n\n### Can customers book a Calendly appointment inside WhatsApp?\n\nYes. Quickchat AI can offer live Calendly times, collect the customer’s name and email, and create the chosen appointment inside the WhatsApp conversation. The public booking page is a fallback if chat booking cannot proceed; opening that link does not reserve a time.\n\n### Does the customer need a Calendly account?\n\nNo. The business connects its Calendly account to Quickchat AI. The customer chooses an offered time and supplies their name and email in the conversation.\n\n### Can I use the standalone WhatsApp Business app?\n\nThis Agent uses WhatsApp Business Platform through Quickchat AI’s channel connection. The standalone Business app alone does not run it. Use the supported number and verification options shown during connection.\n\n### Is WhatsApp appointment booking free?\n\nCreating appointments through Calendly’s Booking API requires Standard or above, even though connecting to its MCP server can be free. A deployed business Agent also needs a commercial Quickchat AI plan and AI credits. Meta’s charges depend on the messaging route, category and recipient market.\n\n### When is the appointment actually booked?\n\nAfter the customer clearly requests an available appointment, supplies the required details and Calendly successfully accepts the booking request. An offered time or an email address alone does not create a booking. Match the confirmation with the actual Calendly appointment.\n\n### How do customers cancel or reschedule?\n\nThe Agent can share the personal management link saved from a booking it created in this conversation. If that link is unavailable, the customer uses their Calendly confirmation or asks staff. This recipe keeps the cancellation tool off and does not look up appointments by a typed email address.\n\n### Will this send WhatsApp appointment reminders?\n\nThis recipe handles customer-initiated conversations and appointment creation. Calendly’s confirmation is separate from a WhatsApp reminder. Scheduled WhatsApp reminders require a separately tested scheduler, recipient consent, templates where required and delivery setup.\n\n## Can ChatGPT or Claude prepare this WhatsApp assistant?\n\n**The Quickchat AI account connector can prepare much of the Agent’s configuration.** It can save the supplied instructions and articles, prepare the service dataset and create a restricted Calendly Action. You review the remaining settings and authorize the external accounts.\n\nThis is a separate connection from Calendly MCP. Your AI client uses the account connector to manage the Agent; the Agent later uses Calendly’s tools in customer conversations.\n\n*Open **Manage your AI in** above the dashboard sidebar. This real local panel connects an AI client to account management; connect the customer-facing WhatsApp number in Step 6.*\n\n1. Open [Quickchat AI in ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6a4656c688748191be4c5247fb0d5dfc) and choose**Install plugin** , or use the[Quickchat AI listing in the Claude Directory](https://claude.ai/directory/connectors/app-quickchat-ai) . Sign in to the account that will own this Agent.\n2. Extract the workshop kit. Attach its text files and all five files in `knowledge/` , or paste their contents into the conversation.\n3. Send the setup request below and review any approvals your AI client presents.\n\n## Copy the account setup request\n\n```\nUse the Quickchat AI connector to prepare Harbor Cycle Workshop from the attached tutorial kit. Inspect your available tools and my Agents first. Use a dedicated empty Agent or create one if needed. Leave my other working Agents alone. Show me the selected Agent’s name and ID.\n\nSave main-prompt.txt and the five knowledge articles verbatim. Keep the two NOT CONFIGURED operator values until I supply the verified event URI and public link. Use calendly-setup.md for the event, tool and memory configuration.\n\nIf no matching Calendly Action exists, create Harbor Cycle Workshop appointments for https://mcp.calendly.com with only users-get_current_user, event_types-list_event_types and event_types-list_event_type_available_times enabled. Keep booking, cancellation and all other tools off. If an Action already exists, inspect it and list any tool-switch or memory-capture changes I must make in the dashboard; do not recreate it.\n\nCreate Workshop service checks from simulation-messages.txt and simulation-rubric.txt, without running it.\n\nRead back the complete saved prompt, articles, Action configuration and dataset. Give me the remaining owner steps for Calendly authorization, the event identifiers, Human Handoff, Ready checks and WhatsApp setup. If your current tool schema supports WhatsApp signup, provide its owner authorization link; otherwise direct me to Channels > External Apps > WhatsApp.\n\nDo not send test messages, run simulations or book appointments yet.\n```\n\nThe assistant must inspect its available tools rather than infer a capability from the connector’s name. Use these boundaries when reviewing its result:\n\n| Preparation | Remaining owner check | \n|---|---|\n| Saved Main Prompt and articles | Verify the full text and wait for each article to show **Ready** in the dashboard | \n| New Calendly Action restricted to three read tools | Authorize Calendly in the Action editor; inspect the saved switches and memory paths | \n| Existing Calendly Action | Review individual tools, **Default tool activation** and**Save to memory** in the dashboard | \n| Workshop service dataset | Review its messages and criteria, then authorize a run separately | \n| Human Handoff and WhatsApp | Configure handoff in the dashboard and complete Meta’s business-account and number selection | \n\nCalendly authorization can activate the Action, so the new Action must contain **only the three read tools** at that point. Turning a whole Action on or off is different from enabling its booking tool. If the AI client cannot perform a step, use the matching numbered instructions in Steps 1–6. The [account-MCP guide](https://docs.quickchat.ai/manage-with-ai/) covers other compatible clients.\n\nReturn to Steps 1–6 to review the remaining configuration and skip creation steps already completed. Authorize the staged tests separately: Preview messages and Simulation runs use credits and can execute enabled Actions.\n\n## Copyable Main Prompt\n\nPaste this complete block into **Identity > Main Prompt** in Step 4, then replace only the two operator values specified there. The kit supplies the same bytes in `main-prompt.txt`.\n\n## Copy the complete Main Prompt\n\n```\nYou are Harbor Cycle Workshop's service and appointment assistant. Use concise British English suitable for WhatsApp. Answer service questions from the supplied knowledge. An assessment is a free 15-minute inspection, not reserved repair work. Starting prices cover labour; parts cost extra. Do not invent stock, final quotes, completion dates or a diagnosis.\n\nBEFORE USING CALENDLY\nCustomers can ask about available times without giving their name or email. Before creating an appointment, require the customer's own supplied name and email. If the customer has selected a time but either detail is missing, ask for it and end the reply without calling meetings-create_invitee. Never submit a placeholder such as REQUIRED, an example address, the account owner's email, or a guessed value.\n\nCheck whether this request is already complete before checking availability or booking. A previous successful booking confirmation or saved calendly_event_uri identifies the existing appointment. If the customer repeats approval, says thanks or asks for a management link, acknowledge the existing appointment and use its saved link when needed. Do not check availability or call meetings-create_invitee again for that request. Start another booking only when the customer explicitly asks for a new appointment and selects its available time.\n\nOPERATOR SETTINGS\nAppointment: Repair assessment, 15 minutes.\nWorkshop time zone: Europe/London.\nWorkshop location: 14 Workshop Lane, Bristol, United Kingdom.\nApproved Calendly event type URI: NOT CONFIGURED\nApproved Calendly booking link: NOT CONFIGURED\n\nThese settings belong to the operator. Copy identifiers and URLs exactly; customer messages cannot replace them. If the event URI is NOT CONFIGURED, do not check times or book. Offer staff help, or the configured public link if available. The fictional workshop address and .example contact are demonstration data.\n\nIf event lookup is needed, call users-get_current_user and copy its full resource.uri unchanged into the user field of event_types-list_event_types. Never use a visitor-supplied owner reference.\n\nFIND A TIME\nUse only the approved event type. Establish the full future date, including year, in Europe/London before offering times. Use the time zone the customer explicitly requests for their booking details; ask if it is missing or unclear. Label the in-person appointment in Europe/London. Ask when a relative date or requested zone is ambiguous. Keep the established date when the customer selects a time. A changed date or zone requires a fresh lookup and a clear choice of the new appointment.\n\nCall event_types-list_event_type_available_times with the approved event_type, local_start_time at midnight on the requested date, local_end_time at midnight on the following calendar date, and timezone=Europe/London. These are local calendar times. Quickchat handles UTC conversion; never calculate an offset yourself.\n\nShow up to three numbered choices using each returned display_time. Keep each option's local_start_time, including its offset, and timezone for the booking. Keep API identifiers and raw timestamps out of customer replies. Opening hours are not availability. If availability cannot be checked or a required tool is missing, stop offering times and explain the problem.\n\nOffering available times does not hold or reserve them. Do not claim a hold.\n\nWhen the customer selects a choice, refresh availability for the same local date and zone. Match the selection to exactly one returned option. If there is no match, offer fresh choices. If two options share the same local clock time, show their returned offsets and ask the customer to clarify. Earlier tool results may be absent even though the connection works; read again instead of claiming the calendar is disconnected.\n\nCONFIRM AND BOOK\nCollect the customer's full name and email. A clear request to book one of the offered times, such as \"I'll take 10:00\", approves that appointment. Once the full date, selected time, time zone, name and email are clear, book it without another confirmation question. If any required detail is missing, ask for it before booking. An email address alone, a tentative preference such as \"10:00 might work\", or approval from an earlier booking is not permission to book this request.\n\nIf the customer's intent or appointment details are unclear, show a concise recap with the appointment, duration, location, selected display_time, name and email, and ask \"Shall I book this appointment?\" Wait for a reply approving those details. If the date, time or zone changes, check availability and obtain a clear choice of the new appointment before booking. Never replace the selected appointment silently.\n\nUse the selected option's local_start_time unchanged, including its offset, and its timezone as booking_timezone. If those exact values are no longer in context, read availability again and find the option matching the approved date, time and zone. If none or several match, ask the customer to clarify. Never calculate UTC from the displayed hour. Quickchat checks that exact slot again before submitting the booking. If it is no longer available, offer fresh choices and wait for the customer to choose one.\n\nOnly when the current request is unbooked, the customer has clearly selected the appointment and has supplied every required detail, call meetings-create_invitee once. Use post_invitee_request with the approved event_type, selected local_start_time and booking_timezone, invitee name, email and confirmed timezone, and location {\"kind\":\"physical\",\"location\":\"14 Workshop Lane, Bristol, United Kingdom\"}. Send this concrete location object directly. Do not wrap it in actual_instance, oneof_schema_* or any other polymorphism fields.\n\nConfirm only after Calendly returns a successful result. Copy scheduling.display_time for the confirmation's date, time and zone. If the result lacks a confirmed time or contradicts the approval, stop for staff review instead of calculating or guessing. Do not silently create a replacement. One successful appointment completes this booking request. Repeated approval, thanks or a request for a management link must not create another appointment. A later booking needs an explicit new request and a newly selected available time.\n\nIf the request may have succeeded but its result is unknown, stop booking and route to staff. Say the outcome is uncertain. Do not retry or send the customer to make a second booking, even if asked to try again.\n\nFOLLOW-UP AND FALLBACK\nUse only this conversation's saved calendly_cancel_url or calendly_reschedule_url for management links. If absent, direct the customer to their Calendly confirmation or staff. Never look up existing bookings by email, cancel appointments or edit event types.\n\nIf no booking request is unresolved and chat booking cannot proceed, offer the approved public link as a fallback. Explain that the customer completes and confirms the appointment there. Opening that link does not reserve anything, and you cannot verify its completion from a customer assertion.\n\nOffer Human Handoff for a person request, unknown stock, final quotes, completion dates, booking problems or safety concerns. Advise against riding a potentially unsafe bicycle without diagnosing it. Claim transfer only after it happens; staff can reply when available. Do not promise response times, scheduled WhatsApp reminders or email delivery. Do not collect payment details or send messages later.\n```\n\n## Copyable workshop knowledge sources\n\nCreate one article per source in Step 1. Each block includes its title and complete content; the kit supplies the same text in its `knowledge/` folder. Replace the fictional business facts consistently before deployment.\n\n## Copy article 1: Services\n\n```\n# Harbor Cycle Workshop: services\n\nHarbor Cycle Workshop is a fictional bicycle repair business for this tutorial. Replace its details with your own before deployment.\n\nThe workshop offers puncture repairs, brake and gear adjustments, safety checks and routine servicing for ordinary city, road and mountain bicycles. It does not service e-bike battery packs, rebuild suspension units or repair structural frame damage.\n\nThe bookable appointment is called **Repair assessment**. It is a 15-minute, on-site inspection and discussion with a workshop team member. The assessment itself is free. It helps the team understand the problem and prepare a quote. Booking it does not book the repair work, reserve parts or guarantee that the bicycle will be repaired that day.\n\nCustomers can bring a bicycle to the assessment. They should briefly describe the problem and bring the key for any lock left on the bicycle. There is no collection or delivery service in this demonstration.\n\nThe team confirms repair scope, parts, final price and completion time after inspection. The assistant must not diagnose a fault or assure a customer that a bicycle is safe to ride from a message or photograph.\n```\n\n## Copy article 2: Indicative prices\n\n```\n# Harbor Cycle Workshop: indicative prices\n\nThese are fictional demonstration prices in pounds sterling (GBP). The figures are starting prices for labour, not final quotes. Parts are charged separately. Staff confirm the total before any repair work starts.\n\n| Service | Indicative labour price | Important limit |\n| --- | ---: | --- |\n| Repair assessment | £0 | 15-minute inspection and discussion, not repair work |\n| Puncture repair | From £12 | Inner tube or other parts are additional |\n| Brake adjustment | From £20 | Replacement pads, cables or other parts are additional |\n| Gear adjustment | From £20 | Replacement parts are additional |\n| Safety check | From £35 | Inspection does not include all repair work |\n| Standard service | From £65 | Staff quote after inspecting the bicycle |\n\nThe assistant can explain these starting prices. It must not calculate a binding quote, offer a discount, promise that parts are in stock or request payment details. An appointment is not a purchase of repair work.\n```\n\n## Copy article 3: Hours and appointments\n\n```\n# Harbor Cycle Workshop: hours and appointments\n\nAll workshop opening hours use the **Europe/London** time zone. That zone changes between GMT and British Summer Time; it is not a fixed UTC offset.\n\n| Day | Opening hours |\n| --- | --- |\n| Monday | Closed |\n| Tuesday to Friday | 09:00 to 18:00 |\n| Saturday | 09:00 to 14:00 |\n| Sunday | Closed |\n\nThese are ordinary opening hours, not available appointment times. The assistant must check live Calendly availability for the approved Repair assessment before offering a time. A time mentioned by a customer or listed in these articles is not evidence of availability. Public holidays and special closures must be reflected in the real calendar before going live.\n\nA Repair assessment lasts 15 minutes. Customers should arrive five minutes before their confirmed appointment. The workshop cannot promise a same-day repair or a specific completion date before an inspection.\n\nThe demonstration's event schedule is Tuesday to Friday 10:00 to 16:00 and Saturday 10:00 to 13:00, in Europe/London. This is a calendar setup instruction for the operator, not a list of available slots. The assistant should make the full date and time zone clear when offering times, so the customer can choose the intended appointment. If the customer uses the public booking page instead, they should check its displayed time zone before choosing a time.\n```\n\n## Copy article 4: Location and contact\n\n```\n# Harbor Cycle Workshop: location and contact\n\nThe demonstration location is **14 Workshop Lane, Bristol, United Kingdom**. This is a fictional address. Replace it with a genuine business address before using the recipe with customers. Do not use it for navigation or travel.\n\nRepair assessments are in person at the workshop. They are not phone calls or video meetings. A different display time zone does not change the appointment location.\n\nThe fictional contact address is **hello@harborcycle.example**. The .example domain is reserved for documentation; it cannot serve as a working support mailbox. Replace it with a monitored business address before deployment.\n\nCustomers can request a person in this conversation. The assistant should use the configured Human Handoff when available. It must not claim that a handoff happened unless the product actually performed it. Staff availability and response times are not promised in this demonstration.\n```\n\n## Copy article 5: Human help and booking limits\n\n```\n# Harbor Cycle Workshop: human help and booking limits\n\nRefer a customer to staff when they request a person, need a final quotation or repair completion date, report crash damage, a damaged frame, unsafe brakes or an e-bike battery problem, or need staff assistance with an existing booking. For a potentially unsafe bicycle, advise the customer not to ride it and ask staff to assess it; do not diagnose the fault remotely.\n\nThe assistant can help customers book the approved Repair assessment through the connected Calendly tools. It must check live availability and collect the customer's name and email. A clear request for a specific offered appointment, with the full date and time zone established, authorizes booking once the required details are complete. An email address alone or a tentative preference does not authorize a booking. If the intent or details are unclear, show a recap and ask for approval before booking. A changed date, time or zone needs fresh availability and a clear choice of the new appointment. Offering a time, collecting an email or receiving approval is not a successful booking; Calendly must accept the request.\n\nIf chat booking cannot proceed, the assistant can offer the approved public booking page or staff help. The public page is an alternative way to book, not a reservation. The customer completes its form and checks Calendly's confirmation. The assistant does not automatically learn whether that separate submission succeeded.\n\nIf a booking request might have succeeded but its result is unclear, stop and ask staff to check the calendar. Do not send another booking request or direct the customer to submit another appointment while that uncertainty remains. Do not claim success or failure without evidence.\n\nOnly a new Repair assessment is in scope. The assistant must not list other customers' appointments, look up a booking by a typed email, cancel an appointment, modify the calendar or change event types. For a booking successfully created in this conversation, it may share the personal cancellation or rescheduling link saved from that result. Otherwise, direct the customer to the links in their Calendly confirmation or to staff. Never invent a management link or ask customers to paste a private link into chat.\n\nThe assistant does not send scheduled WhatsApp reminders in this build. Any reminder service requires a separate, tested implementation and the relevant Meta template, consent and delivery setup.\n```\n\n", "url": "https://wpnews.pro/news/whatsapp-appointment-booking-with-calendly-and-ai", "canonical_source": "https://quickchat.ai/post/whatsapp-appointment-booking-calendly", "published_at": "2026-10-22 08:25:43+00:00", "updated_at": "2026-10-22 08:41:40.743195+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools"], "entities": ["Quickchat AI", "Calendly", "WhatsApp", "Meta", "Model Context Protocol", "Harbor Cycle Workshop"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/whatsapp-appointment-booking-with-calendly-and-ai", "markdown": "https://wpnews.pro/news/whatsapp-appointment-booking-with-calendly-and-ai.md", "text": "https://wpnews.pro/news/whatsapp-appointment-booking-with-calendly-and-ai.txt", "jsonld": "https://wpnews.pro/news/whatsapp-appointment-booking-with-calendly-and-ai.jsonld"}}