Guide / system design

Inventory management system HLD

The high-level design answers four questions before any table or endpoint exists: what components exist, what data flows between them, what stays consistent, and what is deliberately out of scope.

The key facts

  • The components: a transactional record core (movements, derived quantities), an order state machine, a purchasing signal, client apps over one API, and explicit seams to accounting and storefronts.
  • The data flows: receipts in, orders through fulfilment, purchase orders to suppliers, invoices to accounting — every flow reading or writing the one record.
  • The HLD decisions: single record vs synced copies, derive vs store quantities, deliberate approval vs automatic deduction — made here, paid for forever.
  • The companion: the LLD walkthrough descends to tables and endpoints once the HLD is settled.
Diagram — index of this pageThe ground this page covers
  1. 01The key facts
  2. 02The components, and why there are so few
  3. 03The data flows, drawn as invariants
  4. 04The decisions the HLD exists to make

The components, and why there are so few

The record core. One transactional database holding products, variants, locations, movements, orders, and purchase orders. Movements are append-only; quantities are derived. This is one component deliberately — the history of failed inventory systems is mostly a history of splitting this component into services that then disagree.

The order service. The state machine — received, validated, allocated, picked, packed, invoiced, paid, with cancellation legal until invoicing — enforced in one place, over the same database.

The purchasing signal. Reorder levels against derived stock raising draft purchase orders; goods receipts writing inbound movements; supplier invoices matched with variance flags.

The clients. Staff UI, customer portal, scanner flows — thin, all through one validated API.

The seams. Accounting (invoices out, payment status back) and storefront (order import in) as explicit, monitored integrations — never as a second path into the record.

Genuine BSimple screenThe BSimple operations dashboard: live order, invoice and stock values in one view.
The BSimple operations dashboard: live order, invoice and stock values in one view.

The data flows, drawn as invariants

At HLD level, the flows matter less as arrows than as the consistency they must preserve. Receipts: goods received against a purchase order write movements immediately — the on-order figure falls as on-hand rises, in one transaction. Fulfilment: allocation reserves without consuming; invoicing consumes and deducts — the shelf and the promise stay separately true. Purchasing: a backorder's demand counts toward reorder signals, so the short line becomes a purchase order rather than a hope. Accounting: the invoice leaves with tax codes intact and payment status returns mirrored — the accounting system never receives work in progress.

Each flow carries an invariant from the design requirements: state it as a testable sentence at HLD, and the LLD inherits a specification instead of a mood.

DiagramDiagram: spreadsheet data imported into live stock records.
Diagram: spreadsheet data imported into live stock records.

The decisions the HLD exists to make

One record or synced copies. Synced copies drift by design; the HLD should commit to one record and thin clients, and treat every proposal to the contrary as a cost, not a feature.

Derive or store. Quantities derived from movements, with aggregates as rebuildable projections — the decision that makes every later feature trustworthy.

Deliberate or automatic deduction. Stock leaves at invoice approval, a human step — intent and fact stay separate, and cancellations stay clean.

In scope and out. The HLD's most valuable section is the exclusions: no HR, no payroll, no MRP scheduling, no tax filing — the boundary line that keeps the design small enough to be true. BSimple's HLD, for comparison, is exactly that shape: operations record, state machine, purchasing signal, clients, seams — the trial runs it on your own products, and the inventory pillar documents the record at the centre.

DiagramOrderPick and packInvoiceXero
Diagram: Order → Pick and pack → Invoice → Xero — how this work moves through BSimple.

Frequently Asked Questions

What is HLD for an inventory management system?

The high-level design: components, data flows, consistency invariants and scope boundaries — decided before the low-level design descends to tables, endpoints and class diagrams. The HLD's job is to make the expensive decisions once, explicitly.

Should the inventory core be microservices?

Usually no, at the scale these systems serve. The stock record wants one transactional database; splitting it into services that must be kept consistent by events reintroduces the drift the system exists to prevent. Grow outward only when load genuinely demands it.

What flows connect an inventory system to accounting?

Invoices out (finished, tax-coded) and payment status back. Everything else — ledgers, filing, reconciliation of the books — stays in the accounting system; the inventory system hands over finished work.

Where does the customer portal sit in the HLD?

As a client over the same API — a thin, per-customer view of the record (their products, their pricing, their orders) with no private copy of anything. If the portal holds its own stock figures, the HLD has grown a second record and a future lie.

How do I know my HLD is any good?

Test the invariants against the flows: every arrow preserves them, every exception is a designed state, and the exclusions are explicit. Or hand it to a maintained system and compare — the trial is the fastest architecture review available.

BSimple

Get started with BSimple