← Back to work

Case study

Stock Tracker

Custom inventory intelligence for a pharmaceutical distributor.

A bespoke, web-based stock-tracking platform for a pharmaceutical distribution company that sells across its own warehouse, a network of distributors (each with multiple regional distribution centers), and pharmacies. It turns a chaotic pile of incompatible supplier spreadsheets into a single, always-current view of stock — down to batch and expiry date.

Role
Design & development — solo
Type
Custom internal tooling
Industry
Pharmaceutical distribution
Localisation
Bulgarian, admin-focused

The problem

Stock scattered across channels, in a dozen different formats

A pharmaceutical distributor rarely has its stock in one place. The client's inventory was spread across an own warehouse, multiple distributors — each with several regional distribution centers (RDCs) — and pharmacies.

  • Every source spoke a different language

    Each distributor sent periodic stock files (Excel/CSV) in its own format — different columns, product codes, and product names. The own-warehouse export format also changed over time.

  • Re-interpreting files by hand, every time

    Each upload meant manually re-reading each file's layout from scratch — a recurring, error-prone grind.

  • The same product, coded differently everywhere

    "Product X" at one distributor was the same item coded completely differently at another, and reconciling that was mental gymnastics.

  • No reliable, unified picture

    There was never a dependable answer to the simplest question: "how much do we actually have, and where?"

The solution

One internal product as the single source of truth

I designed the tool around one principle: the company's internal product is the source of truth, and every supplier's format is mapped to it — once.

Configure once, automate forever

  • For each source you define the reading rules a single time — which columns mean product code, quantity, RDC, batch, expiry, date.
  • Every future upload from that source is processed automatically. No re-mapping.

One product, many identities

  • Each distributor's product code is matched to the internal product once and remembered permanently.
  • Identical items are counted as one everywhere, regardless of how each supplier names or codes them.

Built for real supplier files

  • Handles both row-per-line and "wide" layouts (a separate column per RDC), multi-sheet Excel workbooks, and custom header rows.
  • Users match file columns to the company's own named RDCs — not whatever the supplier called them.

Pharma-grade detail

  • Tracks batch/lot and expiry date per stock line — the same product can sit on several rows across batches.
  • Visual highlighting of expired and soon-to-expire stock.

A real-time stock dashboard

  • Aggregated availability per product, with an expandable breakdown by distributor / RDC / location.
  • Filters by brand, distributor and region; search; sortable columns; and "last updated" freshness indicators that flag stale suppliers.
  • Products that sold out are shown explicitly as 0, scoped by distributor and RDC — never silently dropped.

Correct semantics, with a safety net

  • Each upload replaces the previous stock for that source (availability, not a running total).
  • Keeps the last 5 uploads per source as an archive, stores the original files, and supports undo — delete a wrong upload or re-process an earlier file to step back.

Product & brand management

  • Bulk product import from Excel/CSV.
  • Dynamic, case-insensitive brand handling with a merge/rename tool, so differently-cased or duplicate spellings collapse into one brand and new brands appear automatically.

Source types that match the business

  • Own warehouse, distributor, and pharmacy source types.
  • Pharmacies can be excluded from totals for reports and calculations.

Technology

The stack

The stock calculations sit in a dedicated service layer, so the platform is architected to extend into sales-throughput and months-of-coverage analytics without touching existing data.

  • Next.js 14 (App Router)
  • TypeScript
  • Prisma ORM
  • PostgreSQL (Neon)
  • SheetJS / PapaParse
  • Vercel (password-protected)

Impact

From manual grind to one live picture

  • No more repetitive re-mapping

    Eliminates the manual re-interpretation of every supplier file on every upload.

  • One unified, always-current view

    Stock across the own warehouse, all distributors and their RDCs, and pharmacies — in a single place.

  • Batch & expiry oversight

    Essential for pharmaceutical compliance and for reducing waste from expired stock.

  • Recoverable by design

    A full archive and one-click undo mean mistakes are never permanent.

Have a project like this?

If you need a custom platform built with the same care, let's talk about it.