Eleven vehicles have not moved since morning, and the fleet is fine
In short
When some vehicles stop updating and the rest are fine, the platform works and something specific to those units does not — a suspended SIM, a disconnected battery, a wedged firmware build, or positions that arrive and fail validation. Bucket every vehicle by the age of its newest position and see what the stale set shares: model, install week, SIM batch, depot. That attribute is the fault.
Key takeaways
- A partial outage is an attribute problem. Find what the stale vehicles share before opening any code.
- Positions that arrive and fail validation look identical to positions that never arrived. Count rejects separately.
- A last-known marker with no age on it is a lie by omission. Every position needs its age rendered beside it.
- Set the unknown threshold per vehicle class, not per fleet: an asset tracker on battery is not late at 6 hours.
- Select last-known by device time, not arrival order, or a backfill burst will drag the map backwards.
Eleven out of four hundred is a diagnostic gift. A platform fault takes the whole fleet down; a subset that stalls while everything else reports normally is telling you the eleven share something the rest do not. So the first move is not to open the ingest logs. It is to bucket every vehicle in the fleet by the age of its newest position, then ask what the stale bucket has in common.
This page is about vehicles whose data genuinely stopped arriving or stopped being accepted. If the markers are frozen but fresh positions are landing on the server, that is a transport and rendering fault and belongs to the map is open and the vehicles have stopped moving. One query separates the two: compare the newest server-side timestamp for a stale vehicle against what its marker is showing.
Bucket the fleet by position age, then look for the shared attribute
- For every vehicle, take the newest device timestamp and the newest server receipt timestamp. Two columns, not one — the difference between them is itself a finding.
- Bucket into under 5 minutes, 5 to 30 minutes, 30 minutes to 4 hours, 4 to 24 hours, and older. Count vehicles per bucket.
- Join the stale buckets against the vehicle master: device model, firmware build, install date, SIM or subscription batch, home depot, and whether the vehicle is on shift.
- Look for a single attribute that most of the stale set shares and most of the healthy set does not. One model, one install week, one SIM range, one depot.
- If no attribute stands out, stop looking at devices and go to the ingest side: count records received and records rejected per vehicle for the same window.
The correlations map almost one-to-one onto causes. All one device model points at firmware. All fitted in the same fortnight points at the install, usually a wiring or antenna practice that one engineer used. All in one depot points at something local — a workshop that isolates batteries over the weekend is the classic. A contiguous SIM range points at the subscription, not the hardware. And a spread across all attributes points at your own pipeline.
Five causes, and the evidence that separates them
| Cause | Correlates with | Confirming evidence | Time to fix |
|---|---|---|---|
| Data subscription suspended or roaming refused | A SIM batch, or vehicles that crossed a border | Carrier portal shows no session; device is powered and its local log has queued records | Same day, once someone with the account logs in |
| Unit unpowered after a battery disconnect | One depot or one workshop week | Last record is clean, then nothing; often coincides with a service job | Next time the vehicle is in the yard |
| Firmware wedged after an update | One model and one build number | Device answers on the network but sends nothing, or sends malformed records | Days — needs the vendor and a rollback path |
| Records arriving and failing validation | Nothing on the device side | Reject counters rise while receive counters stay normal | Hours, once rejects are actually counted |
| Backfill landing out of order | Vehicles that were in a dead zone | Newest device time is old while newest receipt time is minutes ago | Hours — it is a selection rule, not a device |
The last two rows are the ones that survive longest, because both look exactly like silence from the outside. A vehicle whose records are being rejected is indistinguishable, on the map, from a vehicle with a dead unit. Fleet engineering goes to the depot, finds a working device, and the loop repeats.
Arriving, and being thrown away
Ingest validation is supposed to protect the state store from junk: coordinates at zero, timestamps in the future, a device identifier that matches no vehicle, an accuracy value outside the plausible range. All reasonable. The failure is doing it silently. A pipeline that drops a malformed record without a counter, a sample and an alert has converted a loud problem into a quiet one, and the quiet version costs a service visit.
- Count rejects per vehicle per hour, not just in aggregate. A fleet-wide reject rate of 0.2 percent hides one vehicle at 100 percent.
- Keep a sample of the rejected payload. 'Invalid record' with no example is not actionable at 2am or at any other time.
- Alert on the shape, not the volume. Any single vehicle whose records are entirely rejected for more than an hour is a page-worthy event, regardless of fleet size.
- Check the identifier join first. A device swapped between vehicles without the master record being updated produces perfect data attached to a vehicle that no longer exists — the class of problem the vehicle master record you need before a single position arrives is written to prevent.
- Watch the field the validator is strictest about. Rejecting on a missing optional field is a common own goal after a provider changes a payload.
Partners do this to each other too, and the pattern is identical: a record is transmitted, silently refused, and both sides believe the other is at fault. The same reasoning applies to the partner that keeps returning a rejected acknowledgement.
Backfill: the burst that arrives out of order
Most units buffer when they lose connectivity and flush when they get it back. That is the behaviour you want, and it breaks the map if last-known position is maintained by arrival order. A vehicle emerging from four hours in a dead zone dumps its queue; the pipeline writes each record as it arrives; and for the duration of the flush the marker walks the route again, hours behind reality, before jumping to the present. Meanwhile a dispatcher has assigned work against a position from lunchtime.
The staleness policy: when the map must say unknown
The durable fix is not finding these eleven vehicles. It is making the system incapable of presenting an old position as a current one. That needs a written policy with a threshold per vehicle class, because a threshold that is right for a delivery van in a city is absurd for a trailer tracker running on its own battery. Derive each threshold from the cadence you expect that class to report at in that state — which is why the policy has to be written alongside ping cadence set by what the vehicle is doing rather than after it.
| Class and state | Expected cadence | Show as ageing | Show as unknown |
|---|---|---|---|
| Urban delivery van, on shift | 60 s | 5 min | 15 min |
| Long-haul tractor, in motion | 2 min | 10 min | 30 min |
| Yard shunter, working | 30 s | 3 min | 10 min |
| Any vehicle, ignition off in a known depot | 15 min | 1 h | 4 h |
| Trailer or asset tracker on internal battery | 4 h scheduled | 18 h | 36 h |
| Subcontractor phone during a booked slot | 60 s | 5 min | 10 min |
Two rules make the table work rather than decorate a wiki. Every position rendered anywhere — map, list, API response, customer-facing tracking page — carries its age next to it, and the marker changes appearance at the ageing threshold and again at unknown. And unknown means unknown: the marker leaves the map or greys out entirely rather than sitting at the last coordinate looking authoritative.
A last-known position with no age attached is not visibility. It is a confident answer to a question the system stopped being able to answer, and dispatchers will act on it exactly as if it were current.
What to fix, in what order
- Ship the staleness rendering first. It is the smallest change and it converts a silent wrong answer into a visible gap, which stops the operational harm while the rest is investigated.
- Add per-vehicle receive and reject counters with retained samples, so the next partial outage is diagnosable from a dashboard rather than from a depot visit.
- Fix the last-known selection rule to use device time, and mark buffered records, so backfill stops rewriting the present.
- Only then chase the hardware. Devices are the slowest and most expensive thing on this list to touch, and by this point you know exactly which ones to touch.
Where a fleet runs more than one tracking vendor, staleness has to be evaluated per source before it is merged, or a healthy feed will mask a dead one behind a single canonical record — the adapter contract in one vehicle state from two telematics feeds is where that belongs. If none of this exists yet and the map is the only surface anyone has, a small, honest version of it is a sensible first build; that shape of work is what we describe under MVP and product builds. The neighbouring problems — drift, arrivals, cadence — sit together in telematics and the live vehicle data plane, part of our logistics and mobility work.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
Why are some vehicles not updating while the rest of the fleet is fine?
Because whatever failed is specific to those units rather than to the platform. The usual candidates are a suspended or roaming-blocked data subscription, a unit left unpowered after workshop work, a firmware build that wedged after an update, and records that arrive but fail ingest validation. Bucket the fleet by position age and look for the attribute the stale set shares — model, install week, SIM batch or depot.
How long should a fleet map keep showing a last known position?
Only for as long as that position could still plausibly be true, which depends on the vehicle class and what it is doing. A van on shift reporting every minute is untrustworthy after about fifteen; an asset tracker on a four-hour battery schedule is not late until well past a day. Set the threshold per class, render the age beside every position, and switch the marker to unknown rather than leaving it at the old coordinate.
Why did a vehicle jump backwards along its route on the live map?
It flushed a buffer. Units store positions while out of coverage and send them in a burst on reconnect, and if the system writes last-known by arrival order, those old records overwrite the newer one. Select last-known by the greatest device timestamp instead, and mark records whose arrival lagged their capture so the interface can tell live from replayed.
How do I tell a dead tracker from a rejected data feed?
Count records received and records rejected per vehicle, not just for the fleet. A dead unit shows zero of both; a rejected feed shows normal receives and rising rejects. Without per-vehicle counters the two are indistinguishable from the map, which is how teams end up sending an engineer to a depot to inspect a device that was working the whole time.
- telematics
- data quality
- fleet visibility
- monitoring
The work behind this page
Builds from our portfolio that this page draws on.
Axlebound
Real-time fleet tracking and dispatching platform with full visibility over every vehicle, driver, and route.
LogisticsShipSight
A supply-chain control tower that tracks every shipment across ocean, air and ground, predicts each ETA with a confidence score, and flags at-risk shipments before they slip.
LogisticsRead next
- The map is open, the vehicles have stopped moving, and the data is fineOne query decides it. If the newest position row for a frozen vehicle is seconds old and the marker says 14 minutes, the fault is in front of the database and nothing in the ingest path will fix it.diagnostic
- The vehicle has been parked since Friday and it has driven nine kilometresPhantom mileage is not a bug in the map. It is stationary noise being added up by a distance calculation that cannot subtract, and the fix is a filter stack — accuracy, state and displacement together, in that order.diagnostic
- Arrival fired twice at the gate, and forty minutes late at the next stopDuplicate arrivals and late arrivals look like one flaky feature and are 3 unrelated faults. Replaying the raw pings for one bad arrival against the polygon tells you which one you have in about ten minutes.diagnostic
- Breadcrumb trail: the line driven, not the line plannedThe trail is what the vehicle reported. The route line is what someone intended. Quoting one when you mean the other is how a mileage or detention dispute gets lost.definition
- Geofence: a zone, 3 triggers, and the hysteresis that stops it lyingA zone on a map is not a geofence. It becomes one when a trigger rule and a hysteresis policy are attached, and without the second it fires whenever a parked vehicle's fix wanders.definition
- Ignition on and off: 1 true signal and its 4 false versionsEvery telematics feed carries an ignition flag. Whether it means the engine is running depends on how it was obtained, and the field itself almost never says.definition
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation