Skip to content

Barcode Scanning

The ScanPick mobile app uses the device camera for barcode scanning. Workers point the camera at product barcodes and the app provides immediate visual feedback.

  1. The worker opens the mobile app and logs in with their PIN.
  2. Assigned waves appear. Tapping a wave shows the pick list.
  3. Tapping a pick task opens the camera viewfinder.
  4. The worker scans the barcode at the product’s bin location.
  5. The app validates the barcode and registers the pick (or shows an error).

When a barcode is scanned, the app checks it against the expected barcode for the current pick task:

ResultVisual FeedbackWhat Happens
MatchGreen flash + confirmationScan is queued and synced
MismatchRed Expected {product} overlayScan is rejected immediately

The validation happens on the device before any network request. Even offline, mismatched barcodes are caught in real-time.

If the camera cannot read a barcode (scratched, damaged, or poor lighting):

  1. Wait 3 seconds after the viewfinder opens.
  2. A “Type barcode” button appears.
  3. Tap it and type the barcode manually.

This ensures picking is never blocked by a damaged label.

Scans work without an internet connection:

  1. Online: scans are sent to the API immediately via HTTP.
  2. Offline: scans queue locally on the device using MMKV storage.
  3. Reconnecting: the queue drains automatically as connectivity returns.
  4. Idempotency: each scan carries a client-generated UUID. The server deduplicates, so replaying the queue is safe.

For full details, see the Offline Queue architecture guide.

ScanPick supports common 1D barcode formats:

  • EAN-13 (most common — 13 digits)
  • UPC-A (12 digits)
  • Code 128 (variable length)
  • Code 39 (variable length)
  • ITF (Interleaved 2 of 5)

The barcode is stored as a string on the Product record. Whatever the scanner outputs is compared directly — no format-specific parsing.

The mobile app shows the expected barcode inside the viewfinder:

┌─────────────────────┐
│ │
│ [Viewfinder] │
│ │
│ Expected: 59012... │
│ ┌───────────────┐ │
│ │ Scan here │ │
│ └───────────────┘ │
│ │
│ [Type barcode] │
└─────────────────────┘

This helps the worker confirm they are at the correct location before scanning.