Case Study: A Custom Scheduler on Jobber for an 8-Van Window Cleaning Company
An 8-van residential window cleaning company in South Wales was outgrowing a round that lived in the owner's head. They moved from Squeegee to Jobber for its API, and I built the planning layer Jobber does not have.
The business
Vue Window Cleaning cleans residential windows across Cardiff, Newport, Swansea, Bridgend and the rest of South Wales from a single yard with eight vans. Customers are on 4-weekly or 8-weekly cycles, which means the whole round is planned as an 8-week schedule. Cleans are either all-around (front and back) or front-only, and crews often add the backs on the day when a front-only customer asks.
New work comes in fast: roughly 400 to 500 leads a month from door-to-door canvassers, 100 to 200 from partner companies, around 150 from the crews themselves, plus the website. Call it 800 new leads a month.
The work is an ongoing contract through Upwork. My Upwork profile and feedback from past clients are public.
The problem
The round lived in one person's head. The owner built each van's daily worklist by hand from the customers who were due or nearly due. That works with one or two vans. With eight it meant every evening was spent planning tomorrow, and the plan was only as good as his memory.
- No territories. Which van went where was largely decided day by day, so vans crossed each other's patches.
- Workload by job count. A list of 30 jobs could be a light day or an impossible one depending on how many were front-only.
- Missed houses went stale. Locked gates, parked cars and building work are normal, but a skipped job had no reliable route back onto the plan.
- Leads everywhere. WhatsApp, Airtable forms, Facebook, website forms and canvasser spreadsheets, each typed into the CRM by hand.
- No API. Their CRM at the time, Squeegee, had no API, so none of this could be automated where it was.
The company chose to move to Jobber specifically because Jobber has a GraphQL API. The catch was that Jobber's own calendar felt congested at eight vans and does not plan a geographic round. So the brief became: keep Jobber as the record, and build the scheduler on top.
What we built
Vans and territories
Each van owns a list of postcodes, with a map-drawn area as a fallback, geocoded through Mapbox. Every visit is assigned to a van automatically. The van is the scheduling unit, not the person, because crews swap vans on the morning; a separate "See the crew" view shows who is actually signed in on each van.
A calendar built for a round
A day view with the postcode areas and their job counts along the top, one column per van, and totals along the bottom: upcoming, completed, late, unscheduled and skipped. Cards show the full postcode, so the office can see which streets a job is on. It refreshes every 30 seconds. Week view shows every job; month view deliberately shows a count per day, because a month is thousands of visits.
Capacity in points
An all-around clean is one point and a front-only clean is half a point, against a minimum of three full homes per hour per van. Each van has a daily target, two bonus levels, and a progress bar for the crew with messages the office writes for each pace. Pace alerts reach the manager when a van falls behind.
Top-up, ordered by distance
When a van will finish short, Top up offers work that can be pulled forward from later in the cycle: only in that van's own postcodes, only within limits (a 4-weekly customer up to six days early, an 8-weekly up to thirteen), and ordered by distance from the van's last completed job.
Missed visits and the 17:30 run
Crews press Miss Today or Miss This Cycle and pick a reason. Miss Today moves the job to the next day the van is genuinely back in that postcode. At 17:30 every evening anything still not completed is moved on by the same rule, with a plain-English line explaining where each job went. A van that breaks down can have its remaining day cleared in one action.
A staff app
Cleaners see today's round and nothing else: stop order, address, whether the job is all-around or front-only, the route split into Google Maps links, and four outcome buttons. Location is recorded at each press, which protects the cleaner if anyone asks whether they were there. Login is limited to working hours, per person if needed.
Lead intake and door-step quoting
One pricing system for every channel. A cleaner stopped on the round can quote on the spot; the quote lands in Jobber as a real quote, moves from Lead to Quoted to Customer, and the first clean is booked automatically on the soonest day a van is working in that area. New customers receive a welcome email explaining how the service works.
Office tools
A Daily Cash Total behind its own password, split by van and counting only work done that day; invoices that carry a customer's balance; 4-week and 8-week CSV exports; an in-app guide written per screen so the office stops being the help desk; and an AI assistant that proposes schedule changes and waits for a human to confirm.
The problems that only show up on real days
The interesting part of a project like this is not the features. It is what breaks when eight vans and fifteen phones hit the system at 7am.
- Launch day load. Reading the whole round out of Jobber every time a cleaner opened their phone overloaded the API on the first morning. The fix was to serve each day from the app's own database, kept honest by Jobber webhooks, by updating it on every change made in the app, and by an hourly check.
- The 7am stampede. Every phone asking for its day at the same minute. Days are now prepared ahead and cached, and weeks five to eight are fetched slowly in the background so Jobber is never flooded.
- Phantom round days. If misses were allowed to count as evidence of a round, one miss on Thursday would make Thursday look like a CF83 day, the next miss would follow it, and within a week there would be a busy day no van was going to. The round rule now ignores jobs that only landed on a day because of a miss, and needs at least five genuine jobs in a postcode (three in the same postcode sector) before it believes a van is there.
- Mapping costs. Route optimisation asks Mapbox for distance matrices, and a naive version re-bought the same answers on every refresh. Results are now cached in chunks so big routes are paid for once.
- Missed houses sent back too soon. Top-up now excludes anyone already missed that day, so a crew is never sent back to a house they could not get into a few hours earlier, and anyone with another clean due within days, so nobody is cleaned twice in a week.
How it is run
The system is a FastAPI backend and a Next.js front end, with Postgres for the working copy, Mapbox for geocoding and routing, Jobber's GraphQL API and webhooks for the record, scheduled jobs for the 17:30 run and the alerts, and an AI model behind the assistant. Every write to Jobber goes through the backend; the browser never talks to Jobber directly, and only an admin can connect the Jobber account.
It was rolled out in stages, the way I recommend for any scheduler: first a calendar and a human-confirmed assistant on the Jobber sandbox, then territories, then capacity and top-up, then the automatic 17:30 run once the rules had proved themselves on real days.
What this means for your business
You do not need eight vans for this to be useful, and you do not need all of it. The parts that pay back first are usually van territories and missed-visit handling, because they stop the two leaks every growing round has: wasted driving and forgotten houses.
If you are on Jobber, or moving to it, see what I build for window cleaning companies.
Running a window cleaning business on Jobber?
I build the scheduling, routing and automation layer Jobber does not have: vans and territories, daily targets, missed-visit handling and lead intake, all writing back to your Jobber account. Tell me how your rounds work and I will tell you honestly what is worth building.
Book a Free 30-Min CallFrequently asked questions
Did the company have to leave Jobber's own tools behind?
No. Jobber remained the record for customers, jobs, quotes and invoices. The office can still open Jobber directly, and anything changed there appears in the scheduler within seconds through Jobber's webhooks.
How long did it take?
A working calendar with the AI assistant was demonstrated on the Jobber sandbox within days. The full system was built in stages over the following weeks, with each stage tested on real days before the next was switched on.
Is this an off-the-shelf product I can buy?
No. It was built for this company's rounds and rules. The same approach and much of the thinking carries over to other window cleaning businesses, but each build is shaped around how that company actually works.
More on window cleaning operations
- Window cleaning automation on Jobber. Everything I build for window cleaning companies.
- Scheduling rounds by van and territory. The territory model in detail.
- Missed visits that never go missing. Reasons, the round rule and the 17:30 run.
- ACT! to Jobber migration case study. 11,000+ clients migrated with zero failures.