ProjectsWMS HeronLive
WMS Heron

WMS Heron

Heron is the system the warehouses actually run on. Stock arrives and is put away, orders are sorted, picked, packed and dispatched, shelves are replenished, stock moves between warehouses when demand shifts, and stock opname keeps the numbers honest. My work sits on the backend — leading the end-to-end build and keeping the pipeline fast enough that a busy afternoon does not turn into a late delivery.

What it does

  • Order fulfillment end to end: sorting, picking, packing and dispatching.
  • Replenishment and reallocation, including stock transfers between warehouses across Indonesia.
  • Inbound receiving and stock opname, so recorded stock matches what is on the shelf.
  • Around 100,000 orders on an ordinary day, and close to a million during double-date and payday sales.
  • Integrated with SAP and other internal ParagonCorp systems so warehouse data lines up with the rest of the company.
  • Serves 30+ warehouses and 10,000+ active users, with SLA compliance and uptime tuned at the API, query and event level.

How it fits together

  1. Step 1InboundGoods received, checked and put away
  2. Step 2ReplenishPicking faces topped up from bulk storage
  3. Step 3FulfillmentSorting, picking and packing per order
  4. Step 4DispatchHanded to delivery, SLA tracked
  5. Step 5ReconcileStock opname and reallocation between warehouses

Diagrams

How the product behaves, and how the pieces behind it talk to each other.

Business flow
Business flow diagram for WMS Heron
System flow
System flow diagram for WMS Heron

Stack

Services
Node.jsExpress.jsEvent-driven
Data
PostgreSQLRedis
Platform
AWS
Observability
Datadog
Integrations
SAPInternal ParagonCorp systems

Worth noting

  • Peak days are the real design target: a system sized for 100k orders has to survive a payday sale close to a million.
  • Event-driven flows keep warehouse steps decoupled, so one slow stage does not stall the rest.
  • Integrations are treated as unreliable by default — SAP and internal systems are talked to asynchronously, never in the request path.
Generating0%