---
title: "FleetOps"
slug: fleetops
category: industry
term_status: established
evidence_status: partially_verified
summary: "FleetOps (fleet operations or fleet management) runs a fleet of vehicles so that they are safe, legal, available and cost as little as possible over their whole life: specifying, assigning, dispatching, fuelling or charging, maintaining and replacing them."
audience: [Beginners, Fleet managers and coordinators, Dispatch and transport leads, Safety and compliance managers, Finance and leaders, Engineers integrating fleet data]
last_verified: 2026-10-23
key_takeaways:
  - "Fleet operations (fleet management) is an established field with an association, a certification and its own regulations; the one-word \"FleetOps\" is mostly a product name."
  - "A fleet is an asset-heavy business: compare vehicles by equivalent annual cost over their life, not by purchase price, and replace them at the age where that cost is lowest."
  - "Utilisation decides fleet size: size to a high percentile of the daily peak of vehicles in use, not to the number of people who would like a vehicle."
  - "Maintenance is a risk control first: a time-based inspection programme, closed-out defect reports and records an inspector can read are the minimum."
  - "Electric vehicles win or lose on duty cycle, charging location and keep period; the same van can be cheapest or dearest depending on where it charges."
  - "Telematics and cameras record people at work; a safety programme needs exposure-normalised measures, coaching, and privacy rules that would survive a data-protection review."
related: [supplychainops, iotops, roboops, procurementops, greenops, edgeops, riskops, peopleops]
---

## What FleetOps is

### In 30 seconds

**FleetOps, better known as fleet operations or fleet management, is the work of running a group of vehicles so that each one is
safe, legal and available when the business needs it, at the lowest cost over its whole life.** It covers choosing and buying
vehicles, assigning and dispatching them, fuelling or charging them, inspecting and maintaining them, keeping drivers safe and
within working-time rules, and deciding when to replace or sell each vehicle.

Reference descriptions of fleet management list leasing and financing, maintenance, licensing and compliance, accident
management, telematics, driver, speed and fuel management, health and safety, and resale.[^wiki-fleet] The discipline makes a
few long-lived decisions well (which vehicle, how many, how long to keep it) and many routine ones (today's routes, this week's
inspections) without letting any become a crash or a roadside prohibition.

Written for beginners, fleet staff, safety and finance leads, and engineers who integrate fleet data. Sources last verified
**2026-10-23**.

::: note Scope of this page
This page is about **road vehicle fleets** run by an organisation; aircraft, ships and rail have their own regulators and are
not covered. Rules differ by country: US federal, EU and UK rules serve as worked examples. Nothing here is legal advice.
:::

### At a glance

| Aspect | Summary |
|---|---|
| Goal | Safe, compliant vehicles available at the right utilisation for the lowest whole-life cost |
| Users | Fleet managers, dispatchers, maintenance planners and workshops, safety managers, drivers, finance |
| Scope | Vehicle lifecycle, dispatch, energy, maintenance, driver safety, working time, right-sizing, TCO, electrification, telematics |
| Prerequisites | None. Basic spreadsheet skills; Python helps for the labs |
| Key outputs | Vehicle register and replacement plan, maintenance records, defect close-outs, routes, compliance records, safety programme, KPIs, cost model |
| Term status | **Established** practice under the names "fleet management" and "fleet operations"; "FleetOps" as one word is mostly a product name |

### Term status: an established field under a product-name label

