Warehouse - inventory system of record (WMS)

One physical truth:
on-hand, reserved, available.

Warehouse is the system of record for physical stock. It owns what is really on the shelf and runs the receive, put-away, pick, pack and ship lifecycle - operable by your floor team and by AI agents through the same door.

WMS / StockSummarysku_123 . LOT-001
SPL-COFFEE-1KG
WH-01ZONE-AAISLE-4RACK-3BIN-07LOC-112

248

on-hand

60

reserved

188

available

available = on-hand − reserved

reserve against available

reserve 200 exceeds available 188→ the guard rejects it before any ledger row is written.

Tall storage racks lining the aisles of a distribution warehouse
A warehouse storage aisle. Photo is illustrative.

Everything on the floor

One system, every move on the floor.

From the receiving dock to the shipping door, one system owns the stock and the moves. These are the real capabilities - one short line each, no jargon.

Topology

Warehouse master

The floor as an enforced hierarchy: zone, aisle, rack, bin, location - each a barcoded node with a blocked flag for holds.

Stock

The stock ledger

One number each for on-hand, reserved and available, backed by an immutable transaction log you can replay.

Inbound

Receiving and put-away

Goods land against a purchase order, get counted in, and are placed into a real location - stock only moves when it truly arrives.

Outbound

Reserve, pick, pack, ship

Orders reserve against available stock, then move through picking and packing to shipping as one enforced state machine.

Corrections

Transfers, counts, adjustments

Move stock between locations, run cycle counts, adjust, write off defects, and record internal consumption - each an honest, named event.

Replenishment

Replenishment intake

When a target runs short, a replenishment request tops it back up - and cascades to procurement when the warehouse itself is short.

Console

Operator console

An eight-route workbench for the floor team - dashboard, receiving, packing, inventory, transfers, counts and defects, all in one place.

The lifecycle

One enforced flow, dock to door.

Every unit moves through one ordered sequence. Goods receive against a purchase order and put away into a real location, then a fulfillment request walks reserve, pick, pack and ship as a single state machine - never skipping a step.

01

Receive

Against a purchase order

02

Put away

Into a real location

03

Reserve

RESERVED

04

Pick

PICKED

05

Pack

PACKED

06

Ship

SHIPPED

One physical truth

A number you can prove, not just read.

The available count is not stored and trusted. It is derived - on-hand minus reserved - and every change behind it is a row you can replay. Nothing mutates a balance silently, so a drift is a bug you can see, not a mystery you argue about.
  • On-hand, reserved and available, one number each
  • Every movement is an immutable, named transaction
  • Fold the log and it reconciles to the summary, exactly
Stacked cartons and boxes on warehouse shelvingLedger
Boxes on warehouse shelving. Illustrative photo.

Receive to ship

The receive-to-ship lifecycle, one enforced flow.

Goods land against a purchase order, get put away into a real location, then reserve, pick, pack and ship as one state machine. Short lines backorder rather than oversell. Shipping decrements stock and emits an event for downstream systems - it does not print a label or book a carrier, and we say so plainly.
  • Receive and put away, so stock only counts once it truly arrives
  • Reserve against available, then pick, pack and ship in order
  • Short-stock lines go partially reserved or backordered, never negative
A container ship loaded with shipping containers at a portOutbound
A container ship at port. Illustrative photo.

Where it fits

Where Warehouse fits.

Warehouse is an API-first, agent-native inventory system of record for the Splenta family. The incumbents are broader and battle-tested, and they keep those strengths - WMS trades scale and shipping breadth for a reconcilable stock truth an AI agent can safely operate.

Splenta WMSManhattan / Blue Yonder / KorberNetSuite WMSFishbowlShipHero
What it isAPI-first, agent-native warehouse system of recordDeep enterprise WMS suitesERP-embedded WMS moduleSMB inventory and manufacturingE-commerce and 3PL fulfillment platform
Reconcilable stock ledgerImmutable transactions that fold back to the summaryEnterprise inventory with audit trailsInventory tied to the NetSuite ledgerInventory tracking, QuickBooks-adjacentReal-time inventory across channels
Operable by AI agents over MCPOne command gateway serves people and agents alikeAutomation and APIs, no MCP surfaceSuiteScript and REST APIsAPIs and integrationsAPIs and webhooks
Carrier and shipping labelsNone - shipping decrements stock and emits an event onlyMature carrier networksThrough integrations and partnersShipping integrationsProduction-mature labels and carrier integrations
Scale and breadthSingle-warehouse, narrow by designMulti-DC, labor, slotting, wave planningBroad, ERP-backedSMB-focusedHigh-volume e-commerce and 3PL
MaturityIn active build, pre-revenueBattle-tested at enterprise scaleEstablishedEstablished SMB toolProduction, many merchants

