GPS data quality for fleet tracking: finding stale, duplicate, and impossible locations
A practical framework for detecting stale, duplicate, delayed, and physically impossible GPS data before it misleads fleet operators.
A location point can be technically valid and still be operationally wrong.
The latitude and longitude may parse correctly. The device ID may exist. The timestamp may fit the expected format. Yet the point could be 20 minutes old, duplicated from an earlier message, delivered out of order, or hundreds of kilometres away from where the vehicle could physically be.
That is why I prefer to talk about location confidence, not just GPS accuracy. Accuracy asks how close a coordinate is to the real position. Confidence asks whether we should use that coordinate to dispatch a vehicle, trigger an arrival, update an ETA, or answer a customer.
This article focuses on the validation layer between raw telemetry and the operational screen. For the wider system, start with tracking and telemetry system architecture and then read geofencing in mobility operations.
The four clocks hidden inside one location
Before validating a point, separate the timestamps involved:
- Fix time: when the GNSS receiver calculated the location.
- Device time: when the tracker created the message.
- Received time: when your platform accepted the message.
- Displayed time: when the operator’s screen last refreshed.
Teams often store only one timestamp and call it timestamp. That makes troubleshooting unnecessarily difficult.
Imagine a tracker loses coverage for 25 minutes, buffers its points, and uploads them when connectivity returns. The newest message received by the server may contain a location from the beginning of the outage. If the UI sorts by receive time, that old point can briefly replace a newer location and make the vehicle appear to move backwards.
We should preserve both event time and receive time. Event time tells us when the location happened. Receive time tells us how the data reached the platform. The difference between them is delivery delay, and that delay is useful operational evidence.
Stale data is more dangerous than imperfect data
A GPS point that is wrong by 15 metres is inconvenient. A point that is 15 minutes old but presented as current can cause the wrong vehicle assignment, a false arrival notification, or an ETA that nobody can defend.
The freshness threshold should reflect the workflow rather than one universal rule. For example:
- a vehicle on an active dispatch job might be fresh under 60 seconds, delayed between one and five minutes, and unknown after five minutes
- a parked fleet vehicle might remain operationally useful with a much older last-known location
- a battery-powered trailer tracker may report only a few times per day by design
This is why freshness belongs beside the location, not hidden in a detail panel. Operators should be able to distinguish fresh, delayed, and last known at a glance.
If the system already produces many low-value warnings, connect this work to alert fatigue in mobility operations. A stale-location incident should be grouped and stateful, not emitted again for every missed heartbeat.
Duplicate messages are normal
Duplicate telemetry does not automatically mean the device or network is broken. Retries, uncertain acknowledgements, gateway redelivery, and offline-buffer flushes can all create duplicates.
The ingestion layer should therefore be idempotent. In plain language, processing the same message twice should not create two arrivals, two trips, or two customer notifications.
A strong device protocol provides a device ID and monotonically increasing sequence number. When that is unavailable, we can build a practical deduplication key from fields such as:
- device identifier
- fix timestamp
- message type
- latitude and longitude
- ignition or motion state
Hashing an entire payload is less reliable when harmless fields change between retries. It is usually better to identify the fields that define the event.
Keep duplicate counts as an operational metric rather than silently discarding all evidence. A sudden increase may reveal firmware retry behaviour, acknowledgement failures, or an unstable integration.
Out-of-order points need event-time processing
Offline buffering means older points may arrive after newer ones. Mobile apps can do the same when an operating system suspends background activity and later releases queued updates.
The latest message received is therefore not necessarily the latest location.
For a last-known-location record, update the displayed position only when the incoming fix time is newer than the stored fix time. Preserve late points in history if they are useful, but do not let them move the live marker backwards.
Derived events need similar care. A late point inside a geofence should not trigger a new arrival if the vehicle has already completed the visit. Trip reconstruction can tolerate a processing window, but live dispatch usually cannot wait for perfect ordering. We need explicit rules for both cases.
Detecting physically impossible jumps
An impossible jump is a point that implies a speed or movement the asset could not realistically achieve.
A basic check calculates the distance and elapsed time from the last trusted point. Dividing distance by time gives implied speed. If a city shuttle appears to move 40 kilometres in 20 seconds, we should not update the live map with that point.
But a single fixed speed threshold is not enough. Consider:
- the asset type and its maximum plausible speed
- whether the previous point was already stale
- whether the device has just restarted
- GNSS accuracy or HDOP values, when available
- whether the point is near a known urban-canyon or indoor problem area
- whether several subsequent points support the new position
I would classify an implausible point as suspect rather than immediately delete it. If the next two or three points confirm the new area, the previous position may have been stale. If subsequent points return to the original path, the jump was probably noise.
This small confirmation window prevents one bad fix from moving the vehicle across the map while still allowing genuine recovery after a coverage gap.
Zero coordinates and default locations
Coordinates at 0,0, factory test locations, depot centroids, and cached installation points deserve explicit checks. They often look syntactically valid and can contaminate reports if nobody marks them as defaults.
Do not rely only on latitude !== 0. Maintain known invalid regions and known provisioning coordinates. If hundreds of devices suddenly report the same exact point, that is more likely a default or decoding problem than a fleet gathering.
Also validate ranges before storage:
- latitude must be between -90 and 90
- longitude must be between -180 and 180
- timestamps should not be implausibly far in the future
- device identifiers must resolve to an active device record
These checks are inexpensive and stop bad data from becoming a downstream analytics problem.
Accuracy, precision, and false confidence
Six decimal places do not mean a location is accurate to a fraction of a metre. They only mean the payload is precise in how it represents the number.
Where devices provide estimated accuracy, satellite count, fix type, or HDOP, retain those fields. They help distinguish a strong outdoor fix from a weak estimate near buildings or indoors.
The UI does not need to expose every GNSS diagnostic to dispatch. It does need to translate them into honest product behaviour. A confidence radius, muted marker, or clear quality label is more useful than showing a precise pin with no warning.
The same principle applies to cell-based positioning. A coarse cellular fallback can be valuable if it is clearly labelled. What matters is that the interface does not present a rough estimate as a precise current location.
A practical validation pipeline
I would apply checks in this order:
- Validate structure: required fields, coordinate ranges, device identity, and timestamp format.
- Deduplicate: reject already-processed events without repeating side effects.
- Measure delay: compare event time with receive time.
- Check ordering: prevent older fixes from replacing newer live state.
- Test plausibility: compare implied motion with asset-specific limits.
- Assign confidence: combine freshness, source, accuracy, and plausibility.
- Apply workflow rules: decide whether the point may update ETAs, geofences, alerts, and reports.
- Store evidence: retain raw data or rejection reasons long enough to investigate disputes.
The key is not merely accepting or rejecting a coordinate. Different workflows can use different confidence thresholds. A rough point may be good enough to show an approximate last-known area while being unsuitable for an arrival event or billing proof.
What to measure
Data-quality monitoring should make recurring problems visible. Useful measures include:
- percentage of active assets with fresh locations
- median and 95th-percentile delivery delay
- duplicate-message rate
- out-of-order-message rate
- suspect-jump rate by device model and firmware
- failed-fix rate by depot, route, or installation type
- time spent in unknown location state
Segmenting matters. A fleet-wide average can hide one hardware model, carrier profile, or depot that performs badly.
These measures also belong in the broader mobility operations KPI review. Location quality is not an engineering-only concern when dispatch and customer communication depend on it.
The standard I would use
Good GPS data is not data that always looks perfect. Real sensors, radio networks, and mobile operating systems do not behave that way.
Good data is data whose uncertainty is understood and represented honestly. We know when the point happened, whether it arrived late, whether we have seen it before, whether the movement is plausible, and which decisions it is safe to support.
If an operator can tell the difference between a trusted current position and a questionable last-known position, the validation layer is doing its job. That distinction is more valuable than a map full of precise-looking dots.