SealCore
Delivery stories

ERP for a distribution business: from spreadsheets to live reporting

A custom management system where quote → order → delivery → invoice runs unbroken. These are the design decisions, and the part that nearly broke.

The SealCore team4 min read
Illustration for: ERP for a distribution business: from spreadsheets to live reporting

This is a management system built for a distribution business and now in daily use. A screenshot of its dashboard appears in the solutions section on the home page. This article covers the design decisions — the part that rarely appears in a brochure but decides whether a system is usable.

How things worked before

Everything ran on spreadsheets and messages. Quotes drafted in Word, orders confirmed in a chat group, stock in a paper ledger, receivables in one Excel file held by one person. Every link worked; the problem was they were not joined, so nobody could answer three questions quickly:

  • Did last week’s quote turn into an order, or is it sitting still?
  • Has this order been delivered in full, invoiced, and paid?
  • What did we actually earn this month after discounts and returns?

Decision 1: build the whole chain, not separate pieces

The original request was "build order management software". But the survey showed that with orders alone, stock would stay on paper, receivables would stay in Excel, and staff would still enter everything twice — leaving the root cause untouched.

So the scope widened into one unbroken chain: quote → order confirmation → stock issue → delivery → invoice → receivables. Each step produces the data for the next, with no re-entry. In exchange, the chain was cut into two-week milestones so the business had something usable early rather than waiting until the end.

Decision 2: states are the backbone

The core of the system is not the screens but the state model of each document. An order moves through defined states, and every transition has a condition:

TransitionConditionAutomatic consequence
Quote → OrderCustomer confirms, credit limit availableReserves the stock
Order → Stock issuePhysical stock available; approval if over limitDeducts stock, creates a delivery note
Stock issue → DeliveredReceipt confirmed by the recipientAllows invoicing
Delivered → InvoiceQuantity actually delivered, less returnsPosts the receivable

The right-hand column is where the system pays for itself: nobody has to remember "after issuing stock, remember to record the receivable". It simply happens, and so it does not get forgotten on a busy day.

The part that nearly broke: short deliveries

The first design assumed goods delivered equalled goods issued. In reality they do not: a customer receives a few cases short because of damage, or accepts everything and returns some at the door.

If the system only allows "delivered" or "not delivered", staff pick "delivered" and correct it by hand somewhere else — and the whole automated chain behind it goes wrong. This part was rebuilt: the quantity actually delivered is recorded at the point of delivery, and the difference automatically raises a stock return and adjusts the invoice value.

The dashboard: the first four tiles

The overview screen is deliberately sparse. Four figures on the top row — revenue this month, orders in progress, items at their stock alert threshold, and unpaid receivables — alongside a "waiting for approval" block listing the quotes and invoices needing someone with authority to look.

That approval block is the most used part of the day, though it is not the most impressive-looking. It is a clean example of the principle in Management dashboards: what belongs at the top is what leads to an action, not what looks best.

Data migration and running in parallel

The old product catalogue had many duplicate rows, added by different people over the years. Merging codes and settling units of measure took most of the migration phase — more than loading the figures did.

Opening balances came from a physical stock count rather than the old file; receivables were reconciled with each customer before loading. Both systems ran in parallel for several weeks with a weekly reconciliation, and Excel was only retired once the numbers matched consistently.

What we took away

  1. 1Too narrow a scope leaves the root cause in place; a wide scope has to be cut into short milestones to stay under control.
  2. 2State design matters more than interface design. An interface can be changed in a day; a wrong state model takes weeks.
  3. 3Exceptions have to be designed in from the start, not left for later — because if users cannot record the truth in the system, they will record something else.

Want to talk specifics?

SealCore surveys at your premises and sends a fixed quote after the first session — including when the conclusion is that you do not need custom software.

All articles