The warehouse

Stock figures that prove themselves, line by line

“Why are there seven here and not nine?” always has an answer here, and it is not an opinion: the stock figure is the sum of the movements that produced it, rebuildable at any date. Receipts, picks, transfers and adjustments all stay on the record, one by one, and the story holds up in front of a customer and in front of an auditor.

Talk to us

7
Dimensions per line

Warehouse, location, item, lot, serial, owner, state: goods always belong to someone, sit somewhere, and are in a defined condition.

Zero
Stock figures retyped by hand

Every change goes through a movement that is proposed, approved and signed: stock only moves with a name and a reason code next to it.

FEFO
Shortest shelf life first

On dated goods the allocation picks the right lot on its own, from the availability figure all the way to the pick.

Offline
The handheld carries on

Coverage drops at the far end of the aisle and the work carries on: operations queue up and reconcile themselves, with no duplicates.

A warehouse stops when the inventory lies, when the operator does not know where to put the pallet down, when two orders take the same last unit. CargoNode is built around those three things, and the full physical cycle — receive, put away, pick, pack, ship, transfer, count — is on in every configuration: it is the product, not a package you add to it.

The ledger is the truth, stock is the consequence

Every change in stock is a movement, never an edit. The line carries its reason code (receipt, put-away, pick, ship, transfer, adjustment, quality release), the document that caused it, and two distinct times: when it happened on the floor and when the server wrote it down. Those two timestamps are what let the handheld work offline and hand back the real order of events when the network returns. The stock table is a projection, updated in the same transaction as the movement, and every fifteen minutes a reconciliation recomputes the ledger and compares it with the projection: if the two drift by a single unit, it says so — and it reports it rather than quietly straightening it out, because a silent realignment would erase the evidence of what happened.

  • The ledger is append-only: no line is updated, none is deleted
  • Typed reason codes: the nature of every movement is always on record
  • When it happened and when it was recorded are two different dates
  • Stock can be rebuilt from the ledger, always, in full
  • Ledger ↔ stock reconciliation every fifteen minutes, with the drift reported and not hidden
  • Stock at any date is rebuilt from the ledger; the year-end figure is frozen for the tax books
Movement ledger · cell A-12-3
  • +48PUT-AWAYfrom receiving to the shelf
  • −6PICKorder 2026-1187, towards packing
  • −2ADJUSTMENTcycle count, approved
sum of the lines
Stock in this cell

40 units

Warehouse
MAG-01
Location
A-12-3
Item
SKU-4471
Lot
L-2609
Serial
none
Owner
in-house
State
available
Three ledger lines, one stock figureThose seven dimensions identify the cell. The 40 is written nowhere: it is the sum of the movements that touch it, recomputable line by line at any time.
The reason codes the ledger knows
Reason codeDirectionCarries a costWhere it comes from
Receiptinboundyesfrom goods unloaded at the dock
Put-awayinternalnofrom the job that takes them to the shelf
Pickoutboundnofrom a pick confirmed on the handheld
Shipmentoutboundnofrom closing the shipment
Transferout and innofrom the trip between two warehouses
Returninboundnofrom an order coming back
Quality releaseinternalnofrom releasing goods out of quarantine
Adjustmentinternalyesfrom an approved count variance
The nature of a movement is not free text: it is a reason code from a catalogue, and it decides whether that movement touches stock value as well as quantities.

Locations that look like your warehouse

Warehouse, zone, aisle, rack, location: the hierarchy is the real one, with the names your people already use. Every location has a type — shelf, receiving, shipping, quality control, damaged, in transit, staging, packing — says whether it is pickable, and has a position along the pick path, so lists follow the physical round instead of sending the operator zigzagging. Constraints say what may sit there: maximum capacity, dedicated item, no lot mixing. The system locations (receiving, shipping, quality control, damaged, in transit) are created together with the warehouse and stay where they are: they are the fixed anchors the flows rest on.

  • Five levels: warehouse → zone → aisle → rack → location
  • A pick-path position on every location
  • Constraints for capacity, dedicated item and lot mixing
  • Grid creation: a whole racking bay at once, with consistent naming
  • Docks and bays modelled, so you know where goods come in and go out
  1. WarehouseMAG-01the physical site
  2. ZonePICKINGgroups the aisles
  3. AisleAorders the round
  4. RackA-12the bay
  5. LocationA-12-3pickable · position 128 on the round
Five levels, from the warehouse down to a single locationThat last line is the cell you see on the ledger, on the label and on the handheld. What the system needs is the location type and its position along the pick path: the name is yours to choose.

The handheld on the floor, even when the network is gone

