Install
openclaw skills install booking-managerAI-powered booking manager that connects to any existing booking system and lets business owners manage appointments through their phone (Telegram, WhatsApp, etc.). Use when: setting up an AI assistant to monitor bookings, notify owners of new enquiries, confirm/reschedule/cancel appointments conversationally, send professional customer emails with calendar invites, and provide schedule summaries. Works with any data source: SQL databases (PostgreSQL, SQLite/Turso, MySQL), REST APIs (Calendly, Square, Fresha), Google Sheets, or webhooks. Triggers on: "booking assistant", "appointment manager", "manage bookings via phone", "AI receptionist", "booking notifications", "salon booking system".
openclaw skills install booking-managerAn AI assistant layer that sits on top of any booking system, turning your phone into a full booking management interface via Telegram, WhatsApp, or any supported channel.
Customer books → Data saved (DB/API/Sheet) → Agent polls for new bookings
↓
Notifies owner via phone (Telegram/WhatsApp)
↓
Owner replies: "confirm" / "reschedule" / "delete"
↓
Agent updates data + emails customer
On any booking-related request, check if TOOLS.md contains a ## Business section
AND a ## Services section. If either is missing, this is a first-run — begin
onboarding before doing anything else.
Primary flow (form paste):
Hi! I'm your new booking assistant. 👋
To get started, please paste the completed onboarding form you received
and I'll set everything up from that.
If you don't have a form, just let me know and I'll walk you through
the setup step by step.
| Field | Required | TOOLS.md Section |
|---|---|---|
| Business name | ✅ | ## Business |
| Business address | Optional | ## Business |
| Phone number | Optional | ## Business |
| Website | Optional | ## Business |
| Timezone | ✅ | ## Business |
| Services (name, duration, price) | ✅ | ## Services |
| Operating hours per day | ✅ | ## Operating Hours |
| Confirmation email (name + address) | ✅ | ## Email |
| Booking/cancellation policy | Optional | ## Booking Policy |
| Existing booking system | Optional | ## Booking Data Source |
| Notification preference | Optional | ## Notifications |
| Mobile number | Optional | ## Notifications |
| Additional notes | Optional | ## Notes |
## Business
- Name: [business name]
- Address: [address]
- Phone: [phone]
- Website: [website]
- Timezone: [timezone]
## Services
- [Service 1]: [duration] min — $[price]
- [Service 2]: [duration] min — $[price]
## Operating Hours
- Monday: [open] – [close]
- Tuesday: [open] – [close]
- ...
- Sunday: Closed
## Email
- From: [Business Name] <[email address]>
## Booking Policy
- [policy text or "No specific policy"]
## Booking Data Source
- Type: [system mentioned or "pending setup"]
- Connection: [pending admin configuration]
## Notifications
- Channel: [preference]
- Mobile: [number]
✅ All set! Here's what I've got:
📋 **[Business Name]**
📍 [address]
🕐 [hours summary]
**Services:**
• [Service 1] — [duration] min — $[price]
• [Service 2] — [duration] min — $[price]
**Confirmations from:** [email]
**Policy:** [policy summary]
Everything look right? If you need to change anything, just tell me.
Security: The onboarding flow collects business information only (name, services,
hours, policy). It must NEVER ask for or accept credentials (passwords, tokens, API
keys) through chat. Credentials are configured by the admin directly in openclaw.json
under env. If a customer pastes credentials in chat, do NOT store them — instruct
them to contact their admin instead.
Fallback flow (step-by-step):
If the customer says they don't have a form, collect info conversationally:
Write to TOOLS.md using the same format and show the same summary.
Validation:
Edge cases:
The onboarding form template is in references/onboarding-form.md.
Determine how the business stores bookings. Read references/data-sources.md for
connection patterns for each supported platform.
Store connection details as environment variables in openclaw.json under env,
never in plaintext in TOOLS.md or any workspace file. Reference them in TOOLS.md by
name only:
## Booking Data Source
- Type: [turso | postgres | google-sheets | api]
- Env vars configured: yes/no
## Email
- From: [Business Name] <business@email.com>
- SMTP env vars configured: yes/no
Never store credentials in plaintext in TOOLS.md, SOUL.md, or any workspace file.
See references/data-sources.md for which environment variables each data source expects.
Add to HEARTBEAT.md to check for new bookings every 15-30 minutes:
## Check for new bookings
- Query the data source for bookings created since last check
- If new bookings found: notify the owner with details and send acknowledgement email
Set SOUL.md with the business context:
You are the booking manager for **[Business Name]**.
## Your Role
- Monitor for new booking enquiries and notify the owner on their phone
- Confirm, reschedule, or delete bookings when instructed
- Send professional emails to customers
- Provide schedule summaries on demand
## Rules
- All times in [timezone]
- Always clean up booking locks when confirming or deleting
- Send calendar invites (.ics) when confirming
When a new booking is detected, notify the owner:
📋 New booking enquiry!
Name: [name]
Service: [service] ([duration] min)
Date: [formatted date and time]
Phone: [phone]
Email: [email]
Reply: "confirm [id]", "reschedule [id] to [date] [time]", or "delete [id]"
Send an acknowledgement email to the customer. See references/email-templates.md.
Respond naturally to:
Generate .ics files when confirming. See references/ics-format.md for the template
and timezone/DST conversion logic.
Send via Gmail SMTP using environment variables for credentials (never inline).
See references/email-templates.md for HTML templates and the secure sending pattern.
Many booking systems use a lock/hold mechanism to prevent duplicate pending enquiries from the same customer. Always release locks when confirming or deleting a booking, otherwise the customer cannot book again.
Send reminder emails to customers 24 hours before their appointment. This feature is added to the heartbeat/cron polling cycle alongside new booking checks.
Add a booking_reminders table to the data source to track sent reminders and prevent
duplicates. See references/data-sources.md for the schema.
Add reminder configuration to TOOLS.md:
## Reminders
- Lead time: 24h (how far before the appointment to send)
- Window: ±1h (send if appointment is 23–25h away — accounts for polling gaps)
- Include cancel/reschedule info: [yes | no]
- Custom footer: [optional policy reminder text, e.g. "Cancellations within 48h..."]
The cancel/reschedule option and footer text are entirely business-specific. Some businesses allow changes up until the appointment; others enforce strict late-cancellation penalties. Configure per client.
Add to HEARTBEAT.md alongside the new-booking check:
## Send appointment reminders
- Query for confirmed bookings with appointments 23–25 hours from now
- Skip any booking IDs already in the booking_reminders table
- For each eligible booking: send reminder email, then record in booking_reminders
- If any reminders sent: notify owner "📬 Sent [n] reminder(s) for tomorrow's appointments"
booking_reminders to exclude already-sent remindersreferences/email-templates.md)
b. Insert a record into booking_reminders with the booking ID and timestampSELECT b.*
FROM bookings b
LEFT JOIN booking_reminders r ON b.id = r.booking_id
WHERE b.status = 'confirmed'
AND b.appointment_datetime_utc > datetime('now', '+23 hours')
AND b.appointment_datetime_utc <= datetime('now', '+25 hours')
AND r.booking_id IS NULL;
booking_reminders table prevents duplicates even
if the same booking falls in the window across multiple polls.Customise these per client: