Field Service & Trades// diagnostic

The route looked fine at 7am and the drive times are fiction by 11

In short

Drive times that hold at 08:00 and fail by 11:00 are 2 faults wearing 1 symptom. The travel matrix was computed once, before the day existed, at speeds nobody drives after the peak begins; and door-to-door time — parking, gates, reception, sign-in — was never in the matrix at all. Measure planned leg time, observed drive time and door-to-door time separately, and the 2 come apart immediately.

Key takeaways

  • Measure 3 numbers per leg: planned, observed driving, and door-to-door. 1 number hides both faults.
  • A matrix computed at 06:00 for a 15:00 departure is a forecast nobody labelled as one.
  • Traffic-aware durations need a departure time. Without one, you are routing on free-flow speeds.
  • Door-to-door includes parking, gates, reception and site check-in, and it is a property of the site.
  • Learn a per-site access allowance from history, then let the optimiser plan against the real number.

There are 2 faults here and they produce 1 complaint. The first is that the travel matrix was computed once, at plan time, for a day that had not happened yet — so a leg the technician drives at 15:20 was estimated against conditions at 06:30. The second is that even a perfect driving estimate would be short, because the matrix models kerb to kerb and the technician is paid door to door: parking, gates, reception, the walk to plant, the sign-in kiosk.

They separate cleanly under measurement and they do not share a repair. Time-of-day error is fixed in the routing call. Door-to-door error is fixed with data about places, learned from your own history, and no routing vendor can sell it to you because it is specific to the sites you attend.

Three numbers per leg, and the gaps between them

Most operators hold 1 number, planned travel, and compare it against a feeling. The check is to produce 3 for every leg over a fortnight and let the gaps do the diagnosis.

  1. Planned leg minutes: whatever the optimiser or the dispatcher assumed when the board was built. Capture it at build time, because most systems overwrite it later and the evidence disappears.
  2. Observed driving minutes: from the vehicle telematics or the phone's location trail — first movement after the previous site to arrival in the vicinity of the next. This is the number the matrix was trying to predict.
  3. Door-to-door minutes: previous job complete to next job on site, from the job record itself. This is the number the board actually needed and the one nobody holds.
  4. Bucket all 3 by hour of departure, then plot the medians. Hour of departure is the axis that matters; day of week is a useful second cut and technician is usually a red herring.
  5. Split by site class as well — residential, retail, commercial with a reception, industrial with an induction. If the door-to-door gap sorts by site class, you have found your second fault without further work.
What the medians showThe failureWhat to change first
Observed exceeds planned, and the gap grows with departure hourThe matrix was built at free-flow or single-time speedsDeparture-time-dependent travel, re-solved during the day
Observed tracks planned, but door-to-door exceeds observed by a stable marginAccess time is real and unmodelledA per-site access allowance added to the plan
Both gaps open, and door-to-door sorts by site classBoth faults, which is the common caseAccess allowance first: it is cheaper and it does not need a vendor
Planned exceeds observed all dayA padded matrix, often padded once after a bad quarterRemove the pad and hold the slack as declared buffer instead
Which gap opened, and what it means

The fourth row is worth naming because it looks like success. A matrix padded by 20 percent produces a day that finishes on time and books 1 fewer stop than the fleet could carry, and the padding is invisible because nothing ever reports it. Undeclared slack is capacity given away, and it belongs in the open — the same argument as selling a slot or selling a promise, where what you promise the customer decides how much of the day you can commit.

The matrix was computed once, before the day existed

Route optimisers need a travel matrix: for N stops, the N by N table of leg times between them. For a 12-stop day that is 144 pairs, and if you recompute it per departure hour across a 9-hour window it is over 1,200 lookups for 1 technician. That cost is why the matrix gets computed once, at 06:00, and then treated as a fact for the rest of the day.

  • It is a forecast, not a measurement, and nothing in the interface says so. Every downstream number — promised windows, the last bookable slot, the emergency insertion decision — inherits that forecast without a confidence attached.
  • It degrades in 1 direction. Traffic gets worse relative to an early-morning baseline, never better, so the error is systematically optimistic rather than randomly wrong.
  • It is never re-solved. A board built at 06:00 and never recomputed is planning the 16:00 legs on 06:00 information even when the system is capable of better.
  • Cheap approximations make it worse. Straight-line distance with an average speed multiplier, or a fixed 20 minutes between stops, will beat a bad matrix on cost and lose badly on the legs that matter.

Free-flow speeds are a Sunday-morning model

A routing API will happily return a duration with no traffic in it, and that is the default in more integrations than anyone admits. Traffic-aware durations have to be asked for explicitly, and asking requires a departure time — the parameter most first integrations omit.

