← Back to work

Inventory management system

Built for a mid-size distributor's warehouse team, replacing manual stock tracking with a single source of truth across multiple branches.

One system, every branch, always in sync.

The problem

Stock was tracked across spreadsheets and paper logs, so counts depended on someone remembering to update them — across multiple branches, with no centralized view of what existed where. That gap led to numbers nobody fully trusted: mismatched counts, items marked in stock that weren't, and no reliable way to catch it until something ran out.

What was built

A multi-branch inventory platform with a custom QR scanning system at its core — every item carries a code tied to its internal identifier, and scanning updates stock in real time across the whole network, not just one location.

  • →Custom scanner built to run off a phone camera, using live QR recognition
  • →Batch tracking with expiry dates, quantities, and serial numbers
  • →Inter-branch transfers, with centralized visibility across every location
  • →A request-and-approval workflow: branch staff request items, managers approve, items are dispatched and received with the record updated automatically
  • →Two-path returns handling — restored to stock if intact, scrapped with a logged reason if not
  • →Role-based access (administrator, branch manager, branch staff), JWT authentication with two-factor login, and full audit trails on every action
  • →A reporting dashboard tracking stock movement, dispensed items, returns, and expiration alerts

Day to day

Staff issue an item to a customer and scan it out — stock updates instantly, network-wide. When something's returned, they scan it back in and choose whether it goes back to stock or gets scrapped, with the reason logged automatically. Need something a branch doesn't have on hand? Staff submit a request, a manager approves it, and the transfer is tracked from dispatch to receipt — no spreadsheets, no paper logs, nothing to reconcile by hand at the end of the day.

Stack

React
TypeScript
Express.js
PostgreSQL
Tailwind CSS