Scheduling
The Scheduling module is the calendar at the heart of the operation. Every site visit, estimate appointment, install day, recurring service, and follow-up lives here. It links opportunities, projects, contacts, and crew availability into a single dispatch view. When an opportunity converts, the scheduler is where the appointment lands. When a project starts, the install dates show up. When a recurring plan triggers, the next visit auto-creates.
Appointment Types
The calendar handles distinct appointment types — each carries its own duration default, color, required fields, and downstream side effects.
| Type | Default Duration | Color | Triggers |
|---|---|---|---|
| Site Visit | 1 hour | Steel blue | Opportunity → Qualified stage; estimate often created during visit |
| Estimate Appointment | 45 min | Amber | Estimate doc auto-prefilled; sent to customer post-visit |
| Install Day | Variable (multi-day) | Green | Linked to project; crew + materials reserved |
| Repair / Service Call | 1.5 hours | Steel blue | Linked to existing contact's project history |
| Recurring Service | 45 min | Purple | Auto-generated from recurring service plan |
| Follow-up | 30 min | Gray | Post-job check-in; triggers review request automation |
| Internal (training, meeting) | Variable | Slate | No customer-facing notification |
Booking an Appointment
Appointments can be created from four entry points:
1. From an Opportunity
Drag an opportunity card onto a calendar slot, or click "Schedule" on the opportunity card and pick a time. The opportunity advances to Appt Pending until the customer confirms, then Appt Booked.
2. From the Customer Portal (self-service)
Customer opens their portal, sees available slots filtered by service type and crew availability, picks one. The slot is held for 10 minutes while they confirm contact details.
3. From an Online Booking Link
Tradesmen-website embeds a public booking widget. Customer picks a service, picks a slot, enters details — opportunity is created and appointment is booked in one step.
4. Manual (Dispatcher)
Dispatcher creates an appointment directly from the calendar — useful for phone-call bookings or internal scheduling.
Drag-to-Reschedule
The dispatch view supports drag-and-drop rescheduling across both time and crew. Dropping an appointment onto a different time slot triggers:
- Conflict check — System verifies no double-booking
- Travel time recalculation — Distance and drive time updated between the new slot and adjacent appointments
- Customer notification — Optional SMS/email asking the customer to confirm the new time
- Crew notification — Push notification to the affected crew member(s)
- Audit log — Reschedule logged with timestamp, dispatcher, and reason
Drag-and-drop is also crew-aware: dragging from "Mike R." to "Sarah L." reassigns the appointment and notifies both.
Crew Auto-Assignment
When an appointment is booked without a specific crew assignment, the system suggests an assignment based on:
- Skill match — Crew certifications and service-type training
- Geographic proximity — Distance from preceding/following appointments on that crew's day
- Load balance — Current week's appointment count per crew
- Customer preference — If the customer has a preferred technician on file
- Availability windows — Working hours, PTO, time-off requests
The suggestion is shown as a draft assignment with a one-click accept. The dispatcher can override at any time.
Customer Confirmation Flow
Every customer-facing appointment triggers a confirmation sequence:
| Time | Channel | Action |
|---|---|---|
| Immediately after booking | SMS + Email | Confirmation with appointment details, calendar link (.ics), and reschedule link |
| 24 hours before | SMS | Reminder with "Reply Y to confirm or N to reschedule" |
| 1 hour before | SMS | Final reminder with technician ETA and live tracking link |
| Tech en route | SMS | "Mike is on the way — track here" with live GPS link |
| 10 min before arrival | SMS | "Mike is 10 minutes out" |
Failed customer confirmations (e.g., "N" reply or no response by T-24h) surface in the dispatcher's "Needs Attention" queue.
Recurring Service Plans
For customers on recurring contracts (e.g., quarterly maintenance, monthly cleanings, annual tune-ups), the scheduler auto-generates the next appointment when the previous one is marked complete.
Recurring plan configuration:
| Field | Example |
|---|---|
| Cadence | Quarterly / Monthly / Custom (every N days) |
| Service template | Auto-pre-fills line items from the recurring plan |
| Preferred day/time | "Tuesdays, mornings" — used as a soft constraint |
| Auto-confirm | Customer is notified but does not need to manually approve |
| Pause condition | "Skip during December" / customer paused |
Recurring appointments appear on the calendar in purple and are flagged with a circular arrow icon.
Schedule Health Indicators
The dispatch view surfaces operational risks in real-time:
- 🔴 Unconfirmed — Customer hasn't replied to confirmation request
- 🟠 Travel conflict — Drive time between back-to-back appointments doesn't fit
- 🟡 Material not ready — Required materials still on order
- 🟣 Permit pending — Job blocked on permit approval
- ⚫ Crew assigned not certified — Skill mismatch flagged
Hovering a flag shows the explanation and a one-click resolution path.
Multi-Day Jobs
Install jobs spanning multiple days are scheduled as a single project but appear as linked appointment blocks across the calendar:
- Day 1, Day 2, Day 3... each shown as its own block
- Crew assignment can vary per day
- Hours-budget tracked across the multi-day span
- Material delivery scheduled to Day 1 by default
- Customer notification consolidates (one "your install begins May 22" message, not three daily reminders)
Calendar Sync
The CRM calendar can sync to external calendars in two directions:
- Push to external — Crew members see their appointments in Google Calendar / Apple Calendar / Outlook
- Pull from external — Personal blocks (doctor appointments, PTO) appear as busy time, preventing double-booking
Sync is per-user and opt-in. Push uses one-way iCal feeds; pull uses CalDAV or OAuth (Google).
Access Control (RBAC)
| Permission | Owner | Manager | Dispatcher | Technician | Bookkeeper |
|---|---|---|---|---|---|
| View all appointments | ✓ | ✓ | ✓ | Own only | ✓ |
| Create appointment | ✓ | ✓ | ✓ | ✗ | ✗ |
| Reassign crew | ✓ | ✓ | ✓ | ✗ | ✗ |
| Reschedule | ✓ | ✓ | ✓ | Own (request only) | ✗ |
| Cancel appointment | ✓ | ✓ | ✓ | ✗ | ✗ |
| Edit recurring plan | ✓ | ✓ | ✓ | ✗ | ✗ |
| Configure templates | ✓ | ✓ | ✗ | ✗ | ✗ |