WMS is in active build and pre-revenue. Enterprise suites keep multi-DC scale, labor and wave planning; ShipHero in particular has production-mature shipping labels and carrier integrations that WMS simply does not have. WMS is narrow by design: one reconcilable physical truth, no shared-table coupling, operable by humans and agents through the same seam.

Under the hood

Owned by a ledger, operated through one seam.

The story above is the plain version. For evaluators, here is how it actually holds together - the frontend is React on Vite, the backend Spring Boot on Java 17 and PostgreSQL, and every peer talks to it by contract.

The negative-balance guard

Available is never stored and trusted. It is derived - on-hand minus reserved - and a reserve that would push it below zero is rejected before any row is written. Oversell is impossible at the WMS layer.

reserve :: guarded against availablederived
available = on-hand − reserved
// a RESERVE that would drive available below 0
if (qty > available) reject
// no ledger row is written
else append RESERVE
// available holds at or above zero, always

An append-only ledger

No balance is edited in place. Each change appends a transaction - type, quantity, resulting balance, source document, actor, timestamp. Fold the log for any item at any location and you get its summary, exactly.

StockTransaction :: item sku_123 @ LOC-112append-only
typeqtyafter / ref
INWARD+120248 . wms_in_123
RESERVE-60188 avail . wms_fr_123
MOVE_OUT-40208 . trf_88
MOVE_IN+4040 . trf_88
SHIP-60148 . wms_fr_123
// fold the log
sum(transactions) == the summary
// MOVE_OUT ↵ MOVE_IN is one transfer, dual-entry

One command seam, two front doors

There is a single write seam - a command gateway - and both the human console and an AI agent go through it. The MCP tools are that gateway over the official MCP Java SDK; the REST command endpoint is the same gateway with a different envelope. Same scope gate, validation, idempotency, audit and outbox. Reads stay on REST by design.

two front doors, one seamwrites only
// agent path
POST /mcp . tool wms.fulfillment.reserve
// human / service path
POST /api/wms/commands
// both land on the identical seam
WmsCommandGateway.accept(cmd)
→ scope gate
→ validation
→ router
idempotency . audit . outbox
// reads are REST only - no stock-read MCP tool by design
GET /api/wms/stock-summaries?itemRef=sku_123

wms:inbound:write

  • wms.inbound_receipt.record
  • wms.putaway.confirm

wms:fulfillment:write

  • wms.fulfillment.reserve
  • wms.fulfillment.pick
  • wms.fulfillment.pack
  • wms.fulfillment.ship

wms:stock:write

  • wms.stock.transfer
  • wms.stock.cycle_count
  • wms.stock.inventory_adjustment
  • wms.stock.defect_write_off
  • wms.stock.internal_consumption

wms:replenishment:write

  • wms.replenishment.request

Integration by contract

WMS never shares a database table with another module. Supply lands from SCM, demand pulls from RMS, Arin reads and replenishes, and every state change publishes through a transactional outbox. Auth is ICE's job: WMS is a pure resource server that validates the token and checks the scope, and never mints one.

supply and demand in

  • SCMgoods receipt

    purchase-order lines land as a goods receipt

  • RMSfulfillment

    paid orders arrive as a fulfillment request

  • ArinMCP + REST

    reads available stock, requests replenishment

WMSsystem of recordno shared tables

events out . outbox + SSE

  • wms.stock.received
  • wms.stock.changed
  • wms.fulfillment.picked
  • wms.fulfillment.packed
  • wms.fulfillment.shipped
  • wms.fulfillment.backordered

GET /api/wms/outbox-events/stream

Private - in active build

Give the whole stack one physical truth.

WMS is early - it runs end to end on a single warehouse, against a local database, with no customers yet. There is no public download and no self-serve sign-up. If a reconcilable stock truth that an agent can safely operate is the problem you have, tell us about your stack and we will walk you through the real ledger and the agent seam.