The operator asks for the next job and runs it by scanning. The task is claimed atomically — two handhelds cannot take the same mission — and a job left half done (flat battery, an undeclared break) returns to the queue on its own shortly after, so the shift keeps flowing. In the dead zone the app carries on: it queues the operations and sends them when the network returns. Every operation carries its own identifier, so a double send stays one scan, recorded once.

  • Atomic task claim: never two operators on the same job
  • Abandoned work released automatically, with no shift leader in the loop
  • Offline queue that reconciles when coverage returns
  • Every operation is idempotent: a resend does not create a second movement
  • Double scan, item plus location, to confirm the put-away
  • Floor exceptions open a new job, not an error message
Handheld · your next job
  • PICKSKU-4471 · 6 unitsA-12-3 → PACK-2
  • SCANThe item first, then the locationdouble confirmation
  • OFFLINE2 operations queuedthey leave when the network returns

The job is claimed by one operator only, and every operation carries its own identifier: a resend does not create a second movement.

Receiving: from the dock to the shelf, with what the tax books need

You receive against a purchase order or blind — because the pallet turns up anyway. Where the quantity unloaded differs from what was ordered, the line stays flagged as over or short instead of being quietly squared off. Every parcel becomes a tracked unit, and at receiving you capture lot, expiry date and cost. A zero cost does not get through: it is rejected, except on the reason codes that genuinely allow it (sample, free of charge), because stock booked in at zero poisons the cost of goods sold for months. A figure out of scale against history does not block the dock instead: it warns and asks for confirmation. Quality control is a change of state — goods go into quarantine and only come out on a release — and put-away is guided, with a double scan to confirm.

  • Receiving against a purchase order or blind, with over-receipts and shortfalls flagged on the line
  • Lot, expiry date and cost captured line by line
  • Zero cost rejected; out-of-scale cost flagged but never blocking
  • Quality control as quarantine and release, never as a stock correction
  • Guided put-away with a suggested location and scan confirmation
  • A confirmed put-away is what makes goods pickable: picking only ever sees what is genuinely on a shelf
  • Real weight alongside the units, for variable-weight goods
  1. ReceiveRECEIVINGGoods arrive and are counted against the order, or blind.
  2. Put awayA-12-3Put-away takes them to the shelf, with a double scan.
  3. PickPACK-2The pick moves them from the shelf to the bench.
  4. PackPACK-2Parcels are built at the bench, item by item.
  5. ShipDISPATCHThe outbound movement produces the delivery note.

And goods come back in three ways

  • ReturnsA return is an inbound movement: it lands in receiving and goes back to the shelf from there.
  • TransfersBetween two warehouses goods sit in a transit location with a real balance.
  • AdjustmentsA count variance becomes a movement only once it has been approved.
The physical cycle, and the three ways goods come back inConfirmed put-away is what makes goods pickable: the pick only sees what is genuinely on the shelf, so it never promises a unit still sitting on the dock. Receiving and shipping on the same day works fine.

Fulfilling: from the order to the delivery note

When the order is confirmed the goods are reserved at warehouse level; when it is released to picking the reservation tightens onto a specific location, shortest shelf life first where the item calls for it. The availability you publish to your online store is computed from there, not copied from a figure: it is stock minus active reservations. When two orders compete for the last unit, the contest is settled before the promise reaches the customer, not after. Picking can be single or organised into waves by route; packing guides the item-to-carton scan; a shipment can be multi-parcel and produces a delivery note numbered without gaps, per warehouse and per year.

  • Soft reservation on confirmation, hard reservation on release to picking
  • Published availability = stock minus active reservations, always computed
  • The store publishes only what you can ship, even with several orders in the same instant
  • Single picking or waves, grouped by route
  • Guided packing, multi-parcel shipping, carrier waybill and tracking
  • Delivery notes numbered with no gaps, per warehouse and per year
Available to promise
  • ON HAND40 units on the shelfA-12-3 · available
  • RESERVED−12 units already committed3 confirmed orders
  • AVAILABLE28 unitsthis is what the store sees

Availability is not a number copied from somewhere: it is on-hand stock minus the active reservations, recomputed every time somebody asks for it.

Moving: goods on the road always have a balance

A transfer between warehouses goes through declared states — draft, ready, in preparation, shipped, arrived, completed — and can fall into “problem” and come back, because that is what happens in a warehouse. While in transit the goods sit in a transit location with a real balance: they have not vanished from the origin and have not yet appeared at the destination, so a shortfall on the road shows up straight away and gets closed with a line. Replenishment works on its own: a min/max rule per item and pick face, a periodic scan, and the replenishment jobs from bulk to pick face appear before the face runs dry.

  • Declared transfer states, with a way back out of the problem state
  • Transit location with a real balance: a shortfall on the road is visible
  • Preparation lines ordered by shelf position
  • Min/max replenishment, with jobs generated automatically
  • The outbound and inbound halves stay paired on both warehouses’ ledgers
  1. PreparedLines are picked at the origin warehouse, ordered by shelf position.
  2. In transitGoods leave the origin and sit in a transit location with a real balance: they have not vanished from one side and not yet appeared on the other.
  3. ReceivedAt destination they leave transit and land in receiving, with the put-away job already queued.

