Skip to content
← All case studies

Real-Time Asset Tracking Pipeline

Python and QR-code ingestion replacing a manual spreadsheet with live location and status data for physical equipment.

Python QR Codes SQL Server Pandas 5 min read

Problem

Physical equipment and assets were tracked in a shared spreadsheet, updated by hand whenever something moved between sites or changed status. The spreadsheet was frequently out of date the moment someone checked it — updates depended on someone remembering to make them — and there was no reliable way to answer "where is this item right now" without phoning around.

Constraints

Site staff were not going to adopt a workflow that required a laptop, a login, and manual data entry every time something moved — it needed to be fast enough to do with a phone in the middle of other work. Any solution had to work with equipment that was already labelled or cheap to label, and had to tolerate patchy site connectivity.

Approach

I gave every tracked asset a QR code and built a lightweight scanning flow: scan the code, select a status or location from a short list, submit. Each scan is an ingestion event — a timestamped record of what was scanned, by whom, where, and to what status — rather than an edit to a single "current state" row, so the full movement history of an asset is preserved automatically instead of being overwritten.

Outcome

Asset location and status became something anyone could check directly, instead of something that depended on the spreadsheet being current. The event-based design meant the full movement history of any asset was available for free — useful for spotting equipment that hadn't moved in a long time, or reconstructing where something had been when a dispute came up.

What I'd do differently

I'd add offline queuing to the scanning flow from the start — on a site with a dead connectivity pocket, a scan should queue locally and sync once a signal is available, rather than requiring a live connection at the moment of scanning. I initially treated connectivity as a given, which wasn't true everywhere the system needed to work.

Architecture

Treating every scan as an immutable event rather than overwriting a “current state” field is the key decision here — it turns a simple scanning app into a small, genuinely useful audit trail almost for free.