The Challenge
A Regional FMCG Distributor operates a 200-person field sales force across six Malaysian states, distributing FMCG products to over 4,000 retail outlets. When we first spoke to their operations director, she described the daily reality of running this team as "organised chaos held together by WhatsApp groups and prayer." Stock tracking happened on paper forms that field reps filled out at the end of each day. Receipts were handwritten. Daily sales figures were phoned in to a central coordinator who typed them into Excel.
The reconciliation process was the most painful symptom. Every week, the finance team spent three full working days cross-referencing paper forms against phone-in reports against physical inventory counts. Discrepancies — common, because manual data entry errors are inevitable — triggered investigation cycles that could stretch to a fortnight. By the time management had a clear picture of what had actually been sold and where, the data was two weeks old and the opportunity to act on it had passed.
Connectivity compounded everything. A significant portion of The client's rural routes pass through areas with poor or absent mobile data coverage. Any app that relied on a constant internet connection would fail for hours at a time. Previous attempts to digitise field operations — the company had tried two off-the-shelf tools in the prior three years — had collapsed at this hurdle. The field reps didn't trust technology that lost their data when signal dropped. Whatever we built had to work offline, completely and reliably, before a single rep would adopt it.
Our Approach
Offline-first architecture was not a feature request for this project — it was a hard architectural constraint that shaped every technical decision. We chose Flutter for the mobile app specifically because its local SQLite database allows full application functionality with zero network dependency. Every action a field rep takes — logging a customer visit, adjusting stock quantities, processing a sale, recording a return — is written to local storage first. The network sync is a background process, not a requirement for the core workflow.
We spent week two of discovery riding along on actual field routes with three The client reps. This was not optional. Understanding the physical reality of the job — the sequence of stops, the types of data entered at each point, the time pressure of a 40-outlet daily route — directly shaped the UX decisions. The app needed to complete the most common actions (visit log, stock count, sale confirmation) in under 60 seconds per stop. Anything slower would be ignored in the field. We ran paper prototype tests with reps before writing a single line of code.
The backend architecture prioritised conflict resolution — the genuinely hard problem in any offline-first system. When two reps update stock levels for the same product at the same warehouse within the same offline window, the sync logic needs to resolve the conflict correctly without losing data. We implemented an event-sourcing pattern on the NestJS backend: every field action is an immutable event with a timestamp, device ID, and sequence number. Conflicts are resolved deterministically, not by last-write-wins, ensuring the reconciled state always reflects what actually happened on the ground.
The Solution
The delivered system replaced paper entirely across all 200 field reps in a 6-week phased rollout. The Flutter app guides reps through their daily route — customer visit log, stock count at point of delivery, sale confirmation with digital receipt, and end-of-day reconciliation — in a workflow designed around the sequence they already follow. The app functions completely offline for 8+ hours; we have never recorded a work stoppage due to connectivity since go-live.
The React admin console gave The client's management team capabilities they had never had before. Real-time GPS tracking shows the live position and status of every field rep on a map. Route efficiency scoring highlights reps who are spending disproportionate time at low-value stops. Automated daily stock reconciliation replaces the three-day weekly finance exercise — the numbers are ready by 6pm every day, reconciled automatically, with exceptions surfaced for human review. The CEO told us in our first post-launch review that this visibility felt like "turning on the lights."
Integration with The client's existing ERP system was delivered via a REST sync layer that pushes confirmed sales orders and stock movements in near real-time. The ERP receives clean, validated data rather than re-keyed Excel rows, eliminating the category of errors that had been causing the longest reconciliation delays. The client's IT team owns the integration and can modify the field mappings without our involvement — a deliberate design choice that avoided vendor lock-in.
Results & Impact
FieldTrack
This project was built on our pre-built FieldTrackplatform — customised for this client's exact needs.
Explore FieldTrack Try Live DemoWant something similar?
Get an estimate for a project like this in 3 minutes.
Free AI EstimateTalk to us