Counting and adjusting: every variance passes through two pairs of hands

A count session opens on a warehouse, on a zone or on a single location, and can be narrowed to an ABC class: the lines become jobs on the handheld. The handheld asks for the quantity and nothing else: the counting screen does not draw the expected figure, and the variance appears only once you have confirmed — whoever counts types what is in their hands, not what they have just read in front of them. The variance becomes an adjustment proposal that somebody else approves, and the approval is what writes the movement onto the ledger. The two permissions are separate on purpose — whoever counts proposes, whoever answers for the inventory approves — and whoever proposed has their own approval refused. At the close of the year the statutory inventory remains, valued at cost on the receipt layers, consistent with what the books expect.

  • A session on a warehouse, a zone or a single location, filtered by ABC class
  • The handheld asks the quantity without showing the expected: the variance appears after confirming
  • Adjustment proposed → approved → posted, with who and when
  • Proposing and approving are two different permissions, and one person cannot do both
  • Every session line keeps a record of who counted it and when
  • Statutory inventory valued on FIFO layers, reconciled with the books
Adjustment from a count
  • COUNTED7 units, the books said 9A-07-2 · variance −2
  • PROPOSEDWhoever counted proposes itwith a reason code
  • APPROVEDSomebody else approvesand only here is the movement born

Proposing and approving are two different permissions, and whoever proposed has their own approval refused.

And everything else, already switched on

Barcode labels for locations, items, cartons and shipments, printed from the warehouse and not from another program. Cartons and display units that, once opened, become sellable singles in one operation: the carton leaves and the pieces arrive in the same transaction, they inherit the lot, and the value comes across from that carton’s own cost layers rather than a hand-made average. Real weight alongside the units for variable-weight goods. FIFO layered valuation on actual receipt costs. Alerts on what cannot wait: drift, floor exceptions, approaching expiry dates. They all come with it: this is how a warehouse works, and how a warehouse works is not sold in pieces.

  • Barcode labels for location, item, carton and shipment
  • A packaging rule: how many single pieces come out of a carton or a display unit
  • The split runs in one transaction, with the lot inherited and the cost following the goods
  • Units and real weight on the same line, for variable weight
  • Cost of goods sold on FIFO layers, from actual receipt costs
  • Alerts on drift, floor exceptions and approaching expiry dates
Salesmodule
Accountingmodule
The warehouseAlways on, in every configuration. It is not on the price list because it is the product.
Analyticsmodule
Third-party logisticsmodule
The warehouse at the centre, the four modules around itThe four modules are switched on one at a time and off one at a time: with a module off, the rest keeps working.

Frequently asked questions

If we get a movement wrong, how do we fix it?

By adding another one. The wrong movement stays where it is — it happened, and deleting it would make the ledger untrustworthy forever — and the fix is an adjustment: proposed, approved and posted, with its reason code and the name of whoever approved it. In the end the stock figure is right and the history is readable.

Does the handheld work at the end of the aisle, where there is no signal?

Yes. The app queues operations locally and sends them when coverage returns, keeping apart the moment the fact happened and the moment it was recorded. Every operation carries its own identifier, so a resend does not create a second movement: the same scan counts once, even if it leaves twice.

Are lots, serials, pick waves and carriers charged extra?

They are already on, and they stay on. The warehouse is not a module: pick waves, min/max replenishment, splitting cartons into single pieces, carriers, valuation, lots and serials are part of the product, in every configuration. Lot traceability in particular is Italian compliance, and compliance is never sold separately. There are four modules and they cover something else: sales, accounting, analytics and third-party logistics.

Our locations have naming conventions of our own. Can we keep them?

Yes. Location names are free, and grid creation generates them to the scheme you decide. What the system needs is not the name but the location type and its position along the pick path: that is where the lists come from that follow the physical round instead of crossing it three times.

How can I trust the stock figures without stopping the warehouse to count?

Two things work together. Every fifteen minutes the reconciliation recomputes stock from the ledger and compares it with the projection, and any drift becomes a reported alert. And cycle counts, spread by zone, by location or by turnover class, bring the differences out one slice at a time while the warehouse keeps working: every counted line is compared with the expected figure snapshotted when the session opened, and the variance becomes an adjustment to approve. So the year-end full count lands on a warehouse already brought back into line slice by slice: a confirmation, not a discovery.

I only have one warehouse. Will I have to migrate when I open a second?

Opening it means raising a number on your own row, and the next day you are working across two. The warehouse is a column of the data model from day one, even for those who only have one — the selector simply stays hidden until it is needed: the data you already have is already in the shape two warehouses need. The same holds for the owner dimension, if one day you start working for third parties.

Let us look at your warehouse

Tell us how you receive, where you pick and what costs you most today. We will walk you through CargoNode on your real cases: the ones that eat your Monday morning.

Talk to us