← All postsVan sales

Which van sales KPIs actually predict a route going bad

iotoms team · September 16, 2026 · 5 min read

A snack and beverage distributor running twelve vans out of one depot had a KPI dashboard everyone was proud of. Units sold per van, updated daily. Total revenue by route, ranked on a leaderboard in the break room. Miles driven, checked against fuel receipts every Friday. By every number on that board, the business was healthy — revenue was up 9% year over year, and the top van was moving more cases than ever.

Then, over about six weeks, three of the better-performing accounts on Route 4 quietly switched most of their order to a competitor. Nobody at the depot saw it coming, because nothing on the dashboard was built to see it.

The dashboard was measuring effort, not health

Units sold and revenue are outcome numbers — they tell you what already happened, and they're slow to move. A rep can keep units sold flat for months by pushing volume onto a shrinking set of accounts, discounting harder to keep the big ones, and letting the smaller stops quietly wither. Total revenue by route hides the same thing: a route can hold its number while its underlying account base is rotting, one small store at a time, as long as a few large ones keep buying.

Miles driven told the sales manager even less. It changed with traffic and weather, not with anything a rep actually controlled, so nobody trusted it enough to act on it either way.

What none of these numbers touched was the health of the relationship at each stop — whether a store that used to order every visit had started skipping every other one, whether the order size at a given account was quietly shrinking, or whether a rep was spending eight minutes at some stops and ninety seconds at others because he'd already decided which ones mattered.

How the drop showed up, and how late

The first the manager heard of a problem was a phone call from Route 4's rep, mentioning almost in passing that one of his oldest accounts had "gone a little quiet." By the time anyone pulled the order history for that account, the pattern was six weeks old: order frequency down from weekly to every third week, order size down about 40% on the weeks it did order. Two more accounts on the same route showed the identical shape, staggered by a week or two. A competitor's rep, it turned out, had started calling on all three around the same time the pattern began.

Revenue for the route hadn't dropped enough to trip any alarm, because two large accounts had picked up their ordering slightly in the same window — enough to mask the erosion underneath. The dashboard had been technically accurate and functionally useless.

The turning point: measuring the visit, not just the sale

The fix wasn't a new dashboard with more charts. It was going back to what the field app already recorded at every stop — visit time, order placed or not, order size against that account's own trailing average, and days since last order — and turning those into a small set of stop-level numbers instead of one route-level number.

Strike rate (orders placed divided by visits made, per account and per rep) surfaced the Route 4 pattern immediately once it existed: three accounts sitting at a strike rate of 30-40% against a rolling average near 90%. Order-size variance against each account's own history caught the shrinking baskets before they became missed visits entirely. And visit-time-per-stop, split out instead of averaged across the whole route, showed which accounts a rep was quietly deprioritizing — the ninety-second stops that used to take eight minutes.

None of these needed new hardware or a new habit from the rep. The field app was already timestamping every stop and recording every order; the only change was scoring each visit against that account's own history instead of rolling everything up into one route total.

Once the manager started reviewing strike rate and order-size variance weekly instead of revenue monthly, the same kind of drift on a different route got caught in its second week, not its seventh — a call to the account, a discount adjustment, and a personal visit from the manager kept it from becoming a lost customer.

What to actually track

  • Strike rate per account — orders placed over visits made. A sustained drop at one account, even a small one, shows up weeks before revenue does.
  • Order size against that account's own trailing average, not a route-wide average. A shrinking basket at a big account can hide inside a route number that still looks fine.
  • Visit time per stop, by account, not averaged across the route. A rep quietly triaging which stops get real attention is invisible in a route-level average.
  • Days since last order, by account. This is the earliest and simplest signal a store is drifting toward a competitor, and it needs no interpretation.
  • Revenue and units sold still matter — keep them, but treat them as lagging confirmation, not the first line of defense.
  • Review at the account level weekly, not the route level monthly. The window where a save is still possible is measured in weeks, not quarters.

iotoms already logs every stop's arrival, departure and order outcome from the same field app a rep uses to sell, so strike rate, order-size variance and days-since-last-order are numbers in the console rather than a spreadsheet someone has to build — visible per account, per rep and per route, before a quiet drop turns into a lost one.

See your own routes running on iotoms

Book a demo