Most fleets don't have a data problem. They have a definition problem.
Ask three people in the same shop what counts as a "completed work order" and you'll get three different answers. Ask what an "asset" is, and someone points to the truck, someone else to the engine, and a third person to the VIN in the telematics feed that doesn't match the unit number on the wall. None of them are technically wrong — that's exactly the issue. When everyone is locally right and globally inconsistent, no dashboard or PdM model is going to save you.
This blueprint is about the boring layer nobody wants to own — the canonical taxonomy, the governance roles, the retention and lineage rules, the decision of what streams versus what batches. Get this layer right and analytics gets easier. Get it wrong and you'll spend the next two years explaining why the numbers don't tie out.
Why the taxonomy is the real foundation (and why it keeps collapsing)
Fleet data platforms usually get built backwards. Someone buys a BI tool, connects it to the maintenance system, and starts making charts. Six months later half those charts are quietly abandoned because nobody trusts what they're showing. The reason is almost always the same — the underlying entities were never agreed on.
In real operations, this shows up when three systems each carry their own version of the truth:
-
The maintenance system (or CMMS) knows work orders and labor.
-
The telematics platform knows the vehicle by device ID and raw fault codes.
-
The parts/inventory system knows SKUs, costs, and what got consumed.
Each was purchased at a different time, by a different person, to solve a different immediate pain. Nobody stitched together a shared vocabulary because there was no pressure to. Then predictive maintenance shows up, or finance asks for cost-per-mile by asset class, and suddenly the seams are load-bearing.
The pattern that repeats itself: fleets try to solve this with a mega-mapping spreadsheet. Column A is the CMMS unit number, Column B is the telematics device, Column C is the DOT number, and so on. It works until a truck gets reassigned, a device gets swapped, or someone leaves and the spreadsheet quietly goes stale. The spreadsheet isn't a data model — it's a promise that someone will maintain it forever, and that promise always breaks.
The minimal canonical model: three entities, done right
You don't need forty tables. You need three core entities defined cleanly, plus the relationships between them. Small enough that people can actually hold it in their heads.
Prevent costly breakdowns with proactive maintenance.
Fleetelyly helps you schedule, track, and manage every vehicle service efficiently.
- Automated maintenance reminders
- Real-time service tracking
- Parts inventory integration
No credit card required
Asset. The physical thing you maintain and depreciate. Critically, an asset is not the same as a telematics device or a work order target. An asset has a stable internal ID that never changes for the life of the unit — even when you swap the engine, re-plate it, or move it to a different depot. External identifiers (VIN, device serial, license plate) are attributes that can change over time. They hang off the asset; they don't define it.
Work Order. The unit of committed maintenance work. This is where most models get bloated because people confuse the work order with everything attached to it — the tasks, the parts, the labor lines, the inspection findings. Keep the work order lean: what asset, why it was opened, what type (corrective, preventive, inspection, campaign), when, and its lifecycle state. Everything else attaches as child records.
Event. The atomic thing that happened. A fault code fired. A PM came due. A technician clocked on. A part was issued. Events are immutable — you never edit an event, you append a new one. This is the single most important design decision for anyone who wants PdM later, because models learn from sequences of events and you can't learn from history that keeps getting rewritten.
In plain terms: Events happen to Assets. Some Events trigger Work Orders. Work Orders generate more Events. That loop is essentially the whole system.
| Entity | Stable ID | Mutable? | Lifecycle | Common mistake |
|---|---|---|---|---|
| Asset | Internal asset key (never reused) | Attributes change, identity doesn't | Acquired → In service → Down → Retired | Using VIN or unit number as the primary key |
| Work Order | WO number | State changes, facts don't | Draft → Open → In progress → Closed | Cramming parts, labor, and findings into the WO record itself |
| Event | Event ID | Never (append-only) | N/A — it already happened | Overwriting or "correcting" events in place |
The one rule that saves you the most pain: never let a business-facing identifier be your primary key. VINs get entered wrong. Unit numbers get recycled when a truck is sold. Device serials change when hardware is swapped. If your whole platform hangs off any of those, a single fat-fingered entry can corrupt years of history.
Governance roles: who's allowed to change what
A taxonomy with no owner degrades within a quarter. Someone always has a "quick reason" to add a new work order type or a one-off asset category, and nobody's job is to say no. Multiply that by a few years and you've got 14 work order types where 5 would do, three of which mean the same thing.
-
Data Owner (usually the fleet/maintenance manager). Owns the meaning of the entities. Approves any new asset class, work order type, or event category. This person doesn't touch the database; they own the definitions.
-
Data Steward (a senior shop lead or analyst). Handles the day-to-day — merging duplicate assets, correcting mis-mapped devices, flagging bad data. The steward is the human who resolves the "which truck is this actually" questions.
-
System Admin (IT or platform vendor). Controls schema changes and access. Can enforce that a field is required, but cannot decide what the field means.
-
Consumers (finance, ops, PdM/analytics). Read-only against the canonical model. They can request changes but can't make them.
The failure mode here is subtle. When there's no steward, everyone becomes a part-time steward — technicians "fixing" data on the fly, an analyst quietly maintaining a shadow lookup table, finance re-keying numbers into their own workbook. The data doesn't get better; it fragments into private versions. A named steward with roughly four to six hours a week carved out for this work is cheaper than the cost of three departments each maintaining their own reconciliation.
This also connects directly to how your systems talk to each other. If you haven't nailed down the contracts between your CMMS, telematics, and parts systems, the governance layer has nothing solid to sit on — which is the whole argument in the data-contract playbook for CDC, APIs and event-driven flows.
Retention and lineage: the part everyone skips until an audit
Two questions will eventually be asked, and most fleets can't answer either:
-
Where did this number come from? (lineage)
-
How long do we keep this, and can we prove we did? (retention)
Lineage matters most the day a dashboard shows something alarming — cost per mile on a class jumped 30% — and nobody can trace whether it's a real trend or a data glitch. If your platform can point from the final number back through the transformations to the raw events, you resolve it in an hour. Without that, you spend a week and end up guessing.
The practical rule: every derived number should be traceable to the immutable events that produced it. This is exactly why the append-only event design pays off. Your monthly cost-per-asset isn't a figure someone typed — it's a computation over a fixed set of labor, parts, and downtime events, and you can replay it.
Retention is more mundane but has teeth. Warranty claims, DOT compliance, and accident reconstruction all have their own clocks. A reasonable default pattern:
-
Raw events (fault codes, sensor readings) keep 18–24 months hot for PdM training, then roll to cold storage.
-
Work orders and labor keep the full life of the asset plus a few years after disposal — warranty and litigation windows don't care that you scrapped the truck.
-
Financial/chargeback records whatever your finance and tax retention policy dictates, usually 7 years.
-
Telematics high-frequency streams often the most expensive to store; downsample aggressively after the analytics window unless a specific model needs the raw resolution.
The mistake we see is treating all data with one retention rule — either keeping everything forever (storage bills balloon and you inherit legal exposure you didn't need) or purging aggressively and then having a PdM vendor ask for two years of history you no longer have. Tier it by entity.
Streaming vs batch: match the pattern to the decision
There's a reflex right now to stream everything in real time. Most of it is wasted. The right question isn't "can we stream it," it's "does a human or system need to act on this within seconds, or is a daily rollup fine?"
| Data | Pattern | Why |
|---|---|---|
| Critical fault codes (engine derate, brake faults) | Stream | Someone needs to route this to a work order now |
| Position / routine telematics | Micro-batch (minutes) | Near-real-time is plenty; per-second streaming rarely changes a decision |
| Work order status changes | Stream or near-real-time | Shop coordination and bay scheduling depend on it |
| Parts consumption | Batch (hourly/daily) | Inventory decisions don't move by the second |
| Cost, chargebacks, KPIs | Batch (daily/nightly) | Reporting layer; freshness in hours is fine |
| PdM feature computation | Batch for training, stream for scoring | Train on history, score on live signals |
The nuance most teams miss: streaming and batch aren't a religious choice, they're two roads that should end at the same canonical event store. Stream the urgent stuff for immediate routing, and also land it in the same event history that batch analytics reads. When streaming and batch write to separate stores with different definitions, you get the classic "the alert said X but the report said Y" problem, and trust collapses fast.
For anyone building toward predictive maintenance, this split has real consequences downstream. The offline training pipeline and the live scoring path have to agree on how a feature is calculated, or your model silently degrades — a trap covered in more depth in the PdM model-operations pitfalls and MLOps checklist.
A real scenario: a regional fleet that couldn't trust its own numbers
A regional distribution fleet — roughly 240 units across four depots, mixed light and medium-duty — had three systems and no shared model. Their CMMS used unit numbers, telematics used device IDs, parts lived in a separate inventory tool. When leadership asked for cost-per-mile by asset class, three people produced three different answers within about 12% of each other, and no one could explain the gap.
The root cause was mundane. Around 30 units had been reassigned between depots over two years, and the reassignments were tracked inconsistently — sometimes as a new record, sometimes as an edit to the old one. Telematics device swaps made it worse: a handful of trucks had their history split across two device IDs, so their fault data looked like two half-lives instead of one continuous record.
The fix wasn't a new tool. It was:
-
Assigning stable internal asset keys, decoupled from unit numbers and VINs.
-
Making device ID and unit number attributes with effective dates, so a swap became a dated attribute change instead of a new asset.
-
Converting the mapping spreadsheet into governed reference data with a named steward.
-
Rebuilding cost-per-mile as a computation over immutable events rather than a hand-assembled figure.
After the cleanup, the three-way disagreement collapsed to essentially rounding differences, and the reassigned units finally showed continuous cost histories. The unexpected payoff: a PdM pilot that had stalled — because the vendor kept flagging "discontinuous asset histories" — could finally move forward, since each asset now had one unbroken timeline.
None of this required real-time streaming or a data-science team. It required agreeing on what an asset is and refusing to let its identity float.
A migration path from spreadsheet chaos to a governed platform
If you're staring at a tangle of systems and mapping spreadsheets, don't try to fix everything at once. Migrate in a sequence that produces trustworthy data early.
-
Freeze the definitions first. Get the Data Owner to sign off on the three entities and their lifecycles before touching any data. One page, not a document.
-
Assign stable internal keys to assets. This is the anchor. Everything else maps to these.
-
Convert identifiers to dated attributes. VIN, device ID, plate, depot — all become effective-dated attributes, not primary keys. This alone fixes most reassignment and swap corruption.
-
Backfill events as append-only history. Load historical work orders, fault codes, and parts consumption as immutable events tied to the asset key. Don't clean history by overwriting — append corrections as new events.
-
Point one report at the new model. Pick the number people argue about most (usually cost-per-mile or PM compliance) and rebuild it on the canonical layer. Prove it ties out.
-
Migrate consumers one at a time. Finance, then ops, then PdM. Each move validates the model against a real use case.
-
Retire the shadow spreadsheets. Only after a consumer is fully on the new model. Killing them early creates panic; killing them late lets them rot in parallel.
A simple migration workflow like the one above helps stakeholders see the order and the early wins.
Backfill history as append-only events and avoid overwriting past records — it makes debugging lineage and models far easier.
This order works because you build trust before you build breadth. A single report that finally ties out does more for adoption than a fully migrated platform nobody believes yet.
A readiness checklist before you build anything
Run through this before writing a line of schema. If you can't check most of these, you're not ready to build — you're ready to argue, and it's cheaper to argue on a whiteboard.
-
- [ ] There is one agreed definition of "asset," and it isn't a VIN or unit number.
-
- [ ] Work orders have a defined lifecycle everyone recognizes.
-
- [ ] Events are append-only — no one edits history in place.
-
- [ ] A single named person owns entity definitions.
-
- [ ] A steward has real time allocated to fix data, not just goodwill.
-
- [ ] Every external identifier is a dated attribute, not a key.
-
- [ ] Retention is tiered by entity, not one blanket rule.
-
- [ ] Streaming and batch land in the same canonical event store.
-
- [ ] At least one contested KPI has a documented lineage path.
If you can't check most of these, you're not ready to build — you're ready to argue.
When this level of rigor is overkill
Not every fleet needs this. If you're running 20 vehicles out of a single shop with one maintenance system and no real analytics ambitions, a clean CMMS and a disciplined spreadsheet will carry you further than an event-sourced platform. The overhead of governance roles and lineage tracking would just be pure cost.
This blueprint earns its keep when a few things are true at once: multiple systems that don't natively agree, assets that move between locations or get reconfigured, and a genuine intent to do predictive maintenance or cross-fleet benchmarking. That last point matters more than fleet size — the moment you want to compare classes, depots, or vendors fairly, inconsistent definitions quietly poison every comparison. That's the same distortion that makes raw KPI comparisons misleading, which is worth reading alongside the normalization and benchmarking framework for mixed fleets.
Where this leaves you
The instinct when data feels untrustworthy is to buy a better dashboard or a smarter model. Almost always, the fix is one layer lower and far less glamorous: decide what your entities mean, protect their identity, keep events immutable, and give someone the authority to enforce it. Modern operational platforms make this easier — good ones enforce append-only event logs, dated attributes, and lineage automatically instead of leaving it to spreadsheet discipline — but the tooling only works if the definitions underneath it are settled.
Do the boring work once. The analytics, the PdM, the benchmarking — all of it gets dramatically easier, because for the first time everyone is looking at the same truth instead of their own locally-correct version of it.
The instinct when data feels untrustworthy is to buy a better dashboard or a smarter model. Almost always, the fix is one layer lower and far less glamorous: decide what your entities mean, protect their identity, keep events immutable, and give someone the authority to enforce it. Modern operational platforms make this easier — good ones enforce append-only event logs, dated attributes, and lineage automatically instead of leaving it to spreadsheet discipline — but the tooling only works if the definitions underneath it are settled.
Do the boring work once. The analytics, the PdM, the benchmarking — all of it gets dramatically easier, because for the first time everyone is looking at the same truth instead of their own locally-correct version of it.
Ready to maximize fleet uptime and reduce maintenance costs?
Join 2,000+ fleet managers using Fleetelyly to streamline maintenance workflows and improve vehicle reliability.