- {t('customers.title', 'Customer')} -
-- {appointment.customerName} -
- {appointment.customerEmail && ( -- {t('services.title', 'Service')} -
-{serviceName}
-+ Our team will contact you within 24 hours to find the perfect time for your {service.name}. +
++ Any general time preferences that would work for you +
+{item.name}
+Free Consultation
++ {selectedPending === '1' && 'December 26, 2025 - Afternoons'} + {selectedPending === '2' && 'December 27, 2025 - 10:00 AM'} + {selectedPending === '3' && 'No preference specified'} +
++ Interactive demo - click to explore the workflow +
++ {t('services.addonsDescription', 'Add optional equipment or rooms that customers can book alongside this service.')} +
+ + {/* Loading */} + {isLoading && ( +{t('services.noAddons', 'No addons configured')}
++ {t('services.resourceHint', 'Select a resource to block it during the appointment, or leave empty for a simple price add-on.')} +
++ {t('services.addonPriceHint', 'This amount is added to the service price')} +
+{apt.customerName}
{service?.name}
-{apt.customerName}
-{service?.name}
-{apt.customerName}
+{service?.name}
+ {/* Preferred time indicator */} + {hasPreferredTime ? ( ++ {service?.name} - {formatDuration(apt.durationMinutes)} +
+Notes
+{apt.notes}
++ {t('services.manualSchedulingDescription', 'Online bookings go to Pending Requests for staff to call and schedule')} +
++ {t('services.capturePreferredTimeDescription', 'Let customers indicate when they prefer to be scheduled')} +
++ {t('services.manualSchedulingNote', 'When a customer books this service, they won\'t select a time slot. The booking goes to Pending Requests for staff to call and schedule manually.')} +
+Appointments are color-coded so you can see their status at a glance:
-+ Each appointment shows the customer name, service type, start time, and duration. The left border color indicates the status. +
+ The Conference Room row expands to show two overlapping appointments in separate lanes. The Training Room shows a normal single-lane row for comparison. +
The sidebar on the left shows all pending (unscheduled) appointment requests:
-+ Drag appointments from the sidebar onto the timeline to schedule them +
++ Some services require manual scheduling - when enabled, online bookings go directly to the + Pending Requests sidebar instead of being auto-scheduled. This is useful for: +
++ Enable "Requires Manual Scheduling" on any service. Optionally enable "Ask for Preferred Time" + to capture when the customer would like to be scheduled. +
++ Customers see a "We'll call you to schedule" message instead of the regular date/time picker. + They can optionally provide their preferred date and time preferences. +
++ The booking appears in your Pending Requests sidebar with the customer's preferred times displayed. + Click on any request to see full details, then call the customer to confirm a time. +
++ Drag the pending request onto the timeline at the agreed time, or click "Schedule Now" + in the details modal to open the appointment editor. +
++ Explore how manual scheduling works across the service settings, customer booking flow, and pending requests sidebar: +
++ Some services may require you to call customers back to schedule manually, rather than allowing them to pick a time slot online. This is useful for: +
++ Try the interactive demo below to see the complete workflow: +
+ + {/* Interactive Demo */} ++ When enabled, customers booking this service won't select a time slot. Instead, their request goes to your Pending Requests sidebar where you can call them back to schedule. +
++ When enabled (along with manual scheduling), customers can optionally indicate their preferred date and time preferences. This helps you find a suitable time when calling them back. +
++ Tip: Pending requests appear in the Scheduler sidebar with a badge count. Click any request to see customer details and their preferred time, then use "Schedule Now" to assign a time slot. +
++ Service addons are optional extras that customers can add to their appointment. Addons come in two types: +
++ Example: A meeting room booking could offer a "Projector" addon (resource-based) and a "Catering Setup Fee" addon (price-only). When a customer selects the projector, the system checks that both the meeting room AND the projector are available. The catering fee simply adds to the total price without blocking any resource. +
+ + {/* Addon Properties */} ++ A descriptive name customers will see (e.g., "Projector", "Video Conferencing Kit", "Premium Sound System"). +
++ The equipment, room, or other resource required for this addon. If selected, the resource's availability is checked during booking. Leave empty for price-only addons that don't require a resource. +
++ Additional cost added to the service price when the customer selects this addon. +
++ Each addon has a duration mode that determines how it affects the appointment time: +
++ The addon runs during the same time slot as the main service. No extra time added. The addon resource is blocked for the service duration. +
++ Example: "Projector" during a meeting room booking - the equipment is used throughout the session. +
++ The addon runs after the main service ends. Adds extra time to the appointment. The addon resource is blocked for that additional period. +
++ Example: "Equipment Cleanup" after using a specialized room - adds 15 minutes for reset. +
++ To add or manage addons for a service: +
++ Edit an existing service by clicking the pencil icon on its card. +
++ Scroll down to the "Service Addons" section and click to expand it. +
++ Click "Add Addon" to create a new addon. Select a resource, set the name, price, and duration mode. +
++ For existing addons, use the toggle to enable/disable, the pencil to edit, or the trash to delete. +
++ When customers book a service with addons: +
++ When an appointment includes addons, the scheduler shows linked blocks to visualize all resources being used: +
++ Here's how a meeting room booking with a projector addon appears on the scheduler: +
++ The main appointment (solid blue with left border) appears on Meeting Room A, while the linked projector addon (purple dashed left border) appears on the Projector row. Both are blocked for the same time slot. +
+ + {/* Sequential Addon Example */} ++ Here's how a sequential addon (like Equipment Cleanup) appears - notice it starts after the main appointment ends: +
++ The main workshop (solid green) runs 9:00-10:00 AM, and the sequential cleanup addon (purple dashed left border) runs 10:00-10:15 AM on the Cleanup Crew resource row. +
+ ++ Offer projectors, sound systems, or specialized equipment that can be added to meeting room bookings. +
++ Manage limited equipment that multiple services might need - the system prevents double-booking automatically. +
++ Offer add-on time slots using sequential mode to extend appointments with additional services. +
++ Add sequential addons for staff resources that prepare or clean up after appointments. +
++ Charge extra for expedited service or priority handling without needing a separate resource. +
++ Offer gift packaging or special presentation as an optional add-on charge. +
++ Add optional insurance or damage protection fees to bookings. +
++ Offer enhanced support or consultation as a simple price add-on. +
++ Tip: Addons are great for upselling! Offer equipment rentals, premium options, or extended sessions that customers can add with one click. +
+