Skip to content

Case study 01

Pharmacy ERP

A retail pharmacy running 100–150 transactions a day on batch-level inventory, with expiry control and prescription-gated dispensing.

Next.jsMongoDBNodeWhatsApp APInode-cron
At a glance
Sector
Healthcare retail
Year
2025
Service
ERP
Spine

Batch inventory · expiry control · GST billing

See this service
100–150
Daily transactions
Per batch
Inventory granularity
Caught in window
Expiry write-offs
Server-enforced
Compliance gate

The problem

Generic billing software treats a medicine as one product. The same SKU actually sits on the shelf in three batches at three expiry dates and sometimes three printed MRPs, so batch tracking lived in a paper notebook beside the till — which meant expiry losses were discovered during stock-taking, after the supplier return window had closed.

What we built

Inventory modelled at batch level from the ground up, with first-expiry-first-out selection at billing so old stock clears before it becomes a write-off. Expiry alerts fire in 90/60/30-day tiers grouped by supplier, so one return covers a dozen items. Schedule H dispensing is blocked server-side until the prescribing doctor and prescription reference are captured. Reorder points compute from real sales velocity against supplier lead time rather than a fixed minimum.

Under the hood

Collections
  • items
  • batches
  • invoices
  • invoice_lines
  • suppliers
  • purchase_orders
  • prescriptions
  • ledger
Endpoints
  • POST /bill
  • GET /stock/fefo
  • POST /grn
  • GET /reports/expiry
  • POST /prescription/verify
Scheduled jobs
  • expiry:tier-scan (daily 02:00)
  • reorder:suggest (daily 06:00)
  • refill:whatsapp (daily 10:00)