← Back to home
← Back to the blog
6 min read· DirtFleet team

Cost-per-hour is the only fleet metric most owners need

Asset utilization, MTBF, fuel efficiency — all useful. But cost-per-engine-hour is the one number that exposes the worst unit in the fleet at a glance. Here's how DirtFleet computes it and what to do with it.

Most fleet dashboards drown you in metrics. Asset utilization, MTBF, fuel efficiency, idle %, parts-cost-per-mile — all real, all useful in the right context, all noise on the wrong dashboard. After two years of working with construction shops, the one number that consistently exposes the worst unit in the fleet is cost per engine hour. Here's why, and how DirtFleet computes it.

The formula

cost_per_hour = (sum of repair costs in window) / (sum of engine hours in window)

That's it. Sum every RepairLog cost for the asset over the rolling 90 days; sum every HoursLog delta for the same window; divide. The unit is “dollars of repair spend per hour the machine actually ran.” A 25-ton excavator at $4/hr is healthy. The same model at $14/hr is screaming for an intervention — sell it, rebuild it, or stop putting it on precision work.

Why it beats the alternatives

  • Asset utilization tells you how busy a unit is, not whether it's costing you money. A 90%-utilized truck that costs $20/hr to keep alive is worse than a 50%-utilized one that costs $4/hr.
  • MTBF (mean time between failures) is correct but slow — you need years of failures to compute it confidently. Cost-per-hour gets you a usable signal in 90 days.
  • Fuel efficiency matters but tracks engine condition, not the rest of the machine. A leaky hydraulic system doesn't move the gallons-per-hour number until it cooks the engine.

Common objections

“What about a one-off failure that throws off the average?” — DirtFleet's anomaly detector flags those at write time. The cost-per-hour rollup uses the full window; you accept the noise because the signal still ranks the worst units correctly.

“Two units doing different work aren't comparable.” — Right. Compare within asset class, not across. The fleet-wide leaderboard (fleetCostPerHourTopN) groups by the asset class field for that reason.

“Where do labor costs come in?” — Today we capture them via the labor-hours field on RepairLog but multiply by an org-level shop rate (or skip if un-configured). The number gets more accurate as you fill in per-tech rates, but the relative ranking holds even with the rough number.

What to do with the number

  1. Run the leaderboard once a month. Look at the top 5 worst cost-per-hour units in each asset class.
  2. Cross-reference with age + accumulated hours. A 12-year-old unit at $14/hr is end-of-life. A 2-year-old unit at $14/hr is a defect — open a warranty claim or a vendor conversation.
  3. Decide: rebuild, retire, or rotate. Retiring removes the worst from the average; rotating to lighter duty extends life; rebuilding hits the cost again but resets the curve.

The code

lib/asset-financials.ts: computeAssetSnapshot(orgId, assetId, windowDays) for the per-asset number, fleetCostPerHourTopN(orgId, windowDays, limit) for the manager dashboard's leaderboard.

→ Open the dashboard · → Start free trial