Back to Journal
logisticsen

Pick-and-pack with a mobile scanner

From 62 to 89 picked lines per hour. NFC login, scan debouncing, weight verification - and the bug that nearly killed us last spring.

With a paper pick-list a picker handled 62 lines per hour on average. With the PWA on a Honeywell EDA51 scanner it is 89 lines per hour, same person, same warehouse. The gain is not really about speed, it is about never picking the wrong shelf. Here is how we built it.

Device selection

We tested three devices with our partners: Honeywell EDA51 (Android 11, 2D imager, 1,000 nit display, 13h battery), Zebra TC22 (Android 13, 1,500 nit, hot-swappable battery), and a cheaper generic Datalogic Memor 10 (Android 10). The Honeywell EDA51 became our default recommendation because the 2D imager scans at 50cm range and avoids camera-based blur issues on lower shelves. The Zebra TC22's hot-swappable battery is mandatory in 24/7 shift warehouses.

The PWA decision was not obvious. We threw away an early native Android app because partner device fleets are mixed (EDA51 + TC22 + a couple of BYO tablets) and OTA updates per fleet are painful. The PWA installs via Chrome dispatcher and runs offline-first with a service worker (local IndexedDB cache, sync-back when Wi-Fi returns).

NFC tag login

Pickers do not type a password at 06:00 before a six-hour shift. Each picker carries an NFC tag (warehouse lanyard or POS-style card) and taps the device. The WebNFC API reads a UUID, validated by the backend picker_sessions table. If the UUID is valid and tied to the warehouse, the session lasts 8 hours. Lost or stolen devices are revoked with a single picker_sessions row update.

The pick flow

The pick-list is generated by the backend allocator (with multi-warehouse logic in play). A picker is assigned a wave that may contain 6-12 orders. The PWA shows the first shelf location (A12-04-03), the picker walks there, the shelf LCD pick-to-light optionally lights up (Wi-Fi-driven), the picker scans the shelf to confirm the right location. Then they scan the SKU barcode, which checks off the line on the pick-list. If the scan does not match (wrong SKU, expired, damaged) the picker presses flag, and the line drops into the supervisor wave.

The bug that nearly killed us in spring 2026

The Honeywell EDA51 on Android 11 patch level X (March 2026 monthly update) started double-firing the barcode scan event. The keypress event fired once, but the subsequent keydown + keyup pair triggered a second keypress, so every scan registered twice. It took six days to recognise the pattern because even the flag button registered twice. The fix: event.timeStamp debouncing (two scans within 50ms = one), plus a regression spec that simulates double-fire via Chromium DevTools Input.dispatchKeyEvent. That test is now in CI.

Wave picking vs. single-order picking

We support both. Single-order picking is faster for small warehouses (<3 pickers) because there is no sorting overhead at the pack table. Wave picking is more efficient for larger ones (4+ pickers, 300+ orders/day) because one picker walk covers multiple orders and sorting happens at the pack table. The switch is a tenant-config setting, and the partner can flip it on any day (just wait for the active wave to finish).

Weight verification at pack

The packing part is unglamorous: the picker brings the tote to the pack table, the packer scans the order, the Bluetooth scale on the table sends the weight, and the backend compares it to the sum of expected SKU weights (±2% tolerance). If it mismatches, the packer documents the issue with a photo and the order drops into the problem wave. Weight verification cut the "wrong quantity in box" complaint rate from 0.4% to 0.07% since February 2026 at the pilot tenant.