Google's Routes API is a fair example of the shape: a traffic-aware duration for driving requires a departure time and a traffic-aware routing preference, and it exposes 3 traffic models — a best guess blending historical and live conditions, a pessimistic model intended to be longer than most days, and an optimistic one intended to be shorter. Other providers differ in naming; confirm the parameters against your provider's current reference rather than against an integration written 2 years ago. The operational point survives all of them: pick the model deliberately.

  1. Send a departure time on every leg, and send the technician's actual expected departure rather than now.
  2. Choose the traffic model per decision. Planning the board tolerates a best guess; a promise made to a customer on the phone should be built on the pessimistic one, because that is the number you will be held to.
  3. Log which model and which departure time produced each estimate. Without that, the planned-versus-observed comparison above cannot tell a bad model from a bad assumption.
  4. Re-solve when the day drifts past a stated threshold rather than continuously, so dispatchers are not re-reading a board that changes under them.

The optimiser did its job perfectly, on a set of numbers describing a morning that had not started yet.

Door-to-door is the number the board never held

The matrix ends where the driving ends. The technician's obligation ends at the equipment, and between those 2 points sit minutes that repeat at every visit to that address.

  • Parking. Dense residential streets and city-centre retail routinely cost more than the last mile of the drive, and permit zones cost more again.
  • Gates and barriers. A gated estate needs a code, a call to the customer or a wait for a warden, and the wait is not correlated with the drive.
  • Reception and site check-in. Commercial and public sites take a signature at a desk, issue a badge, and sometimes require an escort — and paperwork captured at that desk has its own failure mode, in a signature that cannot be tied to what was agreed.
  • The walk. Plant rooms, roof access and basement risers are several minutes from the door in each direction, with tools.
  • The stop nobody put on the route. A supply house run, a parts collection or a fuel stop is a real leg the matrix never saw, and it shows as a mysterious 30-minute gap between 2 jobs.

Give every site an access allowance it has earned

This is the cheap half of the repair and it needs no vendor. The data is already in your job history, and the output is a single number per address that the optimiser adds to the leg.

  1. For every site with at least 3 visits, compute the median gap between arrival and the first recorded work event — a photograph, a part scanned, a form opened.
  2. Where visit counts are too low, fall back to a class median: residential, retail, commercial with reception, industrial with induction, healthcare, education.
  3. Cap the learned value and flag outliers for a human rather than letting 1 disastrous visit set the allowance for a site you attend monthly.
  4. Recompute monthly and keep the previous value visible, because a site that suddenly costs 15 minutes more has usually changed its access policy, and that is worth knowing before it is worth automating.
  5. Feed the allowance into the plan as part of the stop, not as part of the drive, so that changing the route order does not silently change it.

None of that is a platform purchase. It is a table of sites, a nightly job and a field on the stop — ordinary internal tools and operations work sitting beside the field service platform you already run.

What a correct travel model still will not fix

Accurate legs make the plan achievable. They do not tell the customer anything: an arrival message fired on a stale estimate is still wrong, and the delivery failures behind it are their own subject in customers saying the on-my-way text never arrived. Nor do they help a job nobody assigned, which sits outside the route entirely until it becomes one of the jobs sitting unassigned until someone notices.

And the choice of routing engine is a separate argument from this one. Everything above works with the provider you already pay for; changing provider before you have measured the 3 numbers per leg means you will not be able to tell whether the change helped. Both sit under dispatch, scheduling and route sequencing, inside our field service and trades work.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

Why are our route optimisation drive times inaccurate by mid-morning?

Because the travel matrix was computed once when the board was built and never re-solved. A leg driven at 11:00 was estimated against conditions at 06:00, and traffic only moves in one direction relative to an early baseline, so the error is systematically optimistic. Send an actual departure time per leg, ask for a traffic-aware duration, and recompute the legs that still have decisions attached to them.

Should parking and building access be part of travel time or job time?

Part of the stop, not the drive. Access is a property of the address — parking, gates, reception, the walk to plant — so attaching it to the drive makes it change whenever the route order changes, which is exactly wrong. Hold a per-site allowance learned from your own visit history and add it to the stop.

Is a traffic-aware routing API worth the extra cost for service work?

Yes for the legs that decide something, rarely for all of them. Recompute the next 2 legs of each active route, any leg crossing a known congestion window, and every candidate position when an emergency needs inserting; let the rest hold their morning estimate with the staleness visible on the board. That keeps the cost proportional to the decisions being made.

How do we know whether the problem is traffic or access?

Compare 3 numbers per leg: planned travel, observed driving from telematics, and door-to-door from previous job complete to next job on site. If observed exceeds planned and the gap widens with departure hour, it is the traffic model. If observed tracks planned but door-to-door sits well above it, and the excess sorts by site type, it is access.

  • routing
  • travel time
  • dispatch
  • diagnosis
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Working on something in this space?

Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.

Start the conversation