Skip to main content
Version: v1.0.0

Sales Orders

A sales order (SO) is a commitment to ship products to a customer. It is the demand side of finished-goods inventory: it reserves stock, then draws it down as the order ships. Unlike the buy-side orders it has no receipts, so status changes alone move the inventory, and it is single-sided: it only draws finished goods down, it never produces or consumes materials.

What it does​

  • Track the order. At its core a sales order is a record of a customer commitment: which customer, what they want, when it must arrive, and how far along it is. That record stands on its own, with editable dates and a timeline of status changes.
  • Draw down finished-goods inventory. As the order advances it records what the customer wants (demand), what has been set aside for them (allocated), and what has actually gone out the door (consumed), all on the finished-goods ledger.

How it works​

Sales order state machine

A sales order is always in exactly one status, and because there are no receipts, every status change is by hand. One chain carries the order from arrival to close, with a flag and an early exit beside it. The sections below cover the chain, then what it does to inventory and to the dates.

The statuses​

StatusTypeWhat it means
PlanningManualThe order has come in from the customer. Their wanted quantity is booked as demand.
PlacedManualAcknowledged and committed, and the stock is allocated to them.
In TransitManualGoods have shipped and are on their way, and the stock is consumed.
InvoicedManualThe order has been invoiced.
PaidManualThe invoice has been paid.
CompletedEndpointClosed.
In-DisputeBranch (off Invoiced)Raised from Invoiced when there is a problem with the invoice; no inventory effect. Clear it to return to Invoiced.
RejectedExitRejected before it ships (only from Planning or Placed), which reverses its inventory effects. Can be reactivated, returning to wherever it last was.

The whole chain is set by hand and freely reversible to fix a mistake; there are no receipts, so the status is the only thing that moves inventory.

Moving between them​

  • By hand, both ways. The whole chain is yours to move along, forward or back. Since there are no receipts, the status is the only way to correct a step: stepping back from In Transit un-ships and removes the consumption, stepping back from Placed removes the allocation, and so on.
  • Disputing. From Invoiced, mark the order In-Dispute, and clear it back to Invoiced once resolved. It does not touch inventory.
  • Rejecting. Reject an order before it ships to stop it and reverse its inventory effects; reactivate it to bring it back to where it was. Once goods are in transit an order is no longer rejected, since the stock has already gone out.

Effect on inventory​

What you doLedger effect
The order comes in (Planning)books the wanted quantity as demand
Place itallocates the stock to the customer
Ship it (In Transit)consumes the stock out of inventory
Rejectreverses all of the above back to zero

Projecting forward inventory effects requires a fulfilment location to be set. Every entry carries the SO number as its reference.

One rule keeps the ledger tidy: anything you undo is erased, not stamped with a counter entry. Step the order back out of In Transit and the consumption is simply removed. The only lasting reversal is a rejection, and even that disappears if you reactivate the order. The ledger always reflects only what is true right now.

What a line cost, and what it earned​

A sales order creates no cost. It takes the cost of goods that already exist and sets it against the price the customer pays, which is where profit comes from, and this is the one place in the system where a price meets the cost of the same units. So every line of the Line Items table shows its unit cost, its gross profit in money and its gross margin over the price, next to what the customer was charged.

Which cost that is depends on whether the goods have left. While the order is in Planning or Placed the stock is still on the shelf, so the line is worth what the fulfillment location's stock is worth today. That is a live reading: it moves as stock moves, so it renders in the estimate style and settles on the day the order ships. From In Transit on it is what the cost model priced the line's consumption at, the exact value that left inventory. A shipped line is steady, because the cost model prices a consumption against what is dated before it, so only history entered with an earlier date can move it again.

A shipped line is marked only when it drew more units than the location actually held. Those units are priced at the product's average receipt cost over the organization's estimate window, the line says how many were short on hover, and the mark clears on the next read once the missing receipt is entered at that location. Gross profit and gross margin follow the unit cost, so they carry whatever mark it carries.

Available sits next to Quantity while the order has not shipped: inventory's own figure at the fulfillment location, on hand minus allocated, red when negative, with the Status tag beside it saying the same thing in one word. Both go once the order is In Transit, since whether the location can fill the line stops being a question the moment the stock leaves. They are gone on a rejected order too, since nothing will ever be drawn from it. Such an order never shipped, so its lines keep the quantity and the price the customer asked for and read a dash under unit cost, gross profit and gross margin, rather than a cost of zero.

A kit line rolls up: it has no stock and no cost of its own, so its unit cost is each component's cost times its quantity per kit, and its Available is how many kits the location could actually build, set by the limiting component.

The Financial Breakdown​

The card under the lines has two bars and a table. The bars answer the question only a bar can answer, the proportion: how much of the price is goods, how much the fees eat, and what is left. Both normalise to the larger of net revenue and total cost, which is why an order that sold below cost shows a short Price bar rather than an overflowing Costs bar, and hovering a segment names it and gives the figure.

The table under them gives the figures the bars cannot: the inventory cost, the five fees you typed on the header (fulfillment, freight, promo, other and broker fees), the total cost of the two together, then the net revenue, the net profit left after it and the net margin as a percentage. One column, not an estimate beside a final: a sales order sells goods that already exist and already have a cost, so there is nothing to compare against.

The inventory cost is the Line Items costs added up, so the card and the table above it are the same numbers at two levels and can never disagree. That means it reads live before the order ships and settles after, exactly as the lines do, and the total cost, net profit and net margin built on it carry whatever mark it carries. When a figure is marked, the bar's inventory segment is hatched rather than solid and a caption under the bars says why, because a bar cannot say est. and a solid block reads as a fact.

The names say which margin is which, and they are the same on sales receipts. On a line it is the gross margin, the price against the cost of those goods. On the card it is the net margin, after the fees on the header. The two will not tie out, and are not meant to.

A rejected order has no cost, so it has almost no card. The bars, the cost table and the fees you typed give way to one line saying the order was rejected and nothing shipped, and Net revenue stays under it as the value of what was asked. The fees are still there in the edit modal for anyone who needs them; what goes is showing them as what a costless order cost.

What the list shows​

The order's cost is nothing but its lines added up, so the sales orders list carries it too, next to what the order is worth: Net Revenue, then Cost, then Net Margin. They are the card's own figures, not a second reading of them, so the two pages cannot disagree.

Both Cost and Net Margin carry the mark of the cost behind them. While the order has not shipped they render in the estimate style, because the goods are still on the shelf and the figure moves with the stock; once it has shipped they stay marked only while part of what it drew rests on padding. An order nothing prices reads a dash under both rather than a zero.

Dates​

  • Order date is yours. It defaults to today when you create the order and you can change it whenever.
  • Must-arrive-by date is the customer's deadline, set by hand.
  • Status dates (planning, placed, in transit, and so on) stamp themselves as the order reaches each status, but stay editable afterwards so you can correct them.

Each ledger entry takes its date from the status that produced it: the demand booking from the planning date, the allocation from the placed date, and the consumption from the in-transit date. These are business dates, so editing one moves its entry with it: change the in-transit date and the consumption re-dates, change the placed date and the allocation follows. The record-of-entry timestamp never moves, so the stock history always reads in true business-date order, which is what positions and the cost model sort by.

See also​

Drive sales orders through the REST API or the MCP server.