Install
openclaw skills install appointment-schedulerClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
Automated appointment management for beauty salons, clinics, studios, and photo booths. Handles booking requests, calendar sync, conflict detection, reminders, no-show tracking, and waitlist management.
openclaw skills install appointment-schedulerAutomated appointment management system for service businesses.
node <skill-dir>/scripts/init-config.js
This creates config/appointment-scheduler.json with:
From text message:
node <skill-dir>/scripts/parse-booking.js --text "내일 오후 3시에 컷 예약 가능할까요? - 김철수 010-1234-5678"
From conversation context:
"고객이 예약 요청했어요: [message content]"
The skill will:
node <skill-dir>/scripts/book.js \
--date "2026-02-20" \
--time "15:00" \
--duration 60 \
--service "컷" \
--customer "김철수" \
--phone "010-1234-5678"
# Today's appointments
node <skill-dir>/scripts/check-schedule.js --date today
# Specific date
node <skill-dir>/scripts/check-schedule.js --date 2026-02-20
# This week
node <skill-dir>/scripts/check-schedule.js --week
Manual trigger:
node <skill-dir>/scripts/send-reminders.js
Auto-trigger via cron:
# Daily at 9:00 AM - send 1-day-before reminders
0 9 * * * node /path/to/skills/appointment-scheduler/scripts/send-reminders.js --type day-before
# Hourly - send 2-hour-before reminders
0 * * * * node /path/to/skills/appointment-scheduler/scripts/send-reminders.js --type hour-before
# Mark customer as no-show
node <skill-dir>/scripts/mark-noshow.js --booking-id abc123
# Check no-show stats
node <skill-dir>/scripts/noshow-report.js
# Flag repeat offenders (3+ no-shows)
node <skill-dir>/scripts/noshow-report.js --flag-repeat
# Add to waitlist
node <skill-dir>/scripts/waitlist.js add \
--date "2026-02-20" \
--time "15:00" \
--customer "이영희" \
--phone "010-9999-8888"
# Check waitlist
node <skill-dir>/scripts/waitlist.js list --date 2026-02-20
# Notify waitlist on cancellation
node <skill-dir>/scripts/waitlist.js notify --booking-id abc123
Location: workspace/data/appointments/
data/appointments/
bookings/
2026-02-20.json # Daily booking records
waitlist/
2026-02-20.json # Daily waitlist
noshow/
history.json # No-show records
flagged-customers.json # Repeat offenders
reminders/
sent.json # Reminder delivery log
~/.secrets/google-calendar-credentials.json~/.secrets/google-calendar-token.jsonSync script:
node <skill-dir>/scripts/sync-google-calendar.js
Uses Naver Calendar API (if available) or browser automation fallback.
Config: Add Naver account to config/appointment-scheduler.json
The parser handles natural language like:
Extracted fields:
Before confirming:
Buffer time: Configurable in config (default: 10 min between appointments)
Default timing:
Delivery channels (auto-detect from customer contact):
Customization: Edit timing in config/appointment-scheduler.json
Tracking:
noshow/history.jsonAuto-flag policy (default):
Query:
# Check customer history
node <skill-dir>/scripts/noshow-report.js --customer "김철수"
# Monthly stats
node <skill-dir>/scripts/noshow-report.js --month 2026-02
When a booking is cancelled:
Supports phone call → text → booking flow:
pre-hook: Before booking → check business hours, service availability post-hook: After booking → send confirmation, update calendar, log event conflict-hook: On conflict → trigger alternative suggestion or waitlist flow
Location: events/appointment-YYYY-MM-DD.json
{
"timestamp": "2026-02-18T15:30:00Z",
"event": "booking_created",
"booking_id": "abc123",
"customer": "김철수",
"date": "2026-02-20",
"time": "15:00",
"service": "컷"
}
Recommended cron jobs:
# Send day-before reminders at 9 AM
0 9 * * * node /path/to/skills/appointment-scheduler/scripts/send-reminders.js --type day-before
# Send 2-hour reminders every hour
0 * * * * node /path/to/skills/appointment-scheduler/scripts/send-reminders.js --type hour-before
# Sync calendar every 30 min
*/30 * * * * node /path/to/skills/appointment-scheduler/scripts/sync-google-calendar.js
# Daily no-show report at 8 PM
0 20 * * * node /path/to/skills/appointment-scheduler/scripts/noshow-report.js --daily
Location: config/appointment-scheduler.json
{
"business_name": "MUFI 포토부스",
"business_hours": {
"monday": { "open": "10:00", "close": "20:00" },
"tuesday": { "open": "10:00", "close": "20:00" },
"wednesday": { "open": "10:00", "close": "20:00" },
"thursday": { "open": "10:00", "close": "20:00" },
"friday": { "open": "10:00", "close": "22:00" },
"saturday": { "open": "10:00", "close": "22:00" },
"sunday": { "open": "12:00", "close": "18:00" }
},
"services": {
"포토촬영": { "duration": 30, "buffer": 10 },
"컷": { "duration": 60, "buffer": 10 },
"펌": { "duration": 120, "buffer": 15 },
"염색": { "duration": 90, "buffer": 15 }
},
"reminders": {
"day_before": { "enabled": true, "time": "09:00" },
"hour_before": { "enabled": true, "hours": 2 }
},
"noshow_policy": {
"grace_period_min": 15,
"flag_threshold": 3,
"require_deposit_when_flagged": true
},
"calendar": {
"google": {
"enabled": true,
"calendar_id": "primary"
},
"naver": {
"enabled": false
}
}
}
| Issue | Solution |
|---|---|
| 예약 파싱 실패 | Check parse-booking.js output, add custom patterns |
| 캘린더 동기화 에러 | Verify OAuth credentials, check token expiry |
| 리마인더 미발송 | Check cron job status, verify message tool config |
| 중복 예약 발생 | Ensure conflict detection enabled, check buffer time |
| 대기 명단 알림 실패 | Check customer contact info, verify message channel |
Edit config/appointment-scheduler.json:
"services": {
"신규서비스": { "duration": 45, "buffer": 10 }
}
# Mark time slot as unavailable
node <skill-dir>/scripts/block-time.js \
--date "2026-02-20" \
--start "12:00" \
--end "13:00" \
--reason "점심시간"
# Import from CSV
node <skill-dir>/scripts/import-bookings.js --file bookings.csv
# Monthly booking report
node <skill-dir>/scripts/export-report.js --month 2026-02 --format json
# No-show analysis
node <skill-dir>/scripts/noshow-report.js --month 2026-02 --export csv
🐧 Built by 무펭이 — 무펭이즘(Mupengism) 생태계 스킬