The practice is established. NAFA Fleet Management Association describes itself as serving "more than 3,500 fleet professionals"
from government and corporate fleets and suppliers,[^nafa] and its Certified Automotive Fleet Manager (CAFM) credential is
organised into eight disciplines: asset, business, financial, information, maintenance and risk management, professional
development, and vehicle fuel management.[^nafa-cafm] Public employers write job classes for it: Pinellas County, Florida, has a "Division Manager, Fleet Operations"
covering maintenance and repair, vehicle specifications, surplus disposal and the fuel programme.[^pinellas] Transport regulations define much of the routine work (see [Methods, rules and frameworks](#methods-rules-and-frameworks)).

The one-word label is different. "FleetOps" names several unrelated products: Fleetbase's open-source "Fleet-Ops" extension,
described as "Open-source fleet, dispatch, transport management, and real-time logistics operations for Fleetbase";[^fleetbase]
an iOS fleet app published by Hypernym LTD;[^appstore] and a transportation and logistics software company whose site now
announces "FleetOps is now Class8".[^class8] No body, standard or community uses "FleetOps" as a discipline name, so this page teaches the established practice
under the Atlas's label and refers to none of these products.

### The problem it solves

Without deliberate fleet operations, five things go wrong.

1. **People get hurt.** NIOSH reports that "motor vehicle crashes are the leading cause of work-related deaths in the U.S." and
   that from 2011 to 2022 more than 21,000 US workers died in work-related motor vehicle crashes, 35% of all work-related
   deaths.[^niosh] Worldwide, the WHO counts about 1.16 million road traffic deaths a year, with speeding, impaired and distracted
   driving and unsafe vehicles among the risk factors.[^who]
2. **The fleet is the wrong size.** US DOE guidance notes that fleets collect specialised, rarely used or unsuitable vehicles
   over time;[^rightsizing] each still costs capital, insurance and depreciation.
3. **Cost is judged at the wrong moment.** The cheapest vehicle to buy can be the dearest to own, and one kept too long costs
   more in repairs and downtime than its replacement.
4. **Maintenance becomes reactive.** Breakdowns cost a tow, a missed job and sometimes a crash; missing inspection records are a
   compliance failure even if the vehicles are fine.
5. **Working-time rules are broken by planning.** A dispatcher who adds one more delivery can push a driver over a limit.

| Before | After |
|---|---|
| Buy the cheapest quote | Compare options on equivalent annual cost, then replace at the economic life |
| Fix things when they break | Time-based inspections, defect reports closed before the vehicle moves, records kept |
| Fuel cards with no reconciliation | Fuel or energy use matched to distance and engine hours, exceptions investigated |

### What FleetOps is not

- **Not logistics, purchasing, the device platform or robot fleets.** Modes and carriers are
  [SupplyChainOps](../supplychainops/), contracts [ProcurementOps](../procurementops/), telematics devices
  [IoTOps](../iotops/), robots [RoboOps](../roboops/); FleetOps runs the organisation's own vehicles and drivers and decides
  *what* to buy, how many and when to replace. Autonomous road vehicles sit on the boundary ([use cases](#use-cases-and-scenarios)).
- **Not a software category.** A telematics subscription does not create a maintenance programme or a safety culture.
- **Not only trucks.** Sales cars, vans, buses, ambulances and employees' own cars used for work (the "grey fleet") are fleets. The UK Health and Safety Executive states that "A grey fleet vehicle is owned and driven
  by a worker for business purposes" and that health and safety law covers these vehicles as well.[^hse]

## Origins, vocabulary and neighbours

### Origins and evolution

Fleet management has no founding date. Rules and technologies turned vehicles into data sources and working time into
something auditable; these are the milestones this page relies on.

| Year | Milestone | Why it matters to fleet operations |
|---|---|---|
| 1959 | Dantzig and Ramser describe "the truck dispatching problem" for fuel deliveries[^vrp-wiki] | The start of vehicle routing as an optimisation problem |
| 1996 | OBD-II required on US cars and light trucks from model year 1996; EOBD in Europe from 2001 (petrol) and 2004 (diesel)[^obd] | A standard diagnostic port for light vehicles |
| 2006 | EU Regulation (EC) 561/2006 sets drivers' hours in road transport[^eu561] | Daily, weekly and fortnightly driving limits checked through tachograph records |
| 2011 | A presidential memorandum directs GSA to develop a vehicle allocation methodology (VAM) for federal fleets[^gf-vam]; the federal regulation now requires agencies to implement one[^vam] | Right-sizing as a documented, repeatable study |
| 2014 | EU tachograph Regulation (EU) 165/2014[^eu-tacho] | Smart tachographs that also record GNSS position |
| 2017 | US ELD rule compliance date, 18 December 2017[^cfr3958] | Electronic hours-of-service records for most US interstate drivers |
| 2024 | EU Intelligent Speed Assistance on all new cars sold from July 2024[^isa]; SAE J3400 recommended practice (September; first a technical information report, December 2023)[^nacs] | Speed assistance built in; a North American connector standard |
| 2025 | EU Data Act applies from 12 September 2025[^dataact] | Users of connected products, cars included, can access and share the data they generate |

### Glossary and mental model

| Term | Meaning | Example |
|---|---|---|
| Duty cycle | How a vehicle is used: distance, speed, stops, load, idle, hours | Parcel van: 120 km, 80 stops, 9 h |
| Utilisation | Share of available time (or days) a vehicle is actually used | Used on 12 of 20 working days = 60% by days |
| Right-sizing | Matching the number and type of vehicles to mission need | Three under-used pickups become one pool vehicle |
| TCO | Total cost of ownership: everything the vehicle costs from purchase to sale[^tco] | Depreciation, fuel, maintenance, insurance, downtime |
| EAC | Equivalent annual cost: TCO converted to a level annual amount so that options with different lives can be compared[^eac] | A van costing 12,900 a year over 7 years versus 12,700 a year over 9 |
| Economic life | The keep period at which EAC is lowest | Replace at year 7, not when it breaks |
| PM | Preventive maintenance: planned inspections and services on a time or distance schedule | Safety inspection every 8 weeks |
| DVIR / walkaround | Driver's inspection of the vehicle and report of defects (US driver vehicle inspection report; UK daily walkaround check) | Cracked mirror reported at end of shift |
| Telematics | Devices that send vehicle position and data (speed, engine hours, faults, fuel) to a server | GPS tracker reading engine data |
| J1939 / OBD-II | Engine-data standards: SAE J1939 (heavy vehicles), OBD-II (light) | Engine hours from the J1939 bus |
| GNSS | Satellite positioning (GPS, Galileo and others) | Tachograph position records |
| CMV / HGV / PSV | Commercial motor vehicle (US); heavy goods and public service vehicle (GB) | An 18-tonne truck is an HGV |
| Upfit | Equipment added to a base vehicle for its job | Racking, beacons |
| BEV / PHEV | Battery-electric vehicle; plug-in hybrid with a combustion engine too | A PHEV beyond winter range |
| Charger, CSMS, OCPP | Charging station; the management system that controls it; the open protocol between them | Depot chargers on a CSMS |
| DPIA | Data protection impact assessment, done before high-risk processing of personal data | Before driver-behaviour monitoring |
| HOS / drivers' hours | Legal limits on driving and working time | US 11-hour driving limit; EU 9-hour daily driving |
| ELD / tachograph | Devices that record duty status or driving time for enforcement | US ELD; EU smart tachograph |
| Dwell time | Time a vehicle is parked between uses; for EVs, the window in which it can charge | 13 hours overnight at the depot |

Mental model: **a fleet converts capital into available, safe vehicle-hours.** Every decision moves one of four dials:

1. **How many vehicles** (right-sizing, utilisation).
2. **Which vehicles and for how long** (specification, TCO, economic life, EVs).
3. **How each vehicle-hour is used** (dispatch, routing, fuel, idling).
4. **How safe and legal each vehicle-hour is** (maintenance, inspections, driver safety, working time).

The dials interact: fewer vehicles means less slack for breakdowns; an EV changes energy, maintenance and dispatch at once.

### How FleetOps relates to other Ops

::: figure FleetOps and its neighbours: who owns which decision
```mermaid
flowchart TB
  PR["ProcurementOps"]
  SC["SupplyChainOps"]
  IO["IoTOps"]
  FL["FleetOps: vehicles, drivers, cost"]
  PE["PeopleOps"]
  RK["RiskOps"]
  RO["RoboOps"]
  GR["GreenOps"]
  PR -->|"contracts"| FL
  SC -->|"demand"| FL
  IO -->|"device data"| FL
  FL -->|"training needs"| PE
  FL -->|"road risk"| RK
  FL -.->|"remote assistance"| RO
  FL -.->|"carbon method"| GR
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class FL core
  class PR,SC,IO,RO,GR,RK,PE neutral
```
Text equivalent: FleetOps (vehicles, drivers, cost) sits in the centre. ProcurementOps hands it vehicle and lease contracts,
SupplyChainOps hands it transport demand, and IoTOps hands it device data. FleetOps passes driver training needs to PeopleOps
and its road risk to RiskOps. Dotted links show that it shares remote-assistance and exception-handling patterns with RoboOps
(see the autonomous-fleet use case) and borrows the carbon accounting method from GreenOps, without handing work to either.
:::

| Neighbour | Shared ground | Choose the neighbour when |
|---|---|---|
| [SupplyChainOps](../supplychainops/) | Transport, delivery performance | Choosing modes, carriers or load plans, or buying transport as a service |
| [ProcurementOps](../procurementops/) | Vehicles, leases, fuel cards, workshop contracts | You need the approval, contract and payment controls |
| [IoTOps](../iotops/) | Telematics devices | You run the device platform: provisioning, firmware, device security |
| [RoboOps](../roboops/) | Fleets, remote monitoring | The fleet is robots in warehouses, hospitals or on pavements |
| [EdgeOps](../edgeops/) | Remote, intermittently connected assets | You run compute at remote sites |
| [GreenOps](../greenops/) | Emissions and energy | The emissions are from IT and cloud |
| [RiskOps](../riskops/) | Road risk as enterprise risk | You are building the enterprise risk method itself |
| [PeopleOps](../peopleops/) | Driver hiring, training, discipline | You are designing the HR process |

## Principles and operating model

### Charter and principles

No body publishes a "FleetOps manifesto"; this charter is **this Atlas's proposal**. **Mission:** provide the vehicle-hours
the organisation needs, safely and legally, at the lowest whole-life cost, with records that prove it.

| Principle | In practice | Check |
|---|---|---|
| Safety before utilisation | A safety-critical defect or working-time limit stops the vehicle | Defects certified before reuse; no hours-breaching dispatches |
| Decide on life cost, not price | Buy, keep and replace on TCO or EAC with stated assumptions | Each acquisition has a cost model and replacement year |
| Measure per unit of exposure | Safety, fuel and cost per km, hour or trip, not raw counts | KPI definitions name their denominators |
| Maintenance is planned | Time-based inspections, linked to distance where useful | PM compliance report; records per vehicle |
| Data serves a decision | Each feed has a purpose, retention and access rule | Data inventory; privacy assessment |
| Drivers are operators, not suspects | Monitoring is proportionate, transparent, coaching first | Coaching records outnumber disciplinary ones |

### Fundamentals: the building blocks

Five building blocks appear in every fleet.

1. **The asset register.** One record per vehicle: identity, class, mission, owner, ownership type, odometer and engine hours,
   planned replacement date and status (columns in the [reference implementation](#reference-implementation-operating-artefacts)).
2. **The driver register.** Licences, categories and expiry dates, fitness requirements where they apply, training, and
   permitted vehicles. In the US, Driver Fitness is one of the safety categories carriers are measured on.[^basics]
3. **The work plan.** Routes, schedules and bookings: where utilisation and working-time rules collide.
4. **Energy.** Fuel cards, tanks, chargers and tariffs: often the largest variable cost, and where fraud and waste hide.
5. **Maintenance and inspection.** Schedules, defects, work orders, parts, workshop capacity, and the records that prove it.

Telematics, fleet software and the cost model sit on top of these blocks; they do not replace them.

### Roles, ownership and RACI

Titles vary with size (a 30-vehicle fleet may have one coordinator for all of this); the roles matter more.

| Role | Owns | Typical skills |
|---|---|---|
| Fleet manager | Policy, fleet size and mix, replacement plan, budget, suppliers | Asset economics, contracts |
| Dispatcher / transport planner | Daily allocation of vehicles and drivers, routes | Routing, working-time rules |
| Maintenance planner / workshop manager | PM schedule, work orders, defect close-out, parts | Vehicle technology, regulation |
| Safety and compliance manager | Safety programme, working-time compliance, investigations, audits | Regulation, coaching |
| Driver | Pre-use check, defect reports, safe and legal driving, duty records | Licence category, vehicle checks |
| Finance partner | Budgets, depreciation, lease accounting, cost assumptions | Capital budgeting |
| Data or systems owner | Fleet software, telematics integration, data access | Integration, data protection |

A RACI for recurring decisions (R = responsible, A = accountable, C = consulted, I = informed), **proposed by this Atlas**:

| Decision or task | Fleet manager | Dispatcher | Maintenance | Safety and compliance | Driver | Finance |
|---|---|---|---|---|---|---|
| Vehicle specification and replacement | A/R | C | C | C | C | C |
| Daily allocation and routing | I | A/R | I | C | I | – |
| Pre-use check and defect report | I | I | C | I | A/R | – |
| Defect repair and return to service | I | I | A/R | C | I | – |
| Working-time compliance | I | R | – | A | R | – |
| Collision investigation | C | C | C | A/R | C | I |
| Driver coaching after safety events | I | – | – | A/R | C | – |
| Fuel and charging exceptions | A | C | – | C | C | R |
| Telematics data access and retention | A | C | C | C | I | – |

The rule that matters most: **whoever decides a defect is safe to drive with must not be measured on keeping the vehicle on
the road.**

### Lifecycle of a vehicle

::: figure The vehicle lifecycle and its main decision points
```mermaid
flowchart TB
  A["Need: mission and duty cycle"] --> B["Specify: class, powertrain, upfit"]
  B --> C["Acquire: buy, lease or rent"]
  C --> D["Commission: register, upfit, telematics"]
  D --> E["Operate: assign, dispatch, fuel or charge"]
  E --> F["Inspect and maintain"]
  F --> E
  E --> G{"Replacement review: past economic life?"}
  G -->|"no"| E
  G -->|"yes"| H["Remarket or dispose: wipe data"]
  H --> A
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  class A,B,C,D,E,F,H core
  class G decision
```
Text equivalent: A need with a mission and duty cycle leads to a specification, then acquisition by purchase, lease or rental,
then commissioning with registration, upfit and telematics. In operation the vehicle is assigned, dispatched and fuelled or
charged, and loops through inspection and maintenance. A periodic replacement review asks whether the vehicle is past its
economic life; if not, it stays in service, and if so it is remarketed or disposed of, with its data wiped, and the need is
reassessed.
:::

Easy to skip: **commissioning** telematics correctly (a device on the wrong ignition source gives wrong idle data for years);
a *scheduled* **replacement review**; and **disposal** that removes the device, deletes paired phones and stored addresses, and
closes fuel cards and toll tags.

### Operating model and governance

Four cadences, **proposed by this Atlas**; regulated fleets may need some items more often.

| Cadence | Forum | Inputs | Outputs |
|---|---|---|---|
| Daily | Dispatch stand-up (10 minutes) | Vehicles off road, open defects, drivers available and their remaining hours, today's work | Allocation, swaps, escalations |
| Weekly | Maintenance and safety review | PM due and overdue, defects open more than 48 hours, safety events, roadside inspection results | Workshop plan, coaching list |
| Monthly | Fleet performance review | KPI pack (see [Metrics and KPIs](#metrics-and-kpis)), fuel and energy exceptions, cost per kilometre, utilisation | Actions, policy changes, budget variance |
| Annual | Fleet plan | Replacement candidates by EAC, right-sizing study, EV readiness, budget | Replacement list, fleet size target, capital request |

Write down the escalations: safety-critical defect → off road until certified; a dispatch that would breach working time →
back to the planner; injury collision → preserve data.

## Architecture and workflow

### Reference architecture

A logical architecture: small fleets run most boxes as features of one product; large ones integrate several.

::: figure Reference architecture: from vehicle signals to fleet decisions
```mermaid
flowchart LR
  subgraph SRC["Sources"]
    direction TB
    K["Dash cameras"]
    E["ELD or tachograph"]
    V["Vehicle gateway"]
    F["Fuel cards, tanks"]
    C["Chargers (OCPP)"]
  end
  subgraph CORE["System of record"]
    direction TB
    R["Registers"]
    T["Trips, events, duty"]
    M["Maintenance"]
    N["Energy, costs"]
  end
  subgraph USE["Decisions"]
    direction TB
    D["Dispatch, routing"]
    S["Safety coaching"]
    A["Compliance records"]
    P["Replace, right-size"]
  end
  K --> T
  E --> T
  V --> T
  V --> M
  F --> N
  C --> N
  T --> N
  R --> D
  T --> D
  T --> S
  T --> A
  M --> A
  T --> P
  M --> P
  N --> P
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class R,M,T,N core
  class V,E,K,F,C,D,S,P,A neutral
```
Text equivalent: Five sources feed the fleet system of record: the vehicle gateway (GPS plus the J1939 or OBD data bus), the
ELD or tachograph, dash cameras, fuel cards and depot tanks, and chargers reporting through OCPP. The system of record holds the
asset and driver registers; maintenance and work orders (fed by the gateway's engine hours and fault codes); trips, events and
duty status; and energy and costs, where fuel and charging records are matched to trips. Four decisions draw on it: dispatch
and routing, safety coaching, replacement and right-sizing (from maintenance, trips and energy costs), and compliance records.
:::

| Component | Job | Design choice and trade-off |
|---|---|---|
| Vehicle gateway | Position, speed, ignition, engine hours, fault codes | OEM-embedded telematics avoids installs; aftermarket devices give one data model across brands. Heavy vehicles expose data through SAE J1939,[^j1939] light vehicles through OBD-II[^obd] |
| ELD / tachograph | Legal duty-status or driving-time record | The legal record will disagree with telematics trip data at the edges |
| Dash cameras | Video evidence, AI-detected events | Highest privacy impact: driver-facing or not is a policy decision |
| Fuel and energy | Transactions, tank levels, charging sessions | Card odometers are unreliable; match transactions to telematics position |
| Chargers and CSMS | Session control, load management | OCPP is the open protocol between charging stations and charging management systems;[^ocpp] OCPP chargers let you change the software later |
| System of record | Registers, work orders, trips, energy and costs | Most data-quality problems are identity problems (a device moved between vans) |
| Integration | APIs, file drops | Under the EU Data Act, users of connected products such as cars can access and share the data their use generates[^dataact] |

**Trust boundaries.** Telematics and camera data are personal data about drivers: keep live location to dispatch and safety,
give finance aggregates, and treat API tokens as credentials. Chargers and the CSMS are internet-connected controls that can
stop tomorrow's work: keep chargers on their own network segment, off the corporate LAN; give CSMS users named accounts; and
require an OCPP security profile that uses TLS. Profile 3 adds client-side certificates for the chargers,[^ocpp-profiles] and a
2023 TU Wien study for Austria's electricity association concluded that "OCPP 2.0.1, or OCPP-J 1.6 (JSON/Websocket) with
security extensions when using OCPP security profile 3, are suitable for secure charging station control".[^ocpp-tuw]

### End-to-end workflow: one vehicle-day

Happy path: check, drive a planned route within working-time limits, refuel or charge, return, data lands. The exception
that matters most is a defect:

::: figure A defect found on the walkaround: the handoffs
```mermaid
sequenceDiagram
  autonumber
  participant A as App
  participant D as Driver
  participant X as Dispatch
  participant P as Planner
  participant W as Workshop
  D->>A: Brake hose cracked
  A->>P: Defect, safety-critical
  P->>X: Van off road
  X->>D: Use spare van
  P->>W: Priority work order
  W->>P: Repaired, certified
  P->>X: Van back in service
```
Text equivalent: The driver's walkaround finds a cracked brake hose and records it in the driver app. The app sends a defect
report flagged as safety-critical to the maintenance planner, who marks the vehicle off road and tells the dispatcher, who
swaps the driver to a spare van. The planner raises a priority work order with the workshop; the workshop repairs and certifies
the defect; the planner returns the vehicle to service and tells the dispatcher.
:::

What the regulations ask of this flow, in two jurisdictions:

- **US (interstate commercial motor vehicles).** Drivers report defects in specified parts (brakes, steering, lights, tyres,
  wheels, coupling devices and others) at the end of each day's work; no report is needed if none is found. Before the vehicle
  runs again, the carrier repairs safety-affecting defects and certifies the repair, keeping both for three months.[^cfr39611]
- **Great Britain (HGVs and PSVs).** The DVSA guide states that "The driver is always legally responsible for the condition of
  the vehicle while in use", requires at least one walkaround check every day, and expects drivers' defect reports to be kept
  for at least 15 months.[^dvsa]

Other exceptions to design: a working-time limit reached mid-route (re-plan), a collision (preserve data), and a van that did
not charge overnight ([worked runbook](#worked-runbook-the-depot-did-not-charge)).

## The economics of an asset-heavy operation

Where fleet decisions are hardest and costliest: what a vehicle really costs, how many you need, how to maintain them, and when
to replace them (including with an electric vehicle).

### Total cost of ownership and equivalent annual cost

Total cost of ownership is "a financial estimate intended to help buyers and owners determine the direct and indirect costs of
a product or service"; for a vehicle it includes depreciation, fuel, insurance, financing, repairs, fees and taxes, maintenance,
and opportunity and downtime costs.[^tco] TCO on its own has a flaw: two options kept for different periods cannot be compared
by their totals. The fix is the **equivalent annual cost** (EAC), described as "the cost per year of owning and operating an
asset over its entire lifespan": take the net present value of all costs (net of resale) and divide it by the annuity factor
for the keep period.[^eac]

```text
NPV(n)  = price + sum over years t = 1..n of  running_cost(t) / (1 + r)^t
                - resale(n) / (1 + r)^n
EAC(n)  = NPV(n) / A(n, r),   where A(n, r) = (1 - (1 + r)^-n) / r
Economic life = the n with the lowest EAC(n)
```

As the keep period grows, capital cost per year falls and running cost per year rises (maintenance, repairs and downtime grow
with age). The sum is U-shaped; its bottom is the **economic life**. The chart shows Lab 1's two illustrative vans.

::: figure Lab 1 output: equivalent annual cost by keep period for two illustrative vans
```mermaid
%%{init: {"xyChart": {"width": 440, "height": 360}, "themeVariables": {"xyChart": {"plotColorPalette": "#c9800f, #16756f"}}}}%%
xychart-beta
  title "EAC per year (orange: diesel, teal: electric)"
  x-axis "Keep period (years)" [3, 4, 5, 6, 7, 8, 9, 10]
  y-axis "EAC per year" 12000 --> 16500
  line [13848, 13313, 13029, 12903, 12896, 12993, 13189, 13484]
  line [16165, 14803, 13957, 13402, 13041, 12828, 12737, 12758]
```
Text equivalent: Two lines of equivalent annual cost against keep periods of 3 to 10 years. The diesel van (orange) falls from
13,848 at 3 years to a minimum of 12,896 at 7 years, then rises to 13,484 at 10 years. The electric van (teal) starts higher,
16,165 at 3 years, falls below the diesel line between 7 and 8 years, and reaches its minimum of 12,737 at 9 years before
edging up to 12,758 at 10. With these inputs the electric van is cheaper only if it is kept 8 years or more. The
vertical axis starts at 12,000, not zero, so the gaps look larger than they are: from 6 years on the two vans differ by 1% to 6%.
:::

Three lessons that hold beyond these numbers: **the bottom is flat** (6 to 8 years differ by under 1% for the diesel;
three years late costs a lot); **high-capital, low-running-cost vehicles need longer keep periods**, so a blanket five-year
policy penalises EVs; and **downtime belongs in the model**, or unreliable old vehicles are kept too long.

**The replacement rule for a vehicle you already own** asks what one *more* year costs: the resale value you give up (resale
at n − 1 grown by a year's interest, minus resale at n) plus year n's running cost. Replace when that exceeds the best
replacement's EAC at its own economic life. With Lab 1's inputs, keeping
the diesel van through year 7 costs about 12,848 and through year 8 about 13,858, against 12,737 a year for a new electric van
charged at the depot: replacing at the end of year 6 or 7 is close to a draw, and keeping it into year 8 costs about 1,100 more
than replacing. (Illustrative; same inputs plus the marginal-cost formula.)

::: caution The model is only as good as its inputs
Resale values, maintenance growth and energy prices are forecasts: state them, test sensitivity (Lab 1) and revisit with
actuals. DOE's AFLEET tool (Argonne National Laboratory) estimates cost of ownership, petroleum use and emissions for
conventional and alternative-fuel vehicles, a cross-check for US fleets.[^afleet]
:::

### Utilisation and right-sizing

Measure utilisation by **days** for pool and service vehicles, **hours** for all-day vehicles, **distance** where cost follows
kilometres; each misleads alone (30 km every day is high on days, low on distance).

**Right-sizing** asks whether each vehicle should exist and is the right type. US DOE guidance reviews mission and drive
cycle, utilisation, class fit and age, solicits driver input through surveys or meetings, and evaluates each vehicle's business
case for reassigning, replacing, eliminating or using a more fuel-efficient vehicle. It lists alternatives to owning a vehicle, such as motor pools, sharing across offices, stipends, public transport
and short-term rental, and notes that "a 10% reduction in vehicle weight can improve fuel economy by 6%–7%".[^rightsizing] US
federal agencies must implement a structured vehicle allocation methodology, and GSA recommends repeating the study at least
once every five years.[^vam]

**Sizing the fleet from data** asks how many vehicles are in use *at the same time* on a busy day. Lab 2's method:

1. From trip data, count the vehicles in use in each 15-minute slot of each day.
2. Take each day's peak.
3. Choose a planning percentile of those daily peaks (the 90th, say: nine days in ten are covered).
4. Add a spare allowance for maintenance and breakdowns, sized to your measured off-road rate.
5. Cover the remaining peak days with rental, pool swaps or schedule changes, and price them.

In Lab 2's data, eight of the ten vans (seven at the 90th percentile plus 10% spares) would cover nine days in ten. Low-use vans
are candidates for review, not disposal: they may carry special equipment or already be the spares.

### Maintenance strategy: reactive, preventive, condition-based

| Strategy | Trigger | Strengths | Weaknesses | Fits |
|---|---|---|---|---|
| Reactive (run to failure) | Breakdown | No planning cost | Roadside failures, safety risk, unpredictable downtime | Non-safety items with cheap, quick failure (a courtesy light) |
| Preventive, time or distance based | Calendar or odometer interval | Predictable; easy to audit; regulators recognise it | Some work is done before it is needed | Safety inspections and legally required checks |
| Condition-based / predictive | Measured condition: fault codes, oil analysis, brake wear, battery health | Work done when needed; fewer surprises | Needs reliable data and a model; harder to audit | High-cost components with measurable wear |

Time-based maintenance is criticised because equipment is "maintained whether it needs it or not"; predictive maintenance
instead uses "the current condition of equipment" to time the work.[^pdm] That is not a reason to drop time-based inspections.
Safety inspections are a legal and evidential baseline in many places: US carriers "must systematically inspect, repair, and
maintain" every vehicle under their control and keep records that include "A means to indicate the nature and due date of the
various inspection and maintenance operations".[^cfr3963] The British DVSA guide says inspection frequency "would normally range
between 4 to 13 weeks", set by the deterioration expected for the vehicle's age, load, terrain and use, and that inspections
should follow a time-based pattern where practical, with mileage-based programmes "linked to time".[^dvsa]

The practical answer is layered: time-based safety inspections as the floor, condition-based work where data is good, and
reactive repair only where failure is cheap and harmless.

**Tyres** are both a large cost and a safety item. In the US, front tyres on buses, trucks and truck tractors need at least
4/32 inch of tread and other tyres 2/32 inch;[^cfr39375] in Great Britain, since 1 February 2021 tyres over 10 years old may
not be used on the front steered axles of HGVs, buses and coaches or on single wheels of minibuses.[^tyres10] Record tread
depth, pressure and date code at each inspection, and set replacement thresholds above the legal minimum.

::: figure Choosing a maintenance strategy for a component
```mermaid
flowchart TB
  Q1{"Failure safety-critical or legally inspected?"}
  Q1 -->|"yes"| PM["Time-based inspection as the floor"]
  Q1 -->|"no"| Q2{"Failure expensive or causes downtime?"}
  PM --> Q3{"Condition measurable and trusted?"}
  Q2 -->|"no"| RF["Run to failure, fix on report"]
  Q2 -->|"yes"| Q3
  Q3 -->|"yes"| CB["Add condition-based triggers"]
  Q3 -->|"no"| TB["Time or distance interval"]
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  class Q1,Q2,Q3 decision
  class PM,CB,TB core
  class RF risk
```
Text equivalent: First ask whether a failure is safety-critical or legally inspected. If yes, a time-based inspection is the
floor, and you then ask whether the component's condition can be measured and trusted: if so, add condition-based triggers; if
not, keep a time or distance interval. If the failure is not safety-critical, ask whether it is expensive or causes downtime:
if not, run it to failure and fix on report; if so, go to the same measurability question.
:::

### The electric vehicle decision

Electrification changes the cost structure (more capital, less energy and maintenance), the operating model (charging
constrains dispatch) and the risks (cold-weather range, grid lead times). It is a duty-cycle decision first.

**What changes in the cost model.** The US DOE notes "far fewer moving parts", that "Brake wear is significantly reduced due to
regenerative braking", and common 8-year/100,000-mile battery warranties.[^ev-maint] Energy cost depends on where you charge (depot
off-peak, public rapid, reimbursed home); [Lab 1](#lab-1-beginner-tco-equivalent-annual-cost-and-economic-life)'s "Try this" shows how far a public price moves the break-even.

**Range is a distribution, not a number.** fueleconomy.gov reports that at 20 °F (−7 °C), with cabin heating, an EV's fuel
economy can drop roughly 39% and its range 41% in mixed driving, citing a 2019 AAA study; conventional cars lose about 15% in
city driving at that temperature.[^cold] Plan routes against winter range with a reserve, not against the brochure figure.

**Charging is infrastructure.** US DOE figures: Level 2 AC charging delivers 2.9 to 19.2 kW, about 25 miles (40 km) of range per
hour; DC fast charging delivers up to 500 kW, roughly 100 to 200+ miles of range in 30 minutes, depending on the vehicle and
state of charge.[^charging] Depot vans with long dwell times usually manage on Level 2; trucks and double-shifted
vehicles may need DC. DOE advises engaging utilities "early in the infrastructure planning process" and
lists demand charges among operating costs.[^infra] Managed (smart) charging spreads load to keep the site under its connection
limit; OCPP supports smart charging with charge profiles and load balancing.[^ocpp] Connectors matter for mixed fleets: SAE
published J3400 (the North American Charging System) as a recommended practice in September 2024, after a technical
information report in December 2023, while CCS remains common.[^nacs]

**Policy is moving; date-stamp it.** Example (as of 23 October 2026): a May 2025 settlement with 16 states required California's
CARB to propose repealing the high-priority and drayage parts of its Advanced Clean Fleets rule and to send an approved repeal
to the Office of Administrative Law (OAL) by 31 August 2026.[^fw-settle] On 25 September 2025 CARB's board voted to repeal the
parts that apply to federal and private fleets, drayage included, and gave state and local government fleets more time: the 50%
zero-emission purchase requirement moves back three years and the 100% requirement to 2030.[^carb-2025] Whether OAL approved
the repeal could not be confirmed from an openable source (a trade report that it took effect on 10 September 2026 could not be
fetched). Check current status before relying on any mandate or incentive.

::: figure Should this group of vehicles go electric now?
```mermaid
flowchart TB
  A{"Winter daily distance within 70% of usable range?"}
  A -->|"no"| N1["Not yet: route redesign, PHEV or wait"]
  A -->|"yes"| B{"Parked at a site you control with dwell time to charge?"}
  B -->|"no"| C{"Reliable public or home charging at a known price?"}
  C -->|"no"| N2["Not yet: secure charging first"]
  C -->|"yes"| D
  B -->|"yes"| E{"Site power available in time?"}
  E -->|"no"| N3["Start utility request; pilot elsewhere"]
  E -->|"yes"| D{"EAC lower at your keep period and charging price?"}
  D -->|"no"| N4["Keep current powertrain; revisit next year"]
  D -->|"yes"| P["Pilot 5-10 vehicles, measure, then scale"]
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  class A,B,C,D,E decision
  class N1,N2,N3,N4 risk
  class P core
```
Text equivalent: Does winter daily distance fit within 70% of usable range? If not: not yet (re-cut routes, plug-in
hybrids, or wait). If so: do vehicles park at a site you control with time to charge? If not, is reliable public or home
charging available at a known price (if not, secure charging first)? If you control the site, is power available in time (if
not, start the utility request and pilot elsewhere)? Once charging is solved: is EAC lower at your keep period and charging
price? If not, keep the current powertrain and revisit next year; if so, pilot five to ten vehicles, measure, then scale. The
70% threshold is this Atlas's planning margin, not a standard.
:::

## Practices, rules and tools

### Core practices and playbooks

| Practice | Goal | Owner | Verification |
|---|---|---|---|
| Preventive maintenance | No vehicle runs past an inspection or service due date | Maintenance planner | PM compliance (on time ÷ due) |
| Defect reporting and close-out | No safety-critical defect is driven | Driver, then maintenance | Closed before next use; open-defect age |
| Fuel and energy management | Pay only for energy fleet vehicles used, and use less | Fleet manager with finance | Exceptions investigated; litres or kWh per 100 km |
| Driver safety programme | Fewer collisions and injuries | Safety manager | Collisions per million km; repeat events |
| Dispatch and routing | Fewer kilometres, within working-time limits | Dispatcher | Planned versus actual km; hours breaches |
| Grey fleet control | Workers' own cars used for work are fit, insured and licensed | Fleet manager with HR | Share of business mileage with valid checks |

Two playbooks deserve detail.

**Fuel and energy reconciliation.** Match each card transaction to the vehicle's position at that time, and compare each
vehicle's litres (or kWh) per 100 km with its class median (rules in the [reference implementation](#reference-implementation-operating-artefacts)). US
DOE estimates that US vehicles waste more than 6 billion gallons of fuel a year idling, about half of it by passenger
vehicles, and says idling "can usually be reduced without compromising driver comfort or vehicle equipment operations".[^idle]
DOE also cites analysis that aggressive driving lowers fuel economy by 15% to 30% at highway speeds and 10% to 40% in stop-and-go
traffic.[^driving] Smoother driving serves fuel and safety at once.

**Driver safety programme.** The UK HSE frames road risk as safe journey, safe driver or rider, and safe vehicle, and states
that "Health and safety law applies to work activities on the road in the same way as it does on a fixed site".[^hse]

1. *Safe driver:* licence checks at hiring and at intervals; vehicle induction; fatigue and phone rules; coaching. US carriers
   must obtain each CMV driver's motor vehicle record (MVR) at least once every 12 months and review it;[^cfr39125] in Great
   Britain, DVLA's online service shows a driver's entitlements, penalty points and disqualifications when the driver gives a
   check code, which must be used within 21 days and only once.[^dvla]
2. *Safe vehicle:* specification (including driver assistance), inspection and defect close-out. In the EU, Article 6 of
   Regulation (EU) 2019/2144 requires Intelligent Speed Assistance on motor vehicles of categories M and N, so vans and trucks
   as well as cars;[^isa-reg] the Commission's summary gives July 2024 for all new cars and says "The driver is always in
   control and can easily override the ISA system".[^isa] Check the Regulation's Annex II for the dates of heavier categories.
3. *Safe journey:* schedules drivable within limits; no calls to drivers at the wheel; weather plans.

On speed, the WHO states that "every 1% increase in mean speed produces a 4% increase in the fatal crash risk".[^who]
ISO 39001 offers a road-safety management-system frame.[^iso39001] Collisions follow the [checklist](#checklists) and feed the
claims process in [Cost, capacity and sustainability](#cost-capacity-and-sustainability).

### Working-time rules: US hours of service and EU drivers' hours

Two regimes as examples (as of October 2026; other countries and vehicle types differ):

| Rule | US, property-carrying CMV (49 CFR 395.3)[^cfr3953] | EU, Regulation (EC) 561/2006[^eu561] |
|---|---|---|
| Rest before driving | 10 consecutive hours off duty | Daily rest at least 11 hours (may be cut to 9 hours up to three times a week) |
| Daily driving | 11 hours within the 14-hour window | 9 hours, extendable to 10 hours twice a week |
| Daily window | No driving after 14 consecutive hours since coming on duty | (Set by the daily rest rules) |
| Break | 30 consecutive minutes (off duty, sleeper berth or on duty not driving) before driving beyond 8 hours | At least 45 minutes (may be split 15 + 30) after 4½ hours of driving |
| Weekly | 60 hours on duty in 7 days, or 70 in 8 days if operating every day; a 34-hour off-duty period restarts the count | 56 hours of driving in a week, 90 hours in two weeks; weekly rest 45 hours (24 hours every second week) |
| Records | ELD for most carriers since 18 December 2017[^cfr3958] | Tachograph records, checked at the roadside and at company premises |

Exceptions change the picture. In the US, drivers who stay within a 150 air-mile radius of their work reporting location, are
released within 14 consecutive hours and have at least 10 hours off between shifts are exempt from the record-of-duty-status and
ELD requirements; and a driver who meets adverse driving conditions may drive up to two additional hours to complete the run or reach a place
offering safety.[^cfr3951]
Paper logs may replace an ELD for drivers needing records on no more than 8 days in 30, some driveaway-towaway work and
vehicles made before model year 2000.[^cfr3958] In the EU, tachographs are mandatory in new goods vehicles over 3.5 tonnes and new passenger vehicles for
more than nine people, and from 1 July 2026 also in vehicles of 2.5 to 3.5 tonnes engaged in international hire-or-reward
transport; smart tachographs also record the vehicle's GNSS position at certain times.[^eu-tacho]

::: warning A planning tool is not a compliance tool
The legal record is the ELD or tachograph. Use checks like Lab 3's to plan and spot patterns, never to decide whether a
driver may legally drive.
:::

### Methods, rules and frameworks

Separate what is mandatory from what is merely useful.

| Item | Type | What it gives a fleet |
|---|---|---|
| 49 CFR Parts 395 and 396 (US)[^cfr3953][^cfr3963] | Regulation (mandatory for covered carriers) | Hours of service, ELDs, systematic maintenance, inspection reports, record retention |
| Regulation (EC) 561/2006 and (EU) 165/2014[^eu561][^eu-tacho] | Regulation (EU) | Drivers' hours and tachographs |
| DVSA *Guide to maintaining roadworthiness* (GB)[^dvsa] | Regulator guidance, used in licensing decisions | Inspection intervals, walkaround checks, records, brake testing |
| FMCSA safety categories (BASICs)[^basics] | Regulator measurement system (US) | Seven categories, from unsafe driving and hours of service to vehicle maintenance and crash indicator. A revised method approved in November 2024 renames them compliance categories, with the launch date to follow in a separate notice;[^fmcsa-sms] none was found by October 2026 |
| UK ICO guidance on monitoring workers[^ico] | Regulator guidance (UK data protection) | When vehicle monitoring and cameras are lawful and proportionate |
| GSA vehicle allocation methodology (US federal)[^vam] | Regulation for federal agencies; useful method for others | Structured right-sizing study |
| ISO 39001[^iso39001] | Voluntary management-system standard | Road traffic safety management system |
| OCPP, SAE J3400[^ocpp][^nacs] | Industry standards | Charger management, connectors |
| US EPA SmartWay[^smartway] | Voluntary public–private programme | Freight emissions benchmarking for carriers and shippers |

### Tooling landscape

Named tools are examples whose descriptions were checked on 2026-10-23, not recommendations.

| Category | Job | Examples (verified descriptions) | Selection criteria |
|---|---|---|---|
| Telematics platform | Position, trips, engine data, events, alerts | Traccar (self-hostable, open source; trip reports, geofence and harsh-driving alerts);[^traccar] commercial platforms such as Samsara (safety scores from gateway and camera events)[^samsara] | Device support for your mix; API and bulk export; data ownership on exit |
| Fleet management information system | Registers, maintenance, work orders, costs | Fleetbase Fleet-Ops (AGPL-3.0-or-later; dispatch, maintenance schedules, telematics integrations)[^fleetbase] | Workshop fit; integration with finance |
| ELD / tachograph tools | Legal duty-status records, downloads, infringement reports | No supplier named: US carriers may use only ELDs on FMCSA's registered list,[^cfr39522] so start from the regulator's list | Regulatory status in your jurisdiction; driver usability |
| Video telematics | Event video, AI event detection, coaching | Samsara's front-facing and dual-facing AI dash cams, whose events feed its safety scores[^samsara] | Privacy controls (audio off, driver-facing optional, retention); false-positive rate |
| Fuel cards and depot fuel | Transactions, controls | No issuer named: card networks and controls differ by country | Merchant restrictions, per-card limits, data feed |
| Charging management (CSMS) | Session control, smart charging, billing | OCPP-based systems[^ocpp] | OCPP version support, load management, tariff integration |
| Routing and scheduling | Plans routes under constraints | Google OR-Tools solver library;[^ortools] commercial routing products | Constraints covered (time windows, capacities, breaks); map data |

**Lock-in.** Leased devices mean a reinstall campaign to switch, and history may export only in summary: test a full export and
put export format and device ownership in the contract (with [ProcurementOps](../procurementops/)).

### Automation and AI

Automation helps where decisions are frequent, rules clear and data reliable; it harms where it hides safety judgement or
punishes drivers for sensor noise.

- **Route optimisation** is NP-hard (the vehicle routing problem generalises the travelling salesman problem).[^vrp-wiki]
  OR-Tools' documentation says "Vehicle routing problems are inherently intractable" and that its solver "sometimes returns
  solutions that are good, but not optimal".[^ortools] Heuristics (Lab 4) get much of the gain, and the objective
  matters as much as the algorithm: OR-Tools' VRP example minimises the longest route, because minimising total distance alone
  can push all the work onto one vehicle.[^ortools-vrp]
- **AI-detected driving events** (phone use, close following) widen what can be coached and what is recorded about people;
  review each event before it reaches a score that affects pay or discipline.
- **Predictive maintenance** needs failure history most small fleets lack; start with fault-code alerts. **Language models**
  can summarise workshop notes, but not decide fitness to drive.
- **Autonomous vehicles** change who operates, not whether operations exist. Waymo describes "fleet response" agents who answer
  questions from the automated driver, which "is in control of the vehicle at all times" and "may come to a stop if it determines
  that is the safest course of action"; when needed, roadside assistance retrieves the vehicle manually.[^waymo] Remote
  assistance, retrieval, cleaning, charging and maintenance remain fleet operations.

## FleetOps in practice

### Reference implementation: operating artefacts

Illustrative fleet: 120 vans, 15 rigid trucks, two depots, telematics with an API, an in-house workshop. Adapt intervals to
your regulator and the manufacturer.

**1. Maintenance schedule as data**, reviewed and auditable, so software can compute due dates.

_Example status: YAML syntax-checked by the validator; not executed. Intervals are illustrative; the file is data for your
maintenance software, which applies the earliest trigger._

```yaml
# pm-schedule.yaml: whichever trigger comes first raises the work order
version: 3
owner: maintenance-planner
reviewed: 2026-10-01
classes:
  van-3.5t:
    safety_inspection: {every_weeks: 10, every_km: null}
    service_a: {every_months: 12, every_km: 30000}
    brake_check: {every_weeks: 10}
  rigid-18t:
    safety_inspection: {every_weeks: 6}       # general haulage band, DVSA guide
    service_a: {every_months: 6, every_km: 40000}
    brake_performance_test: {at: [safety_inspection]}
overrides:                                    # applied on top of the class rules
  - when: {age_years_gte: 12}                 # older vehicles inspected more often
    set: {safety_inspection: {every_weeks: 6}}
tolerances:
  overdue_grace_days: 0                       # safety inspections: no grace
  service_grace_km: 1000
escalation:
  overdue_safety_inspection: vehicle_off_road
  overdue_service: notify_fleet_manager
```

**2. Fuel and energy exception rules**, applied to every transaction.

_Example status: YAML syntax-checked. The `when` expressions are illustrative pseudo-code for a rule engine, not the syntax
of a named product; thresholds are starting points to tune on your own data._

```yaml
# fuel-exceptions.yaml
rules:
  - id: location-mismatch
    when: distance_card_site_to_vehicle_m > 500
    action: hold_for_review
  - id: over-capacity
    when: litres > tank_capacity_l * 1.05
    action: hold_for_review
  - id: rapid-refill
    when: km_since_last_fill < 100 and litres > 20
    action: review
  - id: wrong-product
    when: product not in vehicle.allowed_fuels
    action: hold_for_review
  - id: consumption-drift
    when: l_per_100km_30d > class_median * 1.25
    action: coach_or_inspect
review:
  owner: fleet-manager
  sla_hours: 72
  evidence: [card_transaction, vehicle_position, odometer]
```

**3. Vehicle register columns.** The minimum fields, as a CSV header:

```text
unit_id,vin,registration,class,mission,cost_centre,depot,ownership,acquired_on,
acquisition_cost,odometer_km,engine_hours,telematics_device_id,planned_replacement,
status,disposed_on
```

**4. Pulling trips from a telematics API.** Traccar's API (version 6.16.0 of its OpenAPI description) returns trips from
`GET /reports/trips` for a time window given in ISO 8601 and at least one device or group; each trip has a distance in metres,
speeds in knots and a duration in seconds, and the API accepts HTTP Basic or a bearer token.[^traccar-api] The script below
writes trips in Lab 2's format so the utilisation analysis can run on real data. Two details decide whether the numbers are
right: Traccar returns times as ISO 8601 (its examples are UTC), so the script converts them to the fleet's local time zone
before cutting days and shift minutes; and Lab 2 counts working days, so the script numbers Monday-to-Friday dates only and
reports how many there were.

_Example status: executed on 2026-10-23 against a local mock server returning trips in the documented format, across the
25 October 2026 clock change (Python 3.8 with a test stand-in for `zoneinfo`; the script needs Python 3.9+). Not run against a
real Traccar server. Use a read-only Traccar user limited to the group you analyse, and give its token an expiry date
(`POST /session/token` accepts an `expiration`)._[^traccar-api]

```python
"""Pull trips from a Traccar server into the Lab 2 CSV format (Python 3.9+).

Usage: traccar_trips.py GROUP_ID FROM TO TIMEZONE > trips.csv
FROM and TO are ISO 8601 times such as 2026-10-05T00:00:00Z; TIMEZONE is the
fleet's IANA zone such as Europe/London. Reads TRACCAR_URL (for example
https://tracking.example.com/api) and TRACCAR_TOKEN from the environment. Use a
read-only Traccar user limited to the group you analyse: the token grants
everything that user can see.

Days are numbered by local working day (Monday-Friday) because Lab 2 counts
working days; weekend trips are skipped. Remove public holidays by hand. The
number of working days is printed to stderr: pass it to lab2_utilisation.py.
"""
import csv
import json
import os
import sys
import urllib.parse
import urllib.request
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

BASE = os.environ["TRACCAR_URL"].rstrip("/")
TOKEN = os.environ["TRACCAR_TOKEN"]
GROUP_ID, FROM, TO, TZ = sys.argv[1], sys.argv[2], sys.argv[3], ZoneInfo(sys.argv[4])


def get(path, **params):
    url = f"{BASE}{path}?{urllib.parse.urlencode(params, doseq=True)}"
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {TOKEN}",
                                               "Accept": "application/json"})
    with urllib.request.urlopen(req, timeout=60) as resp:
        return json.load(resp)


def local(ts):
    """Traccar times are ISO 8601 (UTC 'Z' in its examples); convert to fleet time."""
    return datetime.fromisoformat(ts.replace("Z", "+00:00")).astimezone(TZ)


first, last = local(FROM).date(), local(TO).date()
dates = [first + timedelta(days=i) for i in range((last - first).days + 1)]
workday = {d: n + 1 for n, d in enumerate(d for d in dates if d.weekday() < 5)}

trips = get("/reports/trips", groupId=GROUP_ID, **{"from": FROM, "to": TO})
w = csv.writer(sys.stdout)
w.writerow(["vehicle", "day", "start_min", "end_min", "km", "idle_min"])
skipped = 0
for t in trips:
    s, e = local(t["startTime"]), local(t["endTime"])
    if s.date() not in workday or e <= s:
        skipped += 1
        continue
    same_day = e.date() == s.date()
    end_min = e.hour * 60 + e.minute if same_day else 24 * 60  # cut trips at midnight
    w.writerow([t["deviceName"], workday[s.date()], s.hour * 60 + s.minute, end_min,
                round(t["distance"] / 1000, 1),
                0])  # trips carry no idle time; see /reports/summary engineHours
print(f"working days: {len(workday)}; trips skipped (weekend or zero length): {skipped}",
      file=sys.stderr)
```

Run it with the URL and token in the environment, never on the command line where they end up in shell history:

```bash
export TRACCAR_URL="https://tracking.example.com/api"
read -rs TRACCAR_TOKEN && export TRACCAR_TOKEN
python3 traccar_trips.py 7 2026-10-05T00:00:00Z 2026-10-30T23:59:59Z \
  Europe/London > trips.csv
# stderr reports "working days: 20; ..." - pass that number to Lab 2
python3 lab2_utilisation.py trips.csv 20
```

The trips report has no idle field, so the script writes zero; Traccar's summary report adds engine hours for the period, and
engine hours minus trip time gives a rough idle estimate.[^traccar-api] Trips that cross midnight are cut at 24:00, and public
holidays must be removed by hand; Lab 2 stops with an error if a day number exceeds the working days you pass, so `days%` can
never exceed 100.

### Hands-on labs

Four labs, beginner to advanced, in Python's standard library; no accounts, no cost.

_Example status: all four labs verified by execution on 2026-10-23 (Python 3.8.10, Linux). All data is illustrative._

#### Lab 1 (beginner): TCO, equivalent annual cost and economic life

**Objective.** Compare a diesel van and an electric van on equivalent annual cost for keep periods of 1 to 10 years, find
each one's economic life, and find the annual distance at which the electric van breaks even. **Prerequisites.** Python 3.8 or
later. **Cost and risk.** None.

Save the inputs as `vans.json` (one currency; energy price per litre or per kWh; consumption per 100 km).

```json
{
  "discount_rate": 0.06,
  "km_per_year": 25000,
  "vehicles": {
    "diesel_van": {
      "price": 38000, "charger": 0,
      "use_per_100km": 8.5, "energy_price": 1.60,
      "maint_year1": 900, "maint_growth": 0.25,
      "downtime_days_year1": 2, "downtime_cost_per_day": 250,
      "insurance": 1400,
      "depr_year1": 0.25, "depr_after": 0.12
    },
    "electric_van": {
      "price": 52000, "charger": 3000,
      "use_per_100km": 24.0, "energy_price": 0.22,
      "maint_year1": 550, "maint_growth": 0.25,
      "downtime_days_year1": 2, "downtime_cost_per_day": 250,
      "insurance": 1600,
      "depr_year1": 0.30, "depr_after": 0.13
    }
  }
}
```

Save this as `lab1_tco.py`:

```python
"""Lab 1: total cost of ownership and equivalent annual cost (Python 3.8+).

Compares a diesel van and a battery-electric van over keep periods of 1-10 years
and finds each one's economic life (the keep period with the lowest EAC).
All inputs are illustrative; replace them with your own quotes and data.
"""
import json
import sys

def eac(npv_cost, rate, years):
    """Equivalent annual cost: NPV of costs divided by the annuity factor."""
    annuity = (1 - (1 + rate) ** -years) / rate
    return npv_cost / annuity

def npv_of_keeping(v, years, rate, km_per_year):
    """NPV of buying now, running for `years`, selling at the end."""
    cost = v["price"] + v.get("charger", 0)
    for t in range(1, years + 1):
        energy = km_per_year / 100 * v["use_per_100km"] * v["energy_price"]
        maint = v["maint_year1"] * (1 + v["maint_growth"]) ** (t - 1)
        days_down = v["downtime_days_year1"] * (1 + v["maint_growth"]) ** (t - 1)
        down = days_down * v["downtime_cost_per_day"]
        yearly = energy + maint + down + v["insurance"]
        cost += yearly / (1 + rate) ** t
    resale = v["price"] * (1 - v["depr_year1"]) * (1 - v["depr_after"]) ** (years - 1)
    cost -= resale / (1 + rate) ** years
    return cost

def table(vehicles, rate, km):
    rows = {}
    for name, v in vehicles.items():
        rows[name] = [eac(npv_of_keeping(v, n, rate, km), rate, n) for n in range(1, 11)]
    return rows

def main():
    cfg = json.load(open(sys.argv[1] if len(sys.argv) > 1 else "vans.json"))
    rate, km = cfg["discount_rate"], cfg["km_per_year"]
    rows = table(cfg["vehicles"], rate, km)
    names = list(rows)
    print("keep_years " + " ".join(f"{n:>12}" for n in names))
    for i in range(10):
        print(f"{i + 1:>10} " + " ".join(f"{rows[n][i]:>12,.0f}" for n in names))
    for n in names:
        best = min(range(10), key=lambda i: rows[n][i])
        print(f"economic life {n}: {best + 1} years, EAC {rows[n][best]:,.0f} per year")
    # Break-even distance at a 7-year keep: smallest km/yr where EV EAC <= diesel EAC.
    ice, ev = names[0], names[1]
    for k in range(5000, 80001, 500):
        r = table(cfg["vehicles"], rate, k)
        if r[ev][6] <= r[ice][6]:
            print(f"break-even at 7-year keep: about {k:,} km per year")
            break
    else:
        print("no break-even below 80,000 km per year")

if __name__ == "__main__":
    main()
```

Steps: `mkdir fleet-labs && cd fleet-labs`, save both files, then run `python3 lab1_tco.py vans.json`.

**Expected output.**

```text
keep_years   diesel_van electric_van
         1       17,980       25,870
         2       14,922       18,724
         3       13,848       16,165
         4       13,313       14,803
         5       13,029       13,957
         6       12,903       13,402
         7       12,896       13,041
         8       12,993       12,828
         9       13,189       12,737
        10       13,484       12,758
economic life diesel_van: 7 years, EAC 12,896 per year
economic life electric_van: 9 years, EAC 12,737 per year
break-even at 7-year keep: about 27,000 km per year
```

**Validation.** By hand, the diesel van kept one year: running cost = 25,000 km × 8.5 L/100 km × 1.60 = 3,400 fuel + 900
maintenance + 500 downtime + 1,400 insurance = 6,200; resale = 38,000 × 0.75 = 28,500. NPV = 38,000 + (6,200 − 28,500) / 1.06 = 16,962; the one-year annuity factor is 1/1.06, so
EAC = 16,962 × 1.06 = 17,980, which matches the first row.

**Try this.** Set the electric van's `energy_price` to 0.45 (a public rapid-charging price) and rerun: its best EAC rises to
14,117 and the 7-year break-even moves to about 79,500 km a year. Charging location can matter more than the vehicle.
Changing `km_per_year` to 15,000 or 40,000 does not move the economic lives: the model ties maintenance to age, not distance,
a limitation to fix before real use.

**Troubleshooting.** `KeyError` means a field is missing from `vans.json`; every vehicle needs every field. A
`ZeroDivisionError` means a discount rate of 0: use a small positive rate. **Teardown.** Delete the `fleet-labs` folder when you
finish all labs.

#### Lab 2 (beginner to intermediate): utilisation and a right-sizing estimate

**Objective.** From a trip log, compute each van's utilisation by days, distance, engine hours and idle share, then estimate the
fleet size needed to cover nine days in ten. **Prerequisites.** Python 3.8+. **Cost and risk.** None.

Save this generator as `make_trips.py` (it writes a seeded, illustrative trip log for 10 vans over 20 working days):

```python
"""Lab 2 data: write an illustrative trip log for 10 vans over 20 working days."""
import csv
import random
import sys

random.seed(42)
USE_PROB = [0.95, 0.9, 0.9, 0.85, 0.8, 0.75, 0.6, 0.35, 0.25, 0.15]
with open(sys.argv[1] if len(sys.argv) > 1 else "trips.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["vehicle", "day", "start_min", "end_min", "km", "idle_min"])
    for day in range(1, 21):
        for i, p in enumerate(USE_PROB):
            if random.random() > p:
                continue
            t = random.randint(7 * 60, 9 * 60)          # first departure 07:00-09:00
            for _ in range(random.randint(1, 4)):
                dur = random.randint(45, 180)
                end = min(t + dur, 18 * 60)
                if end - t < 20:
                    break
                km = round((end - t) / 60 * random.uniform(18, 35), 1)
                idle = round((end - t) * random.uniform(0.05, 0.30))
                w.writerow([f"V{i + 1:02d}", day, t, end, km, idle])
                t = end + random.randint(20, 90)        # time on site between trips
                if t >= 17 * 60:
                    break
```

Save the analysis as `lab2_utilisation.py`:

```python
"""Lab 2: utilisation, idling and a right-sizing estimate (Python 3.8+)."""
import csv
import math
import sys
from collections import defaultdict

DAYS = int(sys.argv[2]) if len(sys.argv) > 2 else 20   # working days in the sample
SHIFT_MIN = 11 * 60       # 07:00-18:00 shift window
MIN_DAYS_PCT = 50         # policy threshold: review vans used on fewer days than this
SPARE_PCT = 10            # policy: spare vehicles on top of the planning peak

trips = list(csv.DictReader(open(sys.argv[1] if len(sys.argv) > 1 else "trips.csv")))
by_v = defaultdict(lambda: {"days": set(), "km": 0.0, "eng": 0, "idle": 0})
busy = defaultdict(set)   # (day, 15-minute slot) -> vehicles in use
for r in trips:
    v, d, s, e = r["vehicle"], int(r["day"]), int(r["start_min"]), int(r["end_min"])
    if not 1 <= d <= DAYS or not 0 <= s < e <= 24 * 60:
        sys.exit(f"bad row {r}: day must be 1..{DAYS} and start < end within the day")
    x = by_v[v]
    x["days"].add(d)
    x["km"] += float(r["km"])
    x["eng"] += e - s
    x["idle"] += int(r["idle_min"])
    for slot in range(s // 15, math.ceil(e / 15)):
        busy[(d, slot)].add(v)

print(f"{'van':4} {'days%':>6} {'km':>7} {'eng_h':>6} "
      f"{'use%shift':>11} {'idle%':>6}  flag")
for v in sorted(by_v):
    x = by_v[v]
    days_pct = 100 * len(x["days"]) / DAYS
    shift_pct = 100 * x["eng"] / (DAYS * SHIFT_MIN)
    idle_pct = 100 * x["idle"] / x["eng"]
    flag = "review" if days_pct < MIN_DAYS_PCT else ""
    print(f"{v:4} {days_pct:6.0f} {x['km']:7.0f} {x['eng'] / 60:6.1f} "
          f"{shift_pct:11.0f} {idle_pct:6.1f}  {flag}")

peaks = sorted(max((len(vs) for (d, _), vs in busy.items() if d == day), default=0)
               for day in range(1, DAYS + 1))
p90 = peaks[math.ceil(0.9 * len(peaks)) - 1]
need = math.ceil(p90 * (1 + SPARE_PCT / 100))
mid = peaks[len(peaks) // 2]
print(f"daily peak vans in use: min {peaks[0]}, median {mid}, max {peaks[-1]}")
print(f"90th percentile of daily peaks: {p90}; with {SPARE_PCT}% spares: {need} vans "
      f"(fleet today: {len(by_v)})")
```

Run `python3 make_trips.py trips.csv` and then `python3 lab2_utilisation.py trips.csv` (an optional second argument gives the
number of working days; the default is 20). `use%shift` is engine-on trip time, idling included, as a share of the 07:00-18:00
shift window.

**Expected output** (the generator writes 326 trips plus a header):

```text
van   days%      km  eng_h   use%shift  idle%  flag
V01      95    2275   84.5          38   19.6  
V02      80    2035   75.5          34   17.2  
V03      85    1804   69.6          32   16.3  
V04      95    2372   87.0          40   19.6  
V05      65    1447   51.7          24   19.6  
V06      85    2188   82.8          38   16.9  
V07      75    2034   73.4          33   18.3  
V08      30     718   26.5          12   19.9  review
V09      25     720   27.2          12   18.4  review
V10       5     185    7.0           3   13.0  review
daily peak vans in use: min 4, median 7, max 8
90th percentile of daily peaks: 7; with 10% spares: 8 vans (fleet today: 10)
```

**Validation.** V10 has a 15% daily chance of use, so one day (5%) is within random spread; the 90th percentile (7) lies
between the median (7) and the maximum (8), as it must.

**Interpretation.** Ask what the three flagged vans carry and who uses them, then price eight vans plus peak rental.

**Troubleshooting.** `bad row` means a day number above the working days you passed, or a trip whose end is not after its
start; fix the data rather than the check. With real data from the Traccar script, `idle%` is zero (no idle data).
**Teardown.** Delete `trips.csv`.

#### Lab 3 (intermediate): checking a duty log against simplified US hours-of-service rules

**Objective.** Flag breaches of the 14-hour window, 11-hour driving limit, 30-minute break and 70-hour/8-day limit in a duty
log (49 CFR 395.3).[^cfr3953] **Prerequisites.** Python 3.8+. **Cost and risk.** None; a teaching tool that ignores
sleeper-berth splits, adverse conditions, short-haul and the 34-hour restart.

Save the illustrative log as `duty_log.csv` (statuses: OFF off duty, SB sleeper berth, D driving, ON on duty not driving; the
last row only marks the end of the log):

```csv
driver,time,status
D-017,2026-10-05T00:00,OFF
D-017,2026-10-05T06:00,ON
D-017,2026-10-05T06:30,D
D-017,2026-10-05T10:30,ON
D-017,2026-10-05T11:00,D
D-017,2026-10-05T15:00,ON
D-017,2026-10-05T15:30,D
D-017,2026-10-05T17:30,OFF
D-017,2026-10-06T05:00,ON
D-017,2026-10-06T05:15,D
D-017,2026-10-06T13:45,OFF
D-017,2026-10-06T14:15,D
D-017,2026-10-06T16:00,OFF
D-017,2026-10-07T04:00,ON
D-017,2026-10-07T04:30,D
D-017,2026-10-07T09:00,OFF
D-017,2026-10-07T09:30,D
D-017,2026-10-07T12:00,ON
D-017,2026-10-07T15:00,D
D-017,2026-10-07T18:00,ON
D-017,2026-10-07T18:30,D
D-017,2026-10-07T19:30,OFF
D-017,2026-10-08T12:00,OFF
```

Save the checker as `lab3_hos.py`:

```python
"""Lab 3: a simplified US property-carrying hours-of-service checker (Python 3.8+).

Teaching tool only. It checks the 10-hour reset, the 14-hour window, the 11-hour
driving limit, the 30-minute break after 8 hours of driving and the 70-hour/8-day
limit. It ignores sleeper-berth splits, adverse driving conditions, the short-haul
exception and the 34-hour restart, so it must never be used for compliance.
"""
import csv
import sys
from datetime import datetime, timedelta

OFF = {"OFF", "SB"}

def minutes(events):
    """Expand status-change events into one status per minute."""
    out = []
    for (t0, s0), (t1, _) in zip(events, events[1:]):
        n = int((t1 - t0).total_seconds() // 60)
        out += [(t0 + timedelta(minutes=i), s0) for i in range(n)]
    return out

def check(timeline):
    found, off_run, shift_start = [], 10 * 60, None
    drive_shift = drive_since_break = nondrive_run = 0
    history = []                      # 1 if on duty (D or ON) for each minute, for 70/8
    for t, s in timeline:
        on = s not in OFF
        history.append(1 if on else 0)
        if not on:
            off_run += 1
            nondrive_run += 1
            if nondrive_run >= 30:
                drive_since_break = 0
            continue
        if off_run >= 10 * 60:        # on duty after 10 hours off: a new shift
            shift_start, drive_shift, drive_since_break = t, 0, 0
        off_run = 0
        if s != "D":
            nondrive_run += 1
            if nondrive_run >= 30:
                drive_since_break = 0
            continue
        nondrive_run = 0
        drive_shift += 1
        drive_since_break += 1
        rules = [
            ("14-hour window",
             shift_start is not None and t >= shift_start + timedelta(hours=14)),
            ("11-hour driving limit", drive_shift > 11 * 60),
            ("30-minute break required", drive_since_break > 8 * 60),
            ("70 hours in 8 days", sum(history[-8 * 1440:]) > 70 * 60),
        ]
        for name, broken in rules:
            new = (not found or found[-1][1] != name
                   or t - found[-1][2] > timedelta(minutes=1))
            if broken and new:
                found.append([t, name, t])
            elif broken:
                found[-1][2] = t
    return found

def main():
    path = sys.argv[1] if len(sys.argv) > 1 else "duty_log.csv"
    rows = list(csv.DictReader(open(path)))
    events = [(datetime.fromisoformat(r["time"]), r["status"]) for r in rows]
    for start, rule, last in check(minutes(events)):
        mins = int((last - start).total_seconds() // 60) + 1
        print(f"{start:%Y-%m-%d %H:%M}  {rule:26} {mins:4d} min of driving")
    print("done")

if __name__ == "__main__":
    main()
```

Run `python3 lab3_hos.py duty_log.csv`.

**Expected output.**

```text
2026-10-06 13:15  30-minute break required     30 min of driving
2026-10-07 18:30  14-hour window               60 min of driving
done
```

**Validation.** 6 October: driving 05:15–13:45 is 8.5 hours without a 30-minute break, so the last 30 minutes are flagged.
7 October: on duty at 04:00, so the window closes at 18:00 and the hour from 18:30 is flagged. 5 October: the 30-minute
on-duty periods count as breaks under the rule,[^cfr3953] and 10 hours of driving is inside the limit.

**Troubleshooting.** `ValueError: Invalid isoformat string` means a timestamp is not in `YYYY-MM-DDTHH:MM` form. The checker
treats the time before the first row as a full 10-hour rest, so a log that starts mid-shift opens its first shift at the first
on-duty row and can miss a 14-hour breach; start logs at the beginning of a rest period. **Teardown.** Delete the files.

#### Lab 4 (advanced): capacitated routing with the savings method and 2-opt

**Objective.** Route three 32-unit vans from one depot to 12 stops and compare a naive plan with a heuristic one.
**Prerequisites.** Python 3.8+. **Cost and risk.** None.

Save the stops as `stops.csv` (coordinates in km from the depot, demand in units):

```csv
stop,x_km,y_km,demand
DEPOT,0,0,0
S01,4,9,8
S02,-6,7,6
S03,9,-3,10
S04,-8,-5,7
S05,2,14,5
S06,12,6,9
S07,-11,2,4
S08,5,-10,6
S09,-3,-12,8
S10,14,-8,5
S11,-13,11,7
S12,7,4,6
```

Save the planner as `lab4_routes.py`:

```python
"""Lab 4: capacitated routing with Clarke-Wright savings and 2-opt (Python 3.8+).

Distances are straight lines times a road factor; real routing needs a road network
and usually a solver such as OR-Tools. The point is to compare a naive plan with a
heuristic one and to see why routing is a search problem, not a formula.
"""
import csv
import math
import sys

CAPACITY = 32       # units per van
ROAD_FACTOR = 1.3   # straight-line to road distance, illustrative

rows = list(csv.DictReader(open(sys.argv[1] if len(sys.argv) > 1 else "stops.csv")))
pts = {r["stop"]: (float(r["x_km"]), float(r["y_km"])) for r in rows}
dem = {r["stop"]: int(r["demand"]) for r in rows}
stops = [r["stop"] for r in rows if r["stop"] != "DEPOT"]

def d(a, b):
    (x1, y1), (x2, y2) = pts[a], pts[b]
    return ROAD_FACTOR * math.hypot(x1 - x2, y1 - y2)

def length(route):
    path = ["DEPOT"] + route + ["DEPOT"]
    return sum(d(a, b) for a, b in zip(path, path[1:]))

def naive():
    """Fill vans in stop-number order: what a spreadsheet plan often does."""
    routes, cur, load = [], [], 0
    for s in stops:
        if load + dem[s] > CAPACITY:
            routes.append(cur)
            cur, load = [], 0
        cur.append(s)
        load += dem[s]
    return routes + [cur]

def savings():
    routes = {s: [s] for s in stops}            # start: one route per stop
    owner = {s: s for s in stops}
    pairs = sorted(((d("DEPOT", i) + d("DEPOT", j) - d(i, j), i, j)
                    for i in stops for j in stops if i < j), reverse=True)
    for sav, i, j in pairs:
        ri, rj = owner[i], owner[j]
        if ri == rj or sav <= 0:
            continue
        a, b = routes[ri], routes[rj]
        if sum(dem[s] for s in a + b) > CAPACITY:
            continue
        # i and j must be route ends; orient so that i ends a and j starts b.
        if a[-1] != i:
            a = a[::-1]
        if b[0] != j:
            b = b[::-1]
        if a[-1] != i or b[0] != j:
            continue
        routes[ri] = a + b
        del routes[rj]
        for s in routes[ri]:
            owner[s] = ri
    return list(routes.values())

def two_opt(route):
    best, improved = route[:], True
    while improved:
        improved = False
        for i in range(len(best) - 1):
            for k in range(i + 1, len(best)):
                cand = best[:i] + best[i:k + 1][::-1] + best[k + 1:]
                if length(cand) < length(best) - 1e-9:
                    best, improved = cand, True
    return best

def show(name, routes):
    print(name)
    for r in routes:
        load = sum(dem[s] for s in r)
        print(f"  load {load:2d}  {length(r):6.1f} km  " + " > ".join(r))
    print(f"  total {sum(length(r) for r in routes):.1f} km with {len(routes)} vans")

show("naive (stop order)", naive())
show("savings + 2-opt", [two_opt(r) for r in savings()])
```

Run `python3 lab4_routes.py stops.csv`.

**Expected output.**

```text
naive (stop order)
  load 31    84.0 km  S01 > S02 > S03 > S04
  load 32   118.2 km  S05 > S06 > S07 > S08 > S09
  load 18   101.9 km  S10 > S11 > S12
  total 304.1 km with 3 vans
savings + 2-opt
  load 28    53.9 km  S01 > S05 > S06 > S12
  load 24    56.6 km  S04 > S07 > S11 > S02
  load 29    60.3 km  S03 > S10 > S08 > S09
  total 170.9 km with 3 vans
```

**Validation.** Every stop appears once per plan; no load exceeds 32. Demand is 81 units, so at least three vans are needed
(81 ÷ 32 = 2.53, rounded up). The heuristic plan is 133.2 km (44%) shorter because the naive one criss-crosses the area.

**Extend it.** Add time windows and the savings method needs repair steps; a solver such as OR-Tools, with capacities, time
windows and dropped visits, earns its place there.[^ortools] **Troubleshooting.** If a route exceeds capacity, check that `CAPACITY` is at least the largest single demand.
**Teardown.** Delete the `fleet-labs` folder.

### Use cases and scenarios

The first three are **illustrative scenarios**; the fourth is a real, sourced operating model.

| Scenario | Context | Trade-offs | Success measure |
|---|---|---|---|
| Municipal right-sizing (illustrative) | 600 vehicles, each department keeping "its" own; a VAM-style study[^vam] | Departments lose dedicated vehicles; booking friction | Fewer vehicles without missed jobs |
| Last-mile van electrification (illustrative) | 80 diesel vans on 90–140 km urban routes, one depot | Capital; utility lead time; charging constrains dispatch | Lower EAC; no routes missed for energy |
| Regional trucking safety and hours (illustrative) | 60 US interstate tractors with hours breaches at roadside; planner reviews ELD data, re-cuts routes, adds outward cameras with reviewed events | Some loads need relay drivers; cameras need driver trust | Hours breaches per 1,000 driver-hours and collisions per million km down |
| Autonomous ride-hail fleet (sourced) | Waymo's automated driver asks remote "fleet response" agents questions, stays in control and can stop; roadside assistance retrieves vehicles[^waymo] | Remote assistance must scale with fleet and edge cases | Not published; an operator would track assistance requests and retrievals per 1,000 trips |

**Municipal right-sizing, step by step.** (1) Put every vehicle in the register with its department and mission. (2) Pull
twelve months of trips so that seasonal work shows. (3) Run Lab 2's peak-percentile method per vehicle class, not per
department. (4) Ask drivers and supervisors about each low-use vehicle before deciding. (5) Move survivors into a bookable pool,
price short-term rental for peaks, and dispose of the rest. Owner: the fleet manager, with each department head signing off its
list. Pitfall: snow ploughs and emergency reserves look idle by design; tag them as mission-reserved before the study.

**Last-mile electrification, step by step.** (1) Screen each route's winter distance against usable range with a reserve.
(2) Price energy at the depot tariff and model EAC (Lab 1). (3) Ask the utility for the connection capacity the overnight load
needs; the answer sets the timetable. (4) Configure managed charging so that the site stays under its limit. (5) Pilot with the
routes that have the most margin, through one winter. Owner: the fleet manager, with dispatch and facilities. Pitfall: a
summer-only pilot proves nothing about January.

Other pitfalls: cameras before policy and coaching; routing that optimises kilometres while the business measures jobs done.

## Measure, govern, pay

### Metrics and KPIs

Every fleet metric needs a denominator that reflects exposure. Formulas are this page's definitions unless sourced; write
yours down, because the same name means different things in different fleets.

| KPI | Definition / formula | Pitfall | Cadence |
|---|---|---|---|
| Cost per km (or hour) | Operating cost (depreciation or lease, energy, maintenance, insurance, tax, downtime) ÷ km | Excluding depreciation flatters old vehicles | Monthly, by class |
| Equivalent annual cost | NPV of costs ÷ annuity factor ([economics](#total-cost-of-ownership-and-equivalent-annual-cost)) | Untested resale values | Annual |
| Utilisation (days) | Days used ÷ days available | Assigned vehicles look idle by design | Monthly |
| Availability | (Scheduled vehicle-days − off-road days) ÷ scheduled vehicle-days | Counting a vehicle waiting for parts as available | Weekly |
| PM compliance | PMs done by due date ÷ PMs due | Moving the due date to "comply" | Weekly |
| Defect close-out time | Median hours from report to certified repair (safety-critical) | Averages hide the long tail | Weekly |
| Energy intensity | Litres or kWh per 100 km, by class | Mixing classes; ignoring winter | Monthly |
| Idle share | Idle engine-on time ÷ engine hours | Equipment idling (cranes, refrigeration) counted as waste | Monthly |
| Collision rate | Collisions ÷ million km (also: preventable only) | Small numbers (worked example) | Quarterly, rolling 12 months |
| Safety events per 1,000 km | Reviewed events ÷ km × 1,000 | Unreviewed AI events; calibration changes | Weekly, monthly trend |
| Hours breaches | Infringements ÷ 1,000 driver-hours | Counting only roadside finds | Weekly |
| Emissions | Fuel × factor (Scope 1); purchased electricity × factor (Scope 2)[^epa-scope] | Mixing location- and market-based factors | Quarterly |

**Leading and lagging.** Collisions and prohibitions lag; PM compliance, defect close-out, hours breaches and reviewed safety
events lead, and you can act on them this week.

**Worked calculation (illustrative fleet of 135 vehicles, one year).**

| Input | Value |
|---|---|
| Depreciation and lease | 1,215,000 |
| Fuel and energy | 620,000 |
| Maintenance and repairs | 310,000 |
| Insurance | 205,000 |
| Tax, registration, other | 50,000 |
| Distance | 3,750,000 km |
| Collisions | 9 (fleet), of which 2 at depot B (800,000 km) |
| PMs due / done on time (quarter) | 412 / 389 |
| Scheduled vehicle-days / off-road days (month) | 2,700 / 94 |

- Cost per km = (1,215,000 + 620,000 + 310,000 + 205,000 + 50,000) ÷ 3,750,000 = 2,400,000 ÷ 3,750,000 = **0.64 per km**.
- Collision rate = 9 ÷ 3.75 = **2.4 per million km**. Depot B: 2 ÷ 0.8 = **2.5 per million km**, which looks the same as the
  fleet. But with only two events, the exact 95% Poisson interval for the count is 0.24 to 7.2, so depot B's rate could be
  anywhere from about **0.3 to 9.0 per million km**. A league table of depots on one year's collisions ranks noise.
- PM compliance = 389 ÷ 412 = **94.4%**; list the 23 late ones and check for safety inspections.
- Availability = (2,700 − 94) ÷ 2,700 = **96.5%**: the 3.5% off road sizes the spare allowance.

::: tip Score drivers on reviewed events per kilometre, with a minimum exposure
One event in 300 km and 20 in 6,000 km give the same rate. Show a rate only above a minimum distance (say 1,000 km), review
events before they count, and use the score to choose whom to coach. Vendors compute their own scores from accelerometer and camera events;[^samsara] know what goes into yours.
:::

### Safety, privacy and compliance

**Safety and compliance obligations** are covered under the practices above. Retention is part of compliance: US carriers keep inspection reports three months, maintenance records one year (plus six months after
disposal) and duty-status records six months;[^cfr39611][^cfr3963][^cfr3958] the DVSA guide asks for 15 months.[^dvsa] Deleting
too early fails as surely as keeping everything forever.

**Privacy.** Telematics and cameras make the vehicle a monitored workplace. The UK Information Commissioner's Office is
specific (as of October 2026; it says this guidance is under review after the Data (Use and Access) Act):[^ico]

- "Telematics data which records the activities of drivers is personal information and is subject to data protection law."
- On vehicles also used privately, "you will rarely be able to justify monitoring during private use"; a company car can have
  tracking the driver can disable outside work.
- "You must inform workers and passengers of any vehicle monitoring."
- Where tachographs are legally required, an employer can rely on the lawful basis of legal obligation.
- Driver monitoring, "such as monitoring driver behaviour and driving style, or using cameras or audio", is harder to justify,
  and the ICO says you must carry out a DPIA for it, as for any tool that "uses analytics to make inferences, predictions, or
  decisions about drivers". Tracking work vehicles is not on that list, but it still needs a lawful basis, transparency and
  proportionality; this page recommends a DPIA for it as well.
- Inward-facing cameras capture driver and passengers; audio is higher risk, so switch it off by default and trigger it
  only in exceptional circumstances.

In the EU, GDPR Article 35 requires a DPIA where processing "is likely to result in a high risk", and each supervisory
authority publishes a list of operations that need one:[^gdpr35] check your national list rather than the ICO's. Elsewhere the
law differs, but a defensible camera default recurs: outward-facing, event-triggered clips, audio off, driver-facing only for a
documented risk, short retention unless linked to an incident, access limited to safety staff.

**Security.** Telematics accounts can locate every vehicle and sometimes immobilise it: named least-privilege accounts, MFA
for administrators, read-only analytics users with expiring tokens, prompt removal of leavers. Treat the CSMS the same way
(see [trust boundaries](#reference-architecture)); device security belongs to [IoTOps](../iotops/).

### Cost, capacity and sustainability

**Cost drivers.** Capital (depreciation or lease), energy, maintenance, insurance and downtime are the largest lines; NAFA's
certification material calls fuel "the second largest fleet vehicle expense".[^nafa-cafm] The levers, roughly in order of size:
fewer vehicles, the right class and replacement age, energy (consumption, idling, tariff), then maintenance efficiency. Whether
a lease sits on the balance sheet is an accounting question: involve finance before choosing lease over buy.

**Claims and insurance.** NAFA's risk-management discipline covers insurance, subrogation, training, safety and crash
management, and notes that not every loss can be insured.[^nafa-cafm] In practice: report every collision the same day, recover
costs from at-fault third parties (subrogation), record repair cost and downtime per claim, and feed causes into coaching and
vehicle specification. How much loss to retain (a higher excess) is a finance decision that the fleet's collision rates should
inform.

**Chargeback and funding.** A fleet can be funded from a central budget, or charge user departments a monthly rate that also
builds a replacement fund. For such a fund, Government Fleet's guidance advises building salvage values into the rate,
returning sale proceeds to the fund, using the vehicle's actual cost, and keeping the rate for the vehicle's life instead of
resetting it each budget cycle.[^gf-replace] A full-cost rate gives departments a reason to return under-used vehicles; a
centrally funded fleet gives them none (this page's view).

**Capacity** is vehicle-hours in the right place: drivers, vehicles, workshop bays and, for EVs, charging power after 18:00.

**Sustainability.** Fuel burned in owned or controlled vehicles is a direct (Scope 1) emission; purchased electricity is
indirect (Scope 2).[^epa-scope] For electricity the organisation buys, for example at its depots, electrification moves
emissions from Scope 1 to Scope 2, resized by the grid mix; classify reimbursed home and public charging by your inventory's
boundary rules. US carriers and shippers can benchmark freight emissions through EPA's SmartWay.[^smartway] The carbon method
itself is in [GreenOps](../greenops/).

### Assurance of the operating model

- **Record audits.** Each quarter, trace one inspection and one defect for ten sampled vehicles from schedule to certification.
- **External signals.** Roadside results and regulator scores (such as FMCSA's safety categories)[^basics] are the regulator's
  view of your fleet; treat every prohibition as an incident.
- **Data-quality checks.** Silent devices, odometer jumps, driverless trips, unmatched fuel: control failures, not just bad data.
- **Driver feedback.** Drivers know which vehicles are unreliable and which routes cannot be driven legally.
- **Model back-testing.** Yearly, compare cost-model forecasts (maintenance by age, resale) with actuals.

## When things go wrong

### Common failures and troubleshooting

| Symptom | Likely cause | Diagnosis | Remediation | Prevention |
|---|---|---|---|---|
| Overdue PMs rising | Workshop capacity, vehicles never released, schedule not linked to time | Overdue list by depot and reason | Book releases with dispatch; temporary outsourcing | PM slots in the dispatch plan; weekly review |
| Vehicle shows low utilisation but is always busy | Device not reporting, wired to wrong ignition, or mapped to the wrong unit | Compare device ID with register; check last report time | Fix mapping or wiring | Commissioning checklist; daily silent-device report |
| Fuel use per 100 km drifts up on one vehicle | Card misuse, mechanical fault, route change, tyre pressure | Match transactions to positions; compare with route and class | Investigate card; inspect vehicle | Exception rules on every transaction |
| Safety events jump fleet-wide overnight | Device firmware or threshold change | Event rate by firmware version and date | Roll back or recalibrate; void affected scores | Change control for telematics settings |
| Hours breaches cluster on one route | The route cannot be driven within limits | Planned versus actual durations for the route | Re-cut the route; relay driver | Plan with realistic durations and breaks |
| EV range complaints every winter | Planning on brochure range | Energy per km by month | Re-plan winter routes; preheat while plugged in | Plan against winter range with margin[^cold] |
| Roadside prohibition for a defect the driver reported | Defect not closed before dispatch | Defect record and dispatch log | Ground vehicle; review sign-off | Separate maintenance sign-off from dispatch targets |

### Worked runbook: the depot did not charge

::: example Illustrative scenario
A depot runs 40 electric vans on overnight Level 2 charging managed by a charging management system (CSMS) over OCPP. At 05:30
the dispatcher sees that 11 vans are below the charge they need for today's routes.
:::

::: figure Runbook: overnight charging shortfall
```mermaid
flowchart TB
  A["05:30 shortfall found: 11 vans low"] --> B["Triage: energy needed vs on board, per route"]
  B --> C{"Enough energy with route swaps?"}
  C -->|"yes"| D["Swap routes: long routes to full vans"]
  C -->|"no"| E["Rapid charge, spare vehicles, defer jobs"]
  D --> F["Diagnose: CSMS, chargers, site limit"]
  E --> F
  F --> G{"Cause found?"}
  G -->|"CSMS or network"| H["Restore link; check charge profiles"]
  G -->|"site load limit"| I["Rebalance profiles; check tariff windows"]
  G -->|"charger or vehicle fault"| J["Work order; tag units"]
  H --> K["Post-incident review and prevention"]
  I --> K
  J --> K
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  class A risk
  class C,G decision
  class B,D,E,F,H,I,J,K core
```
Text equivalent: At 05:30, 11 vans are found low. Triage compares each route's energy need with the energy on board. If route
swaps cover the gap, long routes go to full vans; if not, use rapid charging, spares and deferred jobs. Then diagnose the CSMS,
chargers and site limit: restore the link and check charge profiles, rebalance profiles and tariff windows, or raise work
orders and tag faulty units. All paths end in a post-incident review.
:::

**1. Protect today's work (05:30–06:15).**

1. Export each van's state of charge and each route's distance; convert to energy with the class's seasonal kWh per 100 km
   plus a reserve (this page suggests 20%).
2. Give the longest routes to the fullest vans; short routes often fit vans at 50–60%.
3. For the remaining gap: top up on the fastest chargers, plan a mid-route rapid charge, use spares or rentals, or defer
   low-priority jobs. Record the cost.

**2. Diagnose (from 06:15).**

1. *Every charger or a subset?* All points to the CSMS, network link or site supply; a subset to a circuit, charger or vehicles.
2. *Did sessions start?* None: check the CSMS link and expired credentials. Started but delivered little: check charge profiles.
3. *Was the site limit binding?* Smart charging caps total power under the connection limit through charge profiles;[^ocpp] a
   new building load, profile change or tariff-window change cuts every van's share.
4. *Vehicle side?* A scheduled-charging setting or charge-port fault shows on one van only.

**3. Fix and prevent.**

- Alert at 01:00 on projected shortfall (energy so far plus power × hours left, versus tomorrow's need).
- Keep a fallback: rapid chargers on the routes and two spare vans charged first.
- Put charge-profile and tariff changes under change control, with a test night.
- Review: a new cause (fix it) or an accepted risk (record the decision and its cost)?

### Anti-patterns and myths

| Anti-pattern or myth | Why it fails | What to do instead |
|---|---|---|
| "Buy telematics first, decide what to do with it later" | Data with no decision attached becomes cost and privacy risk | Name the decisions (sizing, coaching, maintenance) and buy the data they need |
| Ranking drivers or depots on raw event or collision counts | Ignores exposure; small numbers are noise | Rates per km with minimum exposure; review events; coach first |
| "Electrify X% by year Y" without duty-cycle data | Vehicles that cannot do the job get bought anyway | Screen duty cycles; pilot; scale on evidence |
| The dispatcher signs off defects | Dispatch targets beat safety judgement under pressure | Maintenance signs off; dispatch is informed |
| Cutting maintenance to hit a budget | Cost moves to breakdowns, downtime and risk | Hold the PM floor; cut through right-sizing instead |
| Cameras before the policy | Drivers resist, data is collected without a lawful basis | Policy, DPIA where required, consultation, then cameras |
| Myth: "An electric van needs no maintenance" | Inspections, tyres, brakes, suspension, lights and safety checks remain; only some service items go away[^ev-maint] | Keep time-based safety inspections; adjust service items |
| Myth: "The grey fleet is the employee's problem" | Employer duties cover workers' own vehicles used for work[^hse] | Checks, declarations and a policy |

## Deciding and adopting

### When to use and when not to use

**A deliberate fleet function is worth it when** vehicle cost is material or vehicle failure stops the service; people drive
for work regularly; regulations apply (commercial vehicles, passenger transport, dangerous goods); or vehicle decisions are made
without data.

**When not to build it, or not yet:**

- **A handful of cars.** A policy, a lease with maintenance and licence checks usually suffice. Before buying telematics,
  compare its yearly cost (subscription × units, plus the time to use it) with the fuel, time or claims it must save; at small
  scale it often fails that test (this Atlas's rule of thumb, not a measured threshold).
- **Transport is better bought than run.** If carriers can do the work at a known price, outsource (with
  [SupplyChainOps](../supplychainops/)) and keep oversight of safety requirements, service levels and data.
- **Mostly grey fleet.** Then the job is a grey-fleet policy and checks, perhaps with a pool, not a fleet department.
- **No decision depends on it.** Collecting telematics with no plan to act on it adds privacy risk without benefit.

**Hidden responsibilities:** records retention, data protection assessments, telematics change control, driver consultation,
and a replacement budget that survives a bad year.

### Decision framework

Going electric is in [the EV decision tree](#the-electric-vehicle-decision); here, how to source vehicles and maintenance.

**Acquisition model by vehicle group.**

| Situation | Usually fits | Why | Watch for |
|---|---|---|---|
| Stable mission, long keep period, in-house workshop | Buy | Lowest EAC when kept to economic life; full control | Capital budget; resale risk |
| Standard vehicles, no workshop, predictable mileage | Lease with maintenance | Predictable cost; supplier carries resale risk | Excess-mileage and damage charges; lock-in to the lease term |
| Seasonal or project peaks | Short-term rental | Pay only for the peak | Availability in peak season; price |
| Occasional business trips | Pool vehicles or reimbursed own cars | Avoids idle assets | Grey-fleet checks; booking discipline |

**In-house versus outsourced maintenance.** Illustrative weights; set yours before scoring each option 1 (poor) to 5 (good).

| Criterion | Weight | In-house | Outsourced | Notes |
|---|---|---|---|---|
| Vehicle downtime (turnaround) | 30% | 4 | 3 | In-house controls priorities; outsourced depends on the contract |
| Cost per job at your volume | 25% | 3 | 4 | Workshops need volume to pay for bays and technicians |
| Compliance records quality | 20% | 4 | 3 | Contracts must specify records, or you inherit gaps |
| Access to specialist skills (EV, emissions systems) | 15% | 2 | 4 | Specialist training and tools are expensive for small fleets |
| Flexibility to scale | 10% | 2 | 4 | Fixed workshop capacity versus contract |
| **Weighted score** | 100% | **3.25** | **3.50** | Close scores mean the assumptions decide; test them |

Arithmetic: in-house 0.30 × 4 + 0.25 × 3 + 0.20 × 4 + 0.15 × 2 + 0.10 × 2 = 3.25; outsourced 0.30 × 3 + 0.25 × 4 +
0.20 × 3 + 0.15 × 4 + 0.10 × 4 = 3.50. Moving 10 points of weight from flexibility to downtime flips it (3.45 against 3.40): when a
decision is this sensitive, run a trial (outsource one depot for six months) and compare measured downtime and cost.

### Maturity model

**This maturity model is this Atlas's proposal**, not an industry standard; move up one level at a time.

::: figure Fleet operations maturity: five levels
```mermaid
flowchart TB
  L1["1 Reactive: spreadsheets, fix on failure"] --> L2["2 Recorded: register, PM schedule, defects"]
  L2 --> L3["3 Measured: KPIs per km, coaching"]
  L3 --> L4["4 Optimised: EAC, right-sizing, routing"]
  L4 --> L5["5 Adaptive: condition-based, energy-managed"]
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  class L1,L2 neutral
  class L3,L4,L5 core
```
Text equivalent: Five levels in sequence: 1 reactive (spreadsheets, fix on failure); 2 recorded (register, PM schedule,
defect records); 3 measured (KPIs per km, coaching); 4 optimised (replacement by EAC, right-sizing, routing); 5 adaptive
(condition-based maintenance, managed energy).
:::

| Level | Observable behaviour | Exit criteria (evidence to move up) | Typical constraint |
|---|---|---|---|
| 1 Reactive | Vehicles bought on price, fixed when broken, no single list | Complete register; every vehicle has an owner and mission | No time; data scattered |
| 2 Recorded | Register, PM schedule, defect reports, licence checks | PM compliance measured for 3 months; defects closed before reuse | Workshop capacity; paper records |
| 3 Measured | Monthly KPI pack per km; reviewed safety events; fuel exceptions worked | KPIs stable for two quarters; coaching records; data-quality checks pass | Telematics coverage; privacy groundwork |
| 4 Optimised | Replacement by EAC; right-sizing study; routing tools; EV pilots on evidence | Fleet size and replacement plan approved from studies; pilot results published internally | Capital approvals; organisational resistance to pooling |
| 5 Adaptive | Condition-based maintenance for major components; managed charging; continuous right-sizing | Model forecasts back-tested; energy cost per km tracked by tariff window | Data history; integration effort |

Most fleets gain more from levels 1 to 3 than from anything at level 5.

### Adoption roadmap: 30/60/90 days

For a fleet manager starting at level 1 or 2.

| Window | Actions | Milestone | Metric started |
|---|---|---|---|
| Days 1–30 | Build the vehicle and driver registers; collect every lease, insurance and inspection document; list overdue inspections and open defects; fix anything safety-critical now; write the defect sign-off rule | Every vehicle known, nothing unsafe in service | Open safety-critical defects; overdue inspections |
| Days 31–60 | Put the PM schedule in a system; start the weekly maintenance and safety review; set fuel-card controls and exception rules; decide the telematics purpose, write the monitoring policy and DPIA where required; consult drivers | PM compliance reported weekly; monitoring policy published | PM compliance; fuel exceptions; availability |
| Days 61–90 | First monthly KPI pack (cost per km, utilisation, collisions per million km); first right-sizing pass on the lowest-utilisation vehicles; cost model (Lab 1) for the next replacement round; EV duty-cycle screen | Fleet plan draft with a replacement list and size target | Cost per km; utilisation; collision rate |

Dependencies: finance (cost data), HR (driver records, consultation), procurement (contracts), IT or IoT (telematics). Quick
wins: closing old defects, cancelling unused fuel cards, returning clearly redundant vehicles.

## Toolkit

### Checklists

**Commissioning a new vehicle**

- [ ] Registered, insured, taxed; documents in the register
- [ ] Telematics installed, mapped to the unit, ignition and odometer verified on a test drive
- [ ] Upfit (racking, lighting, equipment) inspected and recorded
- [ ] PM schedule created from the class template
- [ ] Driver induction on the vehicle done and recorded

**Operating readiness for electric vehicles**

- [ ] Routes screened against winter range with a reserve
- [ ] Charging capacity confirmed for the overnight window, with managed charging configured
- [ ] Chargers OCPP-compliant; CSMS alerts on failed sessions and projected shortfall
- [ ] Fallback plan (rapid chargers on route, spare vehicles) documented
- [ ] Workshop staff trained for high-voltage safety; tools available

**Monthly governance review**

- [ ] KPI pack reviewed, with actions and owners
- [ ] Overdue PMs and defects open more than 48 hours explained
- [ ] Fuel and energy exceptions closed or escalated
- [ ] Safety events reviewed; coaching done; repeat events escalated
- [ ] Data-quality report clean (silent devices, unassigned trips)

**Privacy and data audit (annual)**

- [ ] Each data feed has a purpose, lawful basis, retention and access list
- [ ] Monitoring policy shared with drivers and current
- [ ] DPIA reviewed where required
- [ ] Audio recording off by default; driver-facing cameras justified where used
- [ ] Data removed from disposed vehicles; leavers' accounts removed

**After a collision**

- [ ] People cared for; emergency services called where needed
- [ ] Telematics and camera data preserved before routine deletion
- [ ] Report, photos, statements, duty-status record collected
- [ ] Preventability decided against the written definition
- [ ] Actions (coaching, route, vehicle) recorded and tracked to close

### Templates

**One-page fleet policy (outline).**

```text
FLEET POLICY                                   Owner: Fleet manager   Review: annual
1. Scope: vehicles owned, leased, rented, and own vehicles used for work
2. Eligibility: who may have an assigned vehicle; pool use for others
3. Drivers: licence checks (on hire, every 6 months), training, fitness to drive
4. Vehicle use: business use, private use rules, passengers, phone use, alcohol
5. Checks: daily walkaround; defect reporting; who signs off repairs
6. Working time: limits that apply; planner and driver responsibilities
7. Fuel and charging: cards, limits, home charging reimbursement, idling
8. Monitoring: data collected, purpose, retention, who sees it, drivers' rights
9. Collisions: what to do, reporting deadline, investigation
10. Replacement: review cycle, criteria (EAC, condition, mission)
```

**Defect report and close-out (fields).**

```text
DEFECT REPORT
Vehicle (unit, registration):        Odometer:        Date/time:
Reported by:                         Found during: walkaround / trip / inspection
Item:  brakes | steering | lights | tyres | wheels | mirrors | wipers | coupling
       | horn | emergency equipment | other: __________
Description:
Safety-critical?  yes / no           Vehicle off road?  yes / no
REPAIR (workshop)
Work order:        Action taken:                     Parts:
Repaired by:       Certified safe by:                Date/time:
Driver review of repair (next driver):  signature / app confirmation
```

**Replacement review record (one per vehicle group).**

```text
REPLACEMENT REVIEW                           Group: ______   Date: ______
Units in group: __   Average age: __   Average km: ______
Current EAC curve (attach model): economic life = __ years
Condition: open defects __, repeat defects __, downtime days (12 mo) __
Mission change expected? ______   Utilisation (days %) __
Options considered: like-for-like / different class / EV / lease / remove
Decision: ______   Rationale: ______   Budget year: ____
Approved by: ______ (fleet)   ______ (finance)
```

**Telematics data decision record.**

```text
DATA DECISION RECORD                        ID: TEL-___   Date: ______
Feed: location / driving events / video / audio / fuel / engine data
Decision it supports: ______________________________
Lawful basis or legal requirement: ______   DPIA needed? yes / no
Who can see it: ______   Retention: ______   Private-use handling: ______
Drivers informed how: ______   Review date: ______
```

### Deep comparisons

| Option | Strength | Weakness | Choose when |
|---|---|---|---|
| Own fleet operated in-house | Control of service, safety and cost | Capital, management effort, compliance burden | Transport is core to the service and volumes are steady |
| Outsourced transport (carriers, couriers) | No vehicles or drivers to manage | Less control of service; price at peak | Transport is not a differentiator ([SupplyChainOps](../supplychainops/)) |
| Grey fleet with mileage allowance | No assets | Weak control over vehicle safety and emissions; employer duty remains[^hse] | Occasional business travel |
| Telematics-led programme | Data for coaching, maintenance and sizing | Privacy, cost, false positives | Defined decisions depend on the data |

### FAQ

**Is FleetOps a recognised discipline?**
The practice is, as fleet management or fleet operations, with an association and certification (NAFA, CAFM)[^nafa-cafm] and
regulations that define much of the work. The one-word "FleetOps" is mainly a product name (see [Term status](#term-status-an-established-field-under-a-product-name-label)).

**How is this different from logistics or supply chain management?**
Supply chain decides what moves where, by which mode and carrier; fleet operations runs the organisation's own vehicles and
drivers. A field-service or utility fleet can be large and move few goods.

**Do we need telematics?**
Only if a decision depends on it: sizing the fleet, scheduling maintenance by engine hours, coaching drivers, reconciling fuel,
or proving working time. Write those decisions down first, then apply the rules in
[Safety, privacy and compliance](#safety-privacy-and-compliance).

**When should we replace a vehicle?**
When one more year costs more than the best replacement's EAC (the [replacement rule](#total-cost-of-ownership-and-equivalent-annual-cost)).
Bring it forward for a mission change or repeated serious defects; push it back only with evidence of lower running costs.

**Are electric vans cheaper?**
It depends on duty cycle, charging price and keep period: in [Lab 1](#lab-1-beginner-tco-equivalent-annual-cost-and-economic-life)
the same van wins with depot charging and loses on public charging. Run the model with your own numbers and test winter
range.[^cold]

**Do hours-of-service rules apply to our vans?**
It depends on jurisdiction, weight, use and exceptions such as the US short-haul radius;[^cfr3951] in the EU, tachographs now
reach some 2.5–3.5 t vans on international hire-or-reward work.[^eu-tacho] Check with your regulator; this is not legal advice.


## Going further

### Advanced topics and emerging direction

- **Established now:** telematics with engine data; electronic duty-status records; outward and AI-assisted dash cameras;
  managed depot charging over OCPP;[^ocpp] route optimisation solvers.[^ortools]
- **Spreading, with conditions:** condition-based maintenance from fault codes; dispatch that plans around state of charge;
  Plug & Charge and bidirectional charging under ISO 15118,[^iso15118] where vehicle and charger support it.
- **Regulatory change to watch:** data access rights for connected vehicles in the EU (the Data Act has applied since
  12 September 2025);[^dataact] tachograph scope extending to light vehicles in international transport;[^eu-tacho] shifting
  zero-emission fleet mandates, such as the partial repeal of California's Advanced Clean Fleets rule.[^carb-2025]
- **Automation:** remote assistance for automated vehicles[^waymo] moves fleet work towards exceptions, recovery and depots.
- **Speculative or vendor-driven:** predictive maintenance for small fleets; vehicle-to-grid revenue in an EV business case.
  Treat these as hypotheses to test.

### Learning path

| Stage | What to do | Output |
|---|---|---|
| Prerequisites | Spreadsheets; discounting (NPV); your jurisdiction's working-time and roadworthiness rules | Notes on the rules that apply |
| 1-day primer | The first two parts and [the economics part](#the-economics-of-an-asset-heavy-operation); Lab 1 | A first EAC curve |
| 1-week practice | Labs 2 to 4; a vehicle register; a defect sign-off rule | Register, KPI definitions, one SOP |
| 30-day progression | KPI pack; right-sizing pass; monitoring policy with a DPIA outline; EV screen of one group | A fleet plan draft |
| Specialisation | Maintenance, safety and compliance, energy, or routing; NAFA's CAFM disciplines map the field[^nafa-cafm] | A deeper project |
| Portfolio ideas | Replacement model with sensitivity analysis; EV duty-cycle screen; privacy-by-design telematics policy | Work samples |

## Wrap-up

### Executive recap and cheat sheet

| Area | Remember |
|---|---|
| Core decisions | How many; which and for how long; how each vehicle-hour is used; how safe and legal it is |
| Economics | Compare options by EAC; replace when one more year of the old vehicle costs more than the replacement's EAC |
| Sizing | Size to a high percentile of daily peak use plus a measured spare allowance; price rentals for the rest |
| Maintenance | Time-based safety inspections as the floor; condition-based where data is trusted; defects closed before reuse |
| Working time | Plan routes that can be driven legally; the ELD or tachograph is the legal record, not your planning tool |
| Safety | Safe driver, vehicle, journey; rates per km with minimum exposure; coach first |
| EVs | Duty cycle, winter range, charging location and power, keep period. Pilot, then scale |
| Privacy | Purpose, proportionality, transparency, retention; private use rarely monitored; audio off by default (UK ICO) |
| Metrics | Cost per km, availability, PM compliance, defect close-out time, energy per 100 km, collisions per million km, hours breaches |
| Next actions | Register, overdue list, sign-off rule; then PM system and policy; then KPI pack and fleet plan |

### A judgement call: electrify now or keep the diesels one more year?

::: example Illustrative scenario
A utility runs 40 diesel vans, now six years old, on 25,000 km a year from one depot. A sustainability target asks for the
first electric vans this year. The depot's grid connection cannot support 40 chargers until an upgrade that the utility
estimates will take 12 to 15 months. Costs follow Lab 1's illustrative inputs.
:::

**Option A: replace all 40 now with electric vans**; five charge on the depot's spare capacity and 35 at public rapid chargers
until the depot upgrade is done.
**Option B: keep the diesels one more year**, order the depot upgrade now, run a five-van electric pilot on the depot's existing
spare capacity, and replace the rest at the end of year 7.

**Assumptions** (from the [replacement rule](#total-cost-of-ownership-and-equivalent-annual-cost) and Lab 1): a diesel's
seventh year costs about 12,848 and its eighth about 13,858; a depot-charged electric van's EAC is about 12,737; public charging
at 0.45 instead of 0.22 per kWh adds about 1,380 a year per van (6,000 kWh × 0.23).

**Reasoning.**

1. Option A meets the target now, but the electric van is cheaper only with depot charging. Over the 12 to 15 months of the
   upgrade, 35 vans would pay about 1,380 more each per year for energy (about 48,000 to 60,000 in total), plus driver time
   at public chargers that the model does not count.
2. Option B's extra diesel year (12,848) costs almost the same as a depot-charged electric van (12,737). Waiting one year is
   cheap; waiting two (13,858) is not.
3. The pilot measures what the model lacks: winter energy use, charging behaviour, driver feedback.
4. Uncertainty: faster diesel resale decline or a slipping utility date hurt B; rising public-charging prices hurt A.

**Decision.** Option B, with a trigger: if the upgrade slips past month 15, replace the oldest diesels with electric vans on
managed charging that fits existing capacity rather than running all diesels into year 8. The attractive choice is wrong
because charging infrastructure, not the vehicle, sets the cost.

### Learning objectives and mastery check

After this page you should be able to: explain fleet operations and its handoffs; calculate EAC and an economic life;
estimate fleet size from trip data; design a layered maintenance strategy and defect close-out; plan within working-time rules;
design a safety and monitoring programme defensible on privacy; and decide whether a vehicle group is ready to electrify.

::: answer 1. Two vans: van P has EAC 12,900 over 7 years; van Q has EAC 12,700 over 9 years. Your policy replaces every van at 5 years. Which is cheaper?
Neither figure answers it: the policy keeps both for five years. In Lab 1's case the five-year EACs are 13,029 (diesel) and
13,957 (electric), so the diesel wins under this policy although the electric van wins at its own economic life. The policy
decided the outcome; consider class-specific replacement ages.
:::

::: answer 2. A depot had 1 collision last year in 400,000 km; another had 4 in 1.6 million km. Which depot is safer?
Both rates are 2.5 per million km, and with so few events the intervals are wide (for one event the 95% Poisson interval for
the count is roughly 0.03 to 5.6). Neither is shown safer: use leading measures and pool several years.
:::

::: answer 3. A driver reports a soft brake pedal at 16:00. The dispatcher needs the truck at 06:00. Who decides whether it goes out, and on what basis?
The maintenance function decides, after inspection, and certifies the repair or that no repair was needed; dispatch is informed.
In the US the carrier must repair defects likely to affect safety and certify before further operation;[^cfr39611] in Great
Britain the driver remains legally responsible for the vehicle's condition while in use.[^dvsa] If it is not certified by
06:00, dispatch uses a spare.
:::

::: answer 4. Your planning tool says a route is legal under US hours of service. At roadside the driver is cited for exceeding the 14-hour window. What went wrong?
Probably on-duty time before the first trip was not counted, or durations were too short: the window runs from coming on duty,
not from starting to drive.[^cfr3953] Compare ELD records with the plan and re-cut the route.
:::

::: answer 5. HR wants driver-facing cameras with continuous audio in all company cars, which staff also use privately. What do you advise in the UK?
Advise against the design as proposed. The ICO says monitoring during private use will rarely be justified, that audio should be
off by default and used only in exceptional circumstances, that workers and passengers must be informed, and that a DPIA is
required for driver monitoring with cameras or audio.[^ico] Start from the safety problem to solve; outward-facing, event-triggered cameras with
private-use disablement may meet it.
:::

::: answer 6. A group of vans drives 180 km a day in winter. Usable range is 260 km in summer. Should they go electric now?
Not on these numbers. Range can fall by around 40% in freezing conditions with heating,[^cold] bringing 260 km to about 155 km,
below the route. Re-cut routes, add mid-route charging, choose a larger battery, or wait; test with a winter pilot.
:::

### Conclusion

Fleet operations is not glamorous and not new, and that is its strength: the problems are understood, the rules written
down, and the economics fit in a spreadsheet. Its failures are failures of discipline: vehicles nobody owns, inspections that
slip, defects that get driven, rules planners cannot see, and buying on price.

The newer pressures (telematics, cameras, electrification, automation) do not change this. They make the data richer,
the privacy questions sharper and the cost model more sensitive to where and when energy is bought. A fleet that already knows
its utilisation, its economic lives and its defect close-out times can absorb those changes with evidence. A fleet that does
not will find that the new technology mostly measures its old problems more precisely.

## Sources and further reading

[^wiki-fleet]: [Fleet management](https://en.wikipedia.org/wiki/Fleet_management) — Wikipedia, live page. Checked 2026-10-23.
[^nafa]: [NAFA Fleet Management Association](https://www.nafa.org/) — NAFA, live page. Checked 2026-10-23.
[^nafa-cafm]: [CAFM Certification Disciplines](https://www.nafa.org/certification/disciplines/) — NAFA, live page. Checked 2026-10-23.
[^pinellas]: [Division Manager, Fleet Operations (class specification)](https://pinellas.gov/class-specification/division-manager-fleet-operations/) — Pinellas County, Florida, last updated 09/2023. Checked 2026-10-23.
[^fleetbase]: [fleetbase/fleetops](https://github.com/fleetbase/fleetops) — Fleetbase, GitHub repository, live. Checked 2026-10-23.
[^appstore]: [FleetOps (iOS app)](https://apps.apple.com/ci/app/fleetops/id1605781855) — Hypernym LTD, Apple App Store listing, live. Checked 2026-10-23.
[^class8]: [FleetOps is now Class8](https://www.fleetops.ai/) — Class8, live page. Checked 2026-10-23.
[^niosh]: [Motor Vehicle Safety at Work](https://www.cdc.gov/niosh/motor-vehicle/about/index.html) — CDC NIOSH, 2024-05-16. Checked 2026-10-23.
[^who]: [Road traffic injuries (fact sheet)](https://www.who.int/news-room/fact-sheets/detail/road-traffic-injuries) — World Health Organization, 2026-07-20. Checked 2026-10-23.
[^iso39001]: [ISO 39001](https://en.wikipedia.org/wiki/ISO_39001) — Wikipedia, live page (iso.org could not be fetched automatically). Checked 2026-10-23.
[^hse]: [Employers – driving and riding safely for work](https://www.hse.gov.uk/roadsafety/employer/index.htm) — UK Health and Safety Executive, updated 2025-02-21. Checked 2026-10-23.
[^fmcsa-sms]: [Enhanced Carrier Safety Measurement System (SMS), 89 FR 91874](https://www.govinfo.gov/content/pkg/FR-2024-11-20/pdf/2024-27087.pdf) — Federal Motor Carrier Safety Administration, Federal Register notice, 2024-11-20. Checked 2026-10-23.
[^cfr39125]: [49 CFR § 391.25 — Annual inquiry and review of driving record](https://www.law.cornell.edu/cfr/text/49/391.25) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^dvla]: [Check someone's driving licence information](https://www.gov.uk/check-driving-information) — DVLA, GOV.UK, live. Checked 2026-10-23.
[^isa-reg]: [Commission Delegated Regulation (EU) 2021/1958, recital 1, on Article 6 of Regulation (EU) 2019/2144](https://lexaris.de/book/version/documentflat/head/2056920) — unofficial copy of OJ L 409, 17.11.2021 (EUR-Lex could not be fetched automatically). Checked 2026-10-23.
[^basics]: [Behavior Analysis and Safety Improvement Categories (BASICs)](https://gomotive.com/glossary/fleet-safety/behavior-analysis-and-safety-improvement-categories/) — Motive, vendor summary of FMCSA's categories (FMCSA's CSA site could not be fetched automatically), live. Checked 2026-10-23.
[^isa]: [Intelligent speed assistance (ISA) set to become mandatory across Europe](https://road-safety-charter.ec.europa.eu/resources-knowledge/media-and-press/intelligent-speed-assistance-isa-set-become-mandatory-across_en) — European Commission, European Road Safety Charter, undated. Checked 2026-10-23.
[^samsara]: [Driver Behavior guide](https://developers.samsara.com/docs/driver-behavior-guide) — Samsara developer documentation, live. Checked 2026-10-23.
[^waymo]: [Fleet response: Lending a helpful hand to Waymo's autonomously driven vehicles](https://waymo.com/blog/2024/05/fleet-response/) — Waymo, 2024-05-21. Checked 2026-10-23.
[^cfr3953]: [49 CFR § 395.3 — Maximum driving time for property-carrying vehicles](https://www.law.cornell.edu/cfr/text/49/395.3) — US Code of Federal Regulations via Cornell LII, last amended 2020. Checked 2026-10-23.
[^cfr3958]: [49 CFR § 395.8 — Driver's record of duty status](https://www.law.cornell.edu/cfr/text/49/395.8) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^cfr3951]: [49 CFR § 395.1 — Scope of rules in this part](https://www.law.cornell.edu/cfr/text/49/395.1) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^cfr39522]: [49 CFR § 395.22 — Motor carrier responsibilities: in general](https://www.law.cornell.edu/cfr/text/49/395.22) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^cfr39375]: [49 CFR § 393.75 — Tires](https://www.law.cornell.edu/cfr/text/49/393.75) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^tyres10]: [Ban on tyres over 10 years old for heavy vehicles and some minibuses](https://movingon.blog.gov.uk/2020/12/09/ban-on-tyres-over-10-years-old-for-heavy-vehicles-and-some-minibuses/) — DVSA, Moving On (GOV.UK blog), 2020-12-09. Checked 2026-10-23.
[^cfr3963]: [49 CFR § 396.3 — Inspection, repair, and maintenance](https://www.law.cornell.edu/cfr/text/49/396.3) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^cfr39611]: [49 CFR § 396.11 — Driver vehicle inspection report(s)](https://www.law.cornell.edu/cfr/text/49/396.11) — US Code of Federal Regulations via Cornell LII. Checked 2026-10-23.
[^eu561]: [Driving time and rest periods](https://transport.ec.europa.eu/transport-modes/road/social-provisions/driving-time-and-rest-periods_en) — European Commission, DG Mobility and Transport, undated. Checked 2026-10-23.
[^eu-tacho]: [Tachograph](https://transport.ec.europa.eu/transport-modes/road/social-provisions/tachograph_en) — European Commission, DG Mobility and Transport, undated. Checked 2026-10-23.
[^dvsa]: [Guide to maintaining roadworthiness: commercial goods and passenger carrying vehicles](https://www.gov.uk/government/publications/guide-to-maintaining-roadworthiness/guide-to-maintaining-roadworthiness-commercial-goods-and-passenger-carrying-vehicles) — Driver and Vehicle Standards Agency, GOV.UK, updated 2025-04-28. Checked 2026-10-23.
[^dataact]: [Data Act](https://digital-strategy.ec.europa.eu/en/policies/data-act) — European Commission, Shaping Europe's digital future, live. Checked 2026-10-23.
[^ico]: [Monitoring workers: specific data protection considerations for different ways or methods of monitoring](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/employment/monitoring-workers/specific-data-protection-considerations-for-different-ways-or-methods-of-monitoring-workers/) — UK Information Commissioner's Office, undated (marked under review). Checked 2026-10-23.
[^gdpr35]: [Art. 35 GDPR: Data protection impact assessment](https://gdpr-info.eu/art-35-gdpr/) — Regulation (EU) 2016/679 text via gdpr-info.eu. Checked 2026-10-23.
[^eac]: [Equivalent annual cost](https://en.wikipedia.org/wiki/Equivalent_annual_cost) — Wikipedia, live page. Checked 2026-10-23.
[^tco]: [Total cost of ownership](https://en.wikipedia.org/wiki/Total_cost_of_ownership) — Wikipedia, live page. Checked 2026-10-23.
[^vam]: [Federal Fleet Requirements Resource Center: General Services Administration Vehicle Allocation Methodology](https://www.energy.gov/cmei/femp/federal-fleet-requirements-resource-center-general-services-administration-vehicle) — US Department of Energy, Federal Energy Management Program, summary dated 2020-06-02. Checked 2026-10-23.
[^gf-vam]: [GSA offers tool to optimize federal fleet](https://www.government-fleet.com/75541/gsa-offers-tool-to-optimize-federal-fleet) — Government Fleet, 2011-09-12. Checked 2026-10-23.
[^gf-replace]: [Vehicle replacement policy: the lifeline of government fleet management](https://www.government-fleet.com/145086/vehicle-replacement-policy-the-lifeline-of-government-fleet-management) — D. Weichman, Government Fleet, 2004-03-01. Checked 2026-10-23.
[^rightsizing]: [Fleet Rightsizing](https://afdc.energy.gov/conserve/rightsizing) — US DOE Alternative Fuels Data Center, undated. Checked 2026-10-23.
[^idle]: [Idle Reduction](https://afdc.energy.gov/conserve/idle-reduction-basics) — US DOE Alternative Fuels Data Center, undated. Checked 2026-10-23.
[^driving]: [Driving More Efficiently](https://afdc.energy.gov/conserve/driving-behavior) — US DOE Alternative Fuels Data Center, undated. Checked 2026-10-23.
[^pdm]: [Predictive maintenance](https://en.wikipedia.org/wiki/Predictive_maintenance) — Wikipedia, live page. Checked 2026-10-23.
[^ortools]: [Routing](https://developers.google.com/optimization/routing) — Google OR-Tools documentation, updated 2025-01-22. Checked 2026-10-23.
[^ortools-vrp]: [Vehicle Routing Problem](https://developers.google.com/optimization/routing/vrp) — Google OR-Tools documentation, updated 2026-03-18. Checked 2026-10-23.
[^vrp-wiki]: [Vehicle routing problem](https://en.wikipedia.org/wiki/Vehicle_routing_problem) — Wikipedia, live page. Checked 2026-10-23.
[^j1939]: [SAE J1939](https://en.wikipedia.org/wiki/SAE_J1939) — Wikipedia, live page. Checked 2026-10-23.
[^obd]: [On-board diagnostics](https://en.wikipedia.org/wiki/On-board_diagnostics) — Wikipedia, live page. Checked 2026-10-23.
[^traccar]: [Traccar](https://www.traccar.org/) — Traccar, live page. Checked 2026-10-23.
[^traccar-api]: [Traccar OpenAPI description (openapi.yaml), version 6.16.0](https://raw.githubusercontent.com/traccar/traccar/master/openapi.yaml) — Traccar, GitHub, as of 2026-10-23. Checked 2026-10-23.
[^afleet]: [AFLEET fact sheet](https://afdc.energy.gov/files/u/publication/afleet-fact-sheet.pdf) — US DOE Clean Cities / Argonne National Laboratory, December 2023 (DOE/EE-2798). Checked 2026-10-23.
[^ev-maint]: [Maintenance and Safety of Electric Vehicles](https://afdc.energy.gov/vehicles/electric-maintenance) — US DOE Alternative Fuels Data Center, undated. Checked 2026-10-23.
[^charging]: [Developing Infrastructure to Charge Electric Vehicles](https://afdc.energy.gov/fuels/electricity-stations) — US DOE Alternative Fuels Data Center, undated. Checked 2026-10-23.
[^infra]: [Electric Vehicle Charging Infrastructure Development](https://afdc.energy.gov/fuels/electricity-infrastructure-development) — US DOE Alternative Fuels Data Center, undated. Checked 2026-10-23.
[^cold]: [Fuel Economy in Cold Weather](https://www.fueleconomy.gov/feg/coldweather.shtml) — fueleconomy.gov (US DOE and EPA), undated. Checked 2026-10-23.
[^ocpp-profiles]: [OCPP Security: security profiles](https://www.winccoa.com/documentation/WinCCOA/latest/en_US/ocpp/ocpp_security.html) — WinCC OA product documentation, live (summarises the profiles of the OCPP security specification). Checked 2026-10-23.
[^ocpp-tuw]: [Sicherheitsstudie Ladeinfrastrukturanbindung](https://repositum.tuwien.at/handle/20.500.12708/189793) — J. Fabini, A. Hartl, F. Meghdouri, T. Zseby, TU Wien, for Oesterreichs Energie, 2023-06-06 (German; quotation from the English abstract). Checked 2026-10-23.
[^ocpp]: [Open Charge Point Protocol](https://openchargealliance.org/protocols/open-charge-point-protocol/) — Open Charge Alliance, live page. Checked 2026-10-23.
[^iso15118]: [ISO 15118](https://en.wikipedia.org/wiki/ISO_15118) — Wikipedia, live page. Checked 2026-10-23.
[^nacs]: [North American Charging System](https://en.wikipedia.org/wiki/North_American_Charging_System) — Wikipedia, live page. Checked 2026-10-23.
[^fw-settle]: [California deal with 16 states would end key parts of Advanced Clean Fleets rule](https://www.freightwaves.com/news/california-deal-with-16-states-would-end-key-parts-of-advanced-clean-fleets-rule) — FreightWaves, 2025-05-08. Checked 2026-10-23.
[^carb-2025]: [CARB adds flexibility to truck fleet requirements with amendments to help owners continue zero-emission progress](https://ww2.arb.ca.gov/news/carb-adds-flexibility-truck-fleet-requirements-amendments-help-owners-continue-zero-emission) — California Air Resources Board, release 25-34, 2025-09-25. Checked 2026-10-23.
[^epa-scope]: [Scope 1 and Scope 2 Inventory Guidance](https://www.epa.gov/climateleadership/scope-1-and-scope-2-inventory-guidance) — US EPA, updated 2026-04-02. Checked 2026-10-23.
[^smartway]: [Learn About SmartWay](https://www.epa.gov/smartway/learn-about-smartway) — US EPA, updated 2026-07-14. Checked 2026-10-23.

**Changelog**

- 2026-10-23: First version. Research, ledger (`research/fleetops-ledger.md`), four labs executed, nine diagrams. Not yet
  independently reviewed.
- 2026-10-23 (review round 1): ICO DPIA scope corrected and EU rule added; Class8 quotation made verbatim; Traccar script now
  converts to local time and numbers working days, Lab 2 takes the day count and rejects bad rows; CARB status from CARB's
  own release; ISA vehicle categories; OCPP security, licence checks, tyres, claims and chargeback added; glossary extended;
  sequence and chart diagrams revised; repetition cut (`reviews/fleetops-r1-response.md`).
- 2026-10-23, post-score polish: AFLEET footnote dated December 2023 (DOE/EE-2798); TU Wien conclusion quoted verbatim from
  the abstract; reference architecture gains an energy and cost record (fuel cards, tanks and chargers feed it; the gateway
  feeds maintenance); EAC chart narrowed to fit a phone; repeated public-charging result in the EV section replaced by a link
  to Lab 1 (`reviews/fleetops-polish.md`).
