Scheduling Links
Generate Calendly-style booking links with availability windows and embeddable widgets. Built on top of the calendar skill for automatic event creation.
Capabilities
- Meeting Types: Define different meeting types with custom durations (15, 30, 45, 60 min, etc.)
- Availability Windows: Set custom availability per meeting type (days of week, time ranges)
- Booking Links: Create shareable booking links with customizable settings
- Embeddable Widgets: Generate HTML iframe code for website integration
- Buffer Times: Add buffer minutes before and after appointments
- Booking Constraints: Configure min/max advance booking times
- Calendar Integration: Automatically create calendar events when bookings are made
- Booking Management: Track, cancel, and mark no-shows for appointments
Installation
cd skills/scheduling-links
npm install
npm run build
CLI Usage
Meeting Types
Create a meeting type:
npm run cli -- type-create consult "Consultation Call" 30 --desc "Initial consultation" --color "#4285f4"
List meeting types:
npm run cli -- type-list
npm run cli -- type-list --all # Include inactive
Get meeting type details:
npm run cli -- type-get consult
Update meeting type:
npm run cli -- type-update consult --name "Updated Name" --duration 45
Enable/disable/delete:
npm run cli -- type-disable consult
npm run cli -- type-enable consult
npm run cli -- type-delete consult
Availability Windows
Show current availability:
npm run cli -- availability consult
Set availability (format: day:start-end, where day is 0=Sun to 6=Sat):
npm run cli -- set-availability consult "1:09:00-17:00,2:09:00-17:00,3:09:00-17:00,4:09:00-17:00,5:09:00-17:00"
Booking Links
Create a booking link:
npm run cli -- link-create consult book-consult \
--title "Book a Consultation" \
--welcome "Welcome! Please select a time." \
--buffer-before 5 \
--buffer-after 5 \
--max-days 14 \
--min-hours 2
List booking links:
npm run cli -- link-list
Get booking link details:
npm run cli -- link-get book-consult
Generate booking URL:
npm run cli -- link-url book-consult --base "https://my-site.com"
Generate embed widget code:
npm run cli -- widget book-consult --width "100%" --height "700px" --theme light
Available Slots
Get available slots for a date:
npm run cli -- slots book-consult 2024-02-15
Bookings
Book an appointment:
npm run cli -- book book-consult "2024-02-15T10:00:00" "John Doe" "john@example.com" \
--phone "+1234567890" \
--notes "Looking forward to our discussion"
List bookings:
npm run cli -- bookings book-consult
npm run cli -- bookings book-consult --status confirmed
List upcoming bookings:
npm run cli -- upcoming
Cancel or mark no-show:
npm run cli -- cancel 1
npm run cli -- no-show 1
System Commands
Health check:
npm run cli -- status
Statistics:
npm run cli -- stats
Library Usage
import { SchedulingLinksSkill } from '@openclaw/scheduling-links';
const skill = new SchedulingLinksSkill();
// Create a meeting type
const meetingType = await skill.createMeetingType({
slug: 'consult',
name: 'Consultation Call',
duration: 30,
color: '#4285f4'
});
// Set availability (Monday-Friday 9am-5pm)
await skill.setAvailabilityWindows('consult', [
{ dayOfWeek: 1, startTime: '09:00', endTime: '17:00' },
{ dayOfWeek: 2, startTime: '09:00', endTime: '17:00' },
{ dayOfWeek: 3, startTime: '09:00', endTime: '17:00' },
{ dayOfWeek: 4, startTime: '09:00', endTime: '17:00' },
{ dayOfWeek: 5, startTime: '09:00', endTime: '17:00' }
]);
// Create a booking link
const link = await skill.createBookingLink({
meetingTypeSlug: 'consult',
slug: 'book-consult',
title: 'Book a Consultation',
maxAdvanceDays: 14,
minAdvanceHours: 2,
bufferMinutesBefore: 5,
bufferMinutesAfter: 5
});
// Get available slots for a date
const slots = await skill.getAvailableSlots('book-consult', new Date('2024-02-15'));
// Book an appointment
const booking = await skill.bookAppointment({
linkSlug: 'book-consult',
name: 'John Doe',
email: 'john@example.com',
phone: '+1234567890',
notes: 'Looking forward to our discussion',
startTime: slots[0].start
});
// Generate embed code
const widgetCode = skill.generateWidgetCode('book-consult', {
width: '100%',
height: '700px',
theme: 'light'
});
await skill.close();
Data Storage
Data is stored in SQLite at ~/.openclaw/skills/scheduling-links/scheduling.db:
- meeting_types: Meeting type definitions
- availability_windows: Weekly availability per meeting type
- booking_links: Shareable booking links with configuration
- bookings: Appointment records with calendar event IDs
Integration
The skill integrates with the calendar skill to automatically create calendar events when bookings are made. If the calendar skill is not connected, bookings are still stored locally.
Configuration
Buffer Times
Add padding before/after appointments to prevent back-to-back bookings:
bufferMinutesBefore: Minutes to block before each appointmentbufferMinutesAfter: Minutes to block after each appointment
Booking Constraints
Control when people can book:
minAdvanceHours: Minimum hours in advance (e.g., 24 = next-day booking)maxAdvanceDays: Maximum days in advance (e.g., 30 = up to 1 month ahead)
Required Fields
Configure what information bookers must provide:
requireEmail: Always requiredrequirePhone: Optional phone number collectionrequireNotes: Optional notes field