Function · Inventory Built
Inventory isn't a table someone edits — it's a projection. Every movement is an immutable event on an append-only transaction log, and openWCS replays that log into real-time stock, location-scoped availability and reservations you can trust, audit and rebuild from scratch.
How it works
The transaction log is the system of record — events are appended, never updated or deleted. The inventory service consumes that stream and projects durable read models: current stock, availability and reservations.
Goods received, stock adjusted, picks and moves are events on an append-only log — UPDATE and DELETE are blocked at the database. State is derived, so history can never be quietly rewritten.
Inventory projects the event stream into a durable stock read model. Because the log is the source, the projection can be torn down and replayed — auditable and rebuildable, not a fragile counter.
The projection tracks processed events and a cursor offset, so re-delivered events are ignored and a restart resumes exactly where it left off — no double-counting, no drift.
Availability-to-promise is queryable SKU-wide and scoped to a specific location, so allocation can ask "is there reachable stock here?" — not just "does the SKU exist somewhere?".
Reservations are created, released and consumed against ATP under a pessimistic lock, so two concurrent allocations can't both commit the last unit — the floor and the order book stay consistent.
Stock, batches, serial units and reservations live in a schema you own and can query directly. Operational state isn't trapped inside a vendor's system — it's your data, on your infrastructure.
At a glance
GoodsReceived · StockAdjusted · Pick · Move ─► append-only transaction log
│ (UPDATE / DELETE blocked)
▼ outbox → stream
inventory projection ── idempotent · cursor offset
│
stock · availability/ATP (SKU + location) · reservations
│ reserve under pessimistic lock
▼
allocation commits the right unit
Open & auditable
The log, the projection and the schema are open source and self-hosted. See how allocation commits against this availability, and how the Host API feeds adjustments in.