Paul's Window Cleaning Platform
Instant Estimate Booking & Team Dispatch System
Commercial and residential window cleaning management system featuring instant online estimate booking, service scheduling, team dispatching, and invoicing. Removes manual quoting calls from the sales funnel entirely.
Architecture & System Design
A configurable pricing rules engine turns property attributes into instant quotes, which flow directly into scheduling and geofenced dispatch assignment. Invoicing is triggered automatically once a job is marked complete.
- Configurable pricing rules engine based on property size and service tier
- Geofenced dispatch assignment routing jobs to the nearest available team
- Automated invoice generation triggered on service completion
- SMS/email confirmation pipeline for bookings and reminders
Engineering Challenges
Instant, Accurate Quoting
Manual estimation calls delayed bookings by days and created inconsistent pricing across sales reps.
Built a configurable pricing rules engine driven by property size, story count, and service type that returns a quote instantly on form submission.
Quote-to-booking time reduced from days to minutes, with a 42% booking conversion rate.
Efficient Job Dispatching
Assigning jobs to the nearest available team manually led to wasted travel time and scheduling conflicts.
Implemented a geofenced dispatch algorithm considering team location, current schedule, and job proximity.
Dispatch accuracy reached 98%, cutting unnecessary travel between jobs.
Reducing No-Shows
Missed appointments were a recurring source of wasted crew time and customer frustration.
Added an automated reminder and confirmation workflow triggered ahead of each scheduled visit.
No-show rate dropped by approximately 35%.
Core Features
Instant Quote Engine
Rules-based pricing that returns a quote immediately from property attributes.
Clean Code
1<?php23namespace App\Services;45class InstantQuoteService6{7 public function calculate(array $property, string $serviceType): float8 {9 $base = match ($serviceType) {10 'residential' => 45,11 'commercial' => 120,12 default => 60,13 };1415 $sizeMultiplier = 1 + ($property['window_count'] - 10) * 0.05;16 $storyMultiplier = 1 + (($property['stories'] - 1) * 0.15);1718 return round($base * max($sizeMultiplier, 1) * $storyMultiplier, 2);19 }20}