Picking and checking orders on the warehouse floor without losing track
A phone app for pickers and collectors to scan products, split orders into parts and resume work where it stopped.
App built from scratch in 2024. In 2026 the flow was rewritten for orders split into parts, with the rules moved out of the screens and covered by tests.
- React Native
- Expo
- TypeScript
- Jest
The problem
Pickers and collectors scan products with their phones in the middle of the warehouse, and the app has to know exactly where each order stopped.
Stopped halfway
Work stops all the time, and whoever resumes doesn't know where it stopped.
Too big for one go
Big orders become parts, and the parts don't always move in order.
A hidden mismatch
A wrong scan only showed up at the customer.
How it works
Rules in pure functions
Continue, restart, open the next part and detect a finished part live outside the screens.
About 50 tests
Duplicate keys, parts out of order, mismatched collection, repeated sector and final confirmation.
Every scan has a result
Accepted, repeated or mismatched, and a mismatch stays visible until the order is done.
Mandatory updates
Everyone always works with the same rules.
Outcome
Picking became resumable and auditable, and a scanning mistake shows up on the spot, not at the customer.
Technical details
Decisions
Camera and scanner, one set of rules
Only the way of reading changes. The rules moved out of the screens into pure modules, so the two versions of the screen cannot drift apart on the rules.
Restarting does not delete right away
The old process is only replaced when the new one is finished. Someone who gives up halfway through a restart loses nothing.
A mismatched item does not count
The quantity the collector has to check ignores what came out mismatched in picking. Otherwise the count would never close.
Only the last 50 scans on screen
The full batch lives outside the screen state, so the app stays light on basic phones.
A real problem
Old versions in the field
When orders started being split into parts, anyone still on an old version of the app kept scanning with the old rules. Updating stopped being optional: on entry, the app compares its own version with the published one and only lets people work after updating, with the button going straight to the new installer.
Limits and next steps
- The part in progress only lives in the phone’s memory until it is finished: closing the app loses it. Next step: keep the part on the device.
- Restarting deletes and saves in two calls, not in one transaction. Next step: a single route that replaces the part at once.
- The camera and scanner screens are still duplicated, even with shared rules. Next step: one screen with a swappable way of reading.