📊 Analytics Dashboard
Comprehensive chatbot usage analytics across Olive and Chloe.
Sessions Over Time
Time of Day Usage
Day of Week
Completion Rate
Intent Distribution
Data Collection Rates
Conversation Role Breakdown
Appointment Funnel
Scheduling Provider Distribution
Messages Per Session Distribution
Average: — | Min: — | Max: —
Session Duration
Average: — minutes
Sessions by Clinic
Clinic Directory
| Clinic | City | State | Scheduling | Sessions |
|---|
🩺 Health Check
Is every bot working right now? Green means ready. Red means something needs attention.
📅 Acuity Scheduling Debug
Test & diagnose Acuity scheduling integration per-clinic
🔄 What does "Refresh" do?
The Refresh button checks our databases for any clinics that use Acuity scheduling, then looks up their current calendar and appointment information. Here's what happens step by step:
Hit Refresh whenever a new clinic has been onboarded to Olive or Chloe with Acuity scheduling, or when a clinic's Acuity setup has been changed (new calendars, new appointment types, etc.). The static presets above are a snapshot — Refresh gets you the live truth.
Account Discovery
Connect with credentials to discover calendars, appointment types, and account configuration.
Availability Inspector
Fetch available timeslots exactly as the chatbot does — per calendar, per day — and inspect each response.
Availability Dates Calendar
See which dates have available slots this month (uses /availability/dates).
Calendar Availability Matrix
Visual heatmap showing which days each calendar has available slots, aggregated over the next 4 weeks. Rows are calendars, columns are days of the week, and cell values are the total slot count across all 4 weeks.
Pipeline Simulator — Olive vs Chloe
Runs both chatbots' exact source code logic against the same Acuity API data, side by side.
Every stage shows the data shape and flags where the two pipelines diverge — exposing bugs unique to each.
✅ Updated March 2026 — reflects Chloe fixes: {{show_choices}} parser, appt_type_map routing, multi-type support.
Booking Simulation
Walk through the exact booking flow the chatbot uses. This simulates the race condition by fetching slots, then attempting to book — showing whether the slot is still available.
Click below to fetch available timeslots (same as chatbot getUpcomingTimes()).
Select a timeslot from the fetched results (simulates user clicking a button).
Re-check if the selected slot is still available (the chatbot does NOT do this — this is the gap).
Preview the exact payload that createAcuityAppointment() would send to Acuity.
Appointment History
View recent appointments, verify bookings, and cancel test appointments.
Acuity API Reference
Interactive documentation for all Acuity Scheduling API v1 endpoints. Click Try It → to populate the Raw API tab.
📘 API Reference — Help Guide
2. Browse the endpoint categories (Account, Calendars, Appointments, etc.).
3. Click "Try It →" on any endpoint to auto-fill the Raw API tab.
4. Switch to the Raw API tab and click Send to execute the call.
Account
/me
Returns account details including timezone, owner name, and plan info.
Calendars
/calendars
Returns all calendars on the account. Each calendar has an id, name, description, location, and timezone.
Appointment Types
/appointment-types
Returns all appointment types. Use includeDeleted=true to include soft-deleted types.
| Param | Type | Req | Description |
|---|---|---|---|
includeDeleted | boolean | No | Include deleted appointment types |
Availability
/availability/dates
Returns dates with available slots for a given month. Used by chatbot to show date picker.
| Param | Type | Req | Description |
|---|---|---|---|
month | string | Yes | YYYY-MM format |
appointmentTypeID | int | Yes | Appointment type ID |
calendarID | int | No | Filter to specific calendar |
timezone | string | No | IANA timezone (e.g. America/New_York) |
/availability/times
Returns specific available times for a given date. Each result includes a time ISO string.
| Param | Type | Req | Description |
|---|---|---|---|
date | string | Yes | YYYY-MM-DD format |
appointmentTypeID | int | Yes | Appointment type ID |
calendarID | int | No | Filter to specific calendar |
timezone | string | No | IANA timezone |
/availability/check-times
Check if specific times are still available. Send array of datetimes in request body.
| Body field | Type | Req | Description |
|---|---|---|---|
times | array | Yes | Array of ISO datetime strings to check |
appointmentTypeID | int | Yes | Appointment type ID |
calendarID | int | No | Filter to specific calendar |
Appointments
/appointments
List appointments with optional filtering. Default is future appointments sorted ascending.
| Param | Type | Req | Description |
|---|---|---|---|
max | int | No | Max results (default 25) |
minDate | string | No | YYYY-MM-DD minimum date |
maxDate | string | No | YYYY-MM-DD maximum date |
calendarID | int | No | Filter to calendar |
appointmentTypeID | int | No | Filter to type |
canceled | boolean | No | true = only canceled |
firstName | string | No | Filter by first name |
lastName | string | No | Filter by last name |
email | string | No | Filter by email |
direction | string | No | ASC or DESC |
/appointments
Create a new appointment. The chatbot calls this via createAcuityAppointment().
| Body field | Type | Req | Description |
|---|---|---|---|
datetime | string | Yes | ISO datetime from availability/times |
appointmentTypeID | int | Yes | Appointment type ID |
calendarID | int | No | Calendar to book on (auto-selected if omitted) |
firstName | string | Yes | Client first name |
lastName | string | Yes | Client last name |
email | string | Yes | Client email |
phone | string | No | Client phone number |
timezone | string | No | IANA timezone for the appointment |
/appointments/:id
Get a single appointment by ID. Returns full appointment object.
| Param | Type | Req | Description |
|---|---|---|---|
id | int | Yes | Appointment ID (path parameter) |
/appointments/:id
Update an appointment. Can change any field including firstName, lastName, email, phone, notes.
| Param | Type | Req | Description |
|---|---|---|---|
id | int | Yes | Appointment ID (path parameter) |
firstName | string | No | Update first name |
lastName | string | No | Update last name |
email | string | No | Update email |
notes | string | No | Update notes |
/appointments/:id/cancel
Cancel an appointment. Can optionally mark as no-show.
| Body field | Type | Req | Description |
|---|---|---|---|
cancelNote | string | No | Reason for cancellation |
noShow | boolean | No | Mark as no-show instead of cancel |
/appointments/:id/reschedule
Reschedule an existing appointment to a new datetime. Keeps all client info.
| Body field | Type | Req | Description |
|---|---|---|---|
datetime | string | Yes | New ISO datetime from availability/times |
calendarID | int | No | New calendar (optional) |
timezone | string | No | IANA timezone |
Blocks
/blocks
List calendar blocks (time-off / unavailable periods).
| Param | Type | Req | Description |
|---|---|---|---|
max | int | No | Max results |
minDate | string | No | YYYY-MM-DD |
maxDate | string | No | YYYY-MM-DD |
calendarID | int | No | Filter to calendar |
/blocks
Create a new block (unavailable period) on a calendar.
| Body field | Type | Req | Description |
|---|---|---|---|
calendarID | int | Yes | Calendar to block |
start | string | Yes | ISO datetime start |
end | string | Yes | ISO datetime end |
notes | string | No | Block reason/notes |
/blocks/:id
Get a single block by ID.
/blocks/:id
Delete a block by ID. No request body needed.
Clients
/clients
List/search clients. Returns array of client objects.
| Param | Type | Req | Description |
|---|---|---|---|
search | string | No | Search by name, email, or phone |
/clients
Create a new client. Body: firstName, lastName, email, phone, notes.
/clients
Update a client. Body: id (required), plus fields to update.
/clients
Delete a client. Body: id (required).
Forms
/forms
Returns all intake forms configured in the account. Includes field IDs needed for form submissions.
Labels
/labels
Returns all labels (color-coded tags) available on the account.
Blocks Manager
View, create, and delete calendar blocks (time-off / unavailable periods).
🚧 Blocks Manager — Help Guide
2. Select a specific calendar from the dropdown, or leave as "All Calendars".
3. Set a date range and click "Fetch Blocks" to see existing blocks.
4. To add a block: fill in start/end times, select a calendar, click "Create Block".
5. To remove a block: click the delete button on any listed block.
Create New Block
Clients Lookup
Search Acuity clients by name, email, or phone.
👥 Clients Lookup — Help Guide
2. Enter at least one search field (first name, last name, email, or phone).
3. Click "Search" to find matching clients.
4. Results show each client's name, email, phone, and any notes on their account.
Configuration Validator
Validate that the current Acuity credentials and configuration are correctly set up for chatbot scheduling.
✅ Config Validator — Help Guide
2. Optionally enter an Appointment Type ID and expected timezone for deeper checks.
3. Click "Run Validation".
4. Review results: ✅ green = pass, ⚠️ yellow = warning, ❌ red = failure. Each item explains what was tested.
Automated Diagnostics
Runs automated checks against the Acuity account to detect known issues that cause the reported bugs.
Raw API Explorer
Make arbitrary Acuity API calls and see the full response.
Request Log
Complete log of all API requests made during this session.