Audience
Warehouse, Owner, Admin
Inventory: stock buckets, locations, adjustments, counts, and the ledger
1. The short version
Stock is not one number. Every product has ten buckets, tracked separately for each warehouse. The Stock Levels screen shows the buckets read-only. Adjust Stock corrects one bucket on one product. A cycle count corrects on-hand stock after approval. The movement ledger records every change. Reconciliation replays the ledger against the buckets and reports differences.
The rule that ties it together: every stock change writes a movement. If a number looks wrong, the ledger shows how it got there.
2. The ten buckets
Each product has one set of ten buckets per warehouse, in pieces and in cases.
| Bucket | What it means | Sellable |
|---|---|---|
| ON_HAND | Pick Face (AFS). Stock on a pick face, ready to pick. | Yes |
| ON_STORAGE | Bulk Storage (AFS). Stock in bulk storage, ready to pick after replenishment. | Yes |
| RECEIVED_ON_DOCK | Received on Dock (ROD). Counted at the bay, not yet put away. | No, until putaway completes |
| ALLOCATED | Reserved for orders. | No, already promised |
| ON_ORDER | Ordered on issued purchase orders, not yet received. | No |
| ON_WAY | In transit on a container. | No |
| MULTI_WH | Multi-warehouse bucket. | No |
| DAMAGED | Damaged stock. | Never |
| QUARANTINE | Quarantined stock. | Never |
| PICKED | Picked, not yet shipped. | No |
How available is computed
On Stock Levels, Available is on-hand pieces minus allocated pieces. On Product 360, the Available to Sell (ATP) strip adds bulk available: pick-face available plus bulk available. ROD is excluded from ATP until putaway completes. Damaged and Quarantine are never sellable.
Example: Product-01 has 240 PCS on hand, 48 PCS allocated, and 120 PCS in bulk storage. Stock Levels shows Available 192 PCS. Product 360 shows ATP 312 PCS (192 pick-face available plus 120 bulk available).
3. Stock Levels
Inventory section, “Stock Levels”. Read-only operational view of on-hand, allocated, available, and on-order balances.
Columns: SKU, Description, On Hand, Allocated, Available, On Order, Damaged, Quarantine, Actions. The table shows one row per product and warehouse, but does not label which warehouse a row belongs to. To see on hand by warehouse, open Product 360.
KPI cards: “Total Products”, “On Hand (PCS)”, “Available (PCS)”, “Low Stock”.
Filters: “Search SKU / Item / Description”, “Apply”, “Low stock only”, “Reset”. Empty state: “No stock records found”. Loading state: “Loading stock levels…”.
Row actions: “Product” opens Product 360. “Movements” opens the ledger filtered to that SKU. “Export CSV” downloads a file named stock-levels-<year>-<month>-<day>.csv.
4. Locations
Inventory section, “Location Master”. Locations are the slots, racks, and zones inside a warehouse. Location codes stay unique in the company.
Columns: Select, Location Code, Warehouse, Name, Type, Zone / Coordinates, Status, Max Capacity, Actions.
Controls: warehouse filter (“All warehouses”), search by code, warehouse, zone, or rack, “Print labels” (disabled when none selected), “{n} selected”, “Add Location”, Import menu (“Download template”, “Import CSV”).
Add or edit a location
Fields: “Location Code *” (required, maximum 100 characters, read-only when editing), “Warehouse *” (required), “Location Name”, “Location Type *” (select: RACK, DOCK, STAGING, FLOOR, QC_HOLD), “Status *” (ACTIVE, INACTIVE), “Storage Coordinates” (Zone, Aisle, Rack, Level, Bin), “Capacity Limits” (“Max Weight (kg)”, “Max Volume (CBM)”, both minimum 0), “Notes”.
The code is uppercased on save. Save success: “Location created successfully” or “Location updated successfully”.
Two rules to know. Changing a location’s warehouse is refused while it holds stock: “Move stock out of {code} before changing its warehouse”. Deleting a location does not check whether it holds stock, so move stock out first.
Row actions per location: “Print label”, “Edit”, “Delete”.
How a location decides the bucket
For Adjust Stock, the location decides which bucket the adjustment lands in:
- DAMAGE type or DAMAGE zone: DAMAGED.
- QUARANTINE or QC_HOLD type, QUARANTINE, QC-HOLD, or QC_HOLD zone, or INSPECTION zone: QUARANTINE.
- DOCK or RECEIVING type or zone, or “RECEIVING DOCK” in code and name: RECEIVED_ON_DOCK.
- PICK_FACE or FORWARD type or zone, code starting PF- or OH, or name containing “PICK FACE”: ON_HAND.
- RACK, STORAGE, BIN, BULK, or FLOOR type or zone, code containing BULK, or name containing BULK or STORAGE: ON_STORAGE.
Pick-face min/max
Inventory section, “Pick-face min/max”. H1 “Pick-face status”. It shows current located PCS against min and max, re-read from located stock. When min/max is disabled for the company, a banner says levels can be configured, but auto replenishment tasks and shortage alerts will not run until the flag is on.
5. Adjust Stock
Product 360, “Adjust Stock” button. Dialog title: “Adjust Stock Balance”. Use it to correct one bucket on one product, with a written reason.
“Stock Bucket” offers eight buckets: Pick Face (AFS), Bulk Storage (AFS), Received on Dock (ROD), On Order, On Way, Multi WH, Damaged, Quarantine. ALLOCATED and PICKED are not adjustable.
“Movement Type” offers: “Adjustment (Manual)”, “Receive”, “Ship”, “Transfer”, “Reserve”, “Allocate”.
Fields: “Pieces Adjustment” (placeholder “e.g. 50 or -20”, hint “Use negative sign to decrease”), “Cases Adjustment” (placeholder “e.g. 5 or -2”, same hint), “Reference Code” (placeholder “e.g. PO-10293, AUDIT-2026”), “Audit Notes (Required)” (placeholder “Explain the reason for this stock adjustment…”).
Validation: notes are required, minimum 5 characters (“Notes are required for auditing purposes.”). Pieces and cases cannot both be zero: “Enter a non-zero pieces or cases adjustment.”
When a location is required
A location is required when quantities are non-zero and the bucket is DAMAGED or QUARANTINE, always. For ON_HAND or ON_STORAGE, a location is required when adding stock, and when removing stock once the company has more than one warehouse. Other buckets never require a location in the dialog.
Location choices for a decrease list locations that already hold this SKU in this bucket, each shown as code, warehouse, and PCS, plus an “Unlocated” choice when the bucket still has unlocated pieces. Location choices for an increase list locations classified to the bucket, shown as code, name, and warehouse. When the chosen location has pallets, an LPN picker lists each pallet with its PCS.
What the server checks
An adjustment that would drive a bucket negative is refused. Case quantities need a conversion: without an active CASE or MASTER_CASE conversion, the server refuses with “CASE conversion is required before adjusting case quantities.” A supplied location must exist, be ACTIVE, and classify to the chosen bucket. Removing pieces can open a case first; the ledger shows that as its own entry.
On success: “Stock adjusted successfully”. The adjustment changes that bucket and writes one movement to the ledger with the chosen type, bucket, quantities, reference, and notes. The form resets to the Pick Face bucket, the Adjustment movement type, quantities 0, and empty reference, notes, location, and pallet.
6. Cycle counts
Inventory section, “Cycle Counts”. A cycle count is a planned physical count. Variances are recorded during counting. On-hand stock changes only after approval.
List columns: Count #, Title, Warehouse, Location, Type, Status, Lines, Variance, Started, Completed, Actions. Status filter: All statuses, Draft, Open, Counting, Completed, Ready For Review, Approved, Cancelled. The list shows the 100 most recent counts, most recent first, with no pagination.
List governance flags per row: “Significant variance”, “Missing reason”. APPROVED rows with variances show “Adjustment applied”.
Create a count
H1 “New Cycle Count”. Expected quantities are snapshotted from on-hand stock at creation. Inventory changes only after approval.
Fields: Title * (required, maximum 200 characters), Count Type (AD_HOC, PRODUCT, LOCATION, WAREHOUSE), Warehouse ID, Location (required only when type is LOCATION), Notes (maximum 1000 characters).
- AD_HOC and PRODUCT require at least one line. Add lines with “Add Line” and product search (“Search SKU or product name”, “Type at least 3 characters to search products.”). Per-line location defaults to the count location. “Remove line” cannot remove the last line.
- LOCATION counts aggregate expected quantities from pallets stored at the selected location. Lines are generated automatically when the count is created.
- WAREHOUSE counts include all products with on-hand stock. Lines are generated automatically when the count is created.
Expected quantities are snapshotted from ON_HAND (pick face) stock. Counts are pick-face only. Bulk stock is not included in a count.
Start a count
Actions are gated by status, not by role. “Start Count” works on DRAFT or OPEN counts: “Start cycle count {n}? You can begin entering counted quantities.” Success: “Cycle count started”.
Counting only works while status is COUNTING. Enter either a counted quantity plus a UOM code, or pieces plus cases. Both missing: “Provide counted quantity in UOM or legacy pieces/cases”. Counting in CASE without a CASE conversion: “Product UOM conversion is required before counting this item in CASE.”
Variance math: variance is counted minus expected, in base units, pieces, and cases. A line with nonzero variance is VARIANCE, otherwise COUNTED. “Line count saved”.
“Complete Count” works on COUNTING counts and requires every line counted: “All lines must be counted before completing”. Confirm: “Complete cycle count {n}? All lines must be counted before completing.” Success: “Cycle count completed”.
Approve a count
“Ready For Review” works on COMPLETED counts: “Mark cycle count {n} ready for review? Inventory will remain unchanged until approval.” Success: “Cycle count marked ready for review”.
“Approve Adjustments” works on READY_FOR_REVIEW counts when governance is complete. Confirm: “Approving this Cycle Count will permanently adjust sellable inventory and create audit ledger entries. Variance reasons are required for all non-zero adjustments. Total variance: {label}.” Success: “Cycle count approved, inventory adjusted”.
Every non-zero variance line needs a reason code or notes before approval: “All non-zero variance lines must include a reason code or notes before approval”. Reason codes (9): “Found extra stock”, “Missing stock”, “Damaged stock found”, “Miscount”, “Wrong location”, “Receiving error”, “Picking error”, “System error”, “Other”. Governance editing is allowed in COMPLETED and READY_FOR_REVIEW. “Variance reason saved”.
Significant variance means absolute variance at least 100 PCS, or at least 10 times the largest active pack (MASTER_CASE, CASE, or DOZEN). The screen shows: “Significant variance detected (at least 100 PCS, or at least 10 of the largest pack, on one or more lines). Review carefully before approving.”
Approval posts ON_HAND only. Per line, it applies the variance to that warehouse’s stock and writes a “Cycle count adjustment” to the Movement Ledger on Pick Face (AFS), with the count number as reference and the reason and notes. Approval that would drive on-hand negative fails: “Cycle count approval would result in negative on-hand stock for product {id}”.
Approval is blocked when a PRODUCT or AD_HOC line’s product still has bulk (ON_STORAGE) stock in the default warehouse: “Cannot approve cycle count for {sku}: bulk stock of {quantity} is not included in this count”. Count the bulk location with a LOCATION count instead.
“Cancel Count” works on DRAFT, OPEN, COUNTING, COMPLETED, and READY_FOR_REVIEW counts: “Cancel cycle count {n}? This action cannot be undone.” Success: “Cycle count cancelled”. Approved counts cannot be cancelled: “Approved cycle counts cannot be cancelled”. Cancelled lines flip to REJECTED. APPROVED and CANCELLED are terminal and read-only.
7. Movement ledger
Inventory section, “Movement Ledger”. Audit log of all stock increases, decreases, and transfers. Every stock change writes a movement here.
Filters: “Search Product / Ref / Notes” (placeholder “SKU, description, PO#…”), Stock Bucket (“All Buckets” plus the ten bucket options), Movement Type (“All Types” plus Adjustment (Manual), Receive, Ship, Transfer, Reserve, Allocate, Initial Seed, Return, Channel inbound), “Reset Filters”.
Search matches reference, notes, or product SKU, item code, or description. Page size default 20, maximum 100, newest first.
Columns: Date & Time, Product, Type, Impact, Stock Bucket, Adjustment, Reference, Location, Operator, Audit Notes. There are no from/to columns. A transfer appears as two separate legs; follow the transfer link to see the other side.
A row shows: date and clock; product link plus lot; type chip plus title label plus impact sentence; bucket chip; signed adjustment (“+N PCS” or “0 PCS”) plus a “Cases not converted” note when applicable; reference, or a transfer-number link for transfer legs; location code or blank, plus pallet number; operator name or “System”; audit notes.
Impact sentences are derived from type, bucket, quantities, and reference, for example SHIP on ON_HAND reads “Shipped from on hand”, ALLOCATE on ALLOCATED reads “Inventory reserved” or “Reservation released”, CYCLE_COUNT on ON_HAND reads “Cycle count adjustment”, RETURN on DAMAGED reads “Return damaged”.
Empty state: “No movements found”. Loading state: “Loading ledger movements…”.
8. Reconciliation
Inventory section, “Reconciliation”. Read-only daily comparison of inventory invariants. Reconciliation changes nothing. It reports differences; you fix them in the ledger, with Adjust Stock, or with an approved cycle count.
Press “Run Reconciliation” to run a check on demand. Success toasts: “Reconciliation completed, no discrepancies”, “Reconciliation completed, no discrepancies, {n} warnings”, or “Reconciliation completed with {n} discrepancies”. Failure: “Reconciliation run failed”.
Check scope:
- Stock buckets vs the ledger: movement replay against the product’s stock buckets.
- The same check in base units.
- Pieces and cases matching the pack size.
- Pallets and lots: pallet-line internal consistency on active LPNs, plus optional lot movement replay when enabled per company.
Runs table: Run, Status, Discrepancies, Warnings, Completed. Empty: “No reconciliation runs yet.” Loading: “Loading runs…”.
Run detail: status, “{n} discrepancies”, “{n} warnings”. Discrepancy table: SKU, Entity, Field, Expected, Actual, Severity. SKU links to Product 360. Empty: “No discrepancies recorded for this run.”
Run statuses: COMPLETED, FAILED. Severities: INFO, WARNING, ERROR, CRITICAL. Discrepancy count counts rows with severity CRITICAL or ERROR. WARNING and INFO rows count as warnings.
What each check reports:
- Any negative bucket in a snapshot is a CRITICAL discrepancy (expected at least 0).
- On-hand pieces and cases not matching the pack size is a WARNING, unless a case fold explains it.
- The pallet and lot check compares pallet-line internal consistency per active lot. Lot movement replay runs only when enabled, and only for lots that already have lot-tagged movements. Older lots without lot-tagged movements are skipped.
A failed run is still stored with status FAILED and an error message. A successful run stores all discrepancy rows.
When numbers disagree: investigate the SKU in the Movement Ledger, then correct with Adjust Stock (one bucket) or an approved cycle count (on-hand). There is no apply-fix button on either reconciliation screen.
9. Who can do what on inventory screens
The permission registry is the authority for this table.
The Inventory section shows for roles with Inventory access.
| Role | Can open | Can do |
|---|---|---|
| OWNER | All inventory screens | Everything below, plus delete locations, approve counts, run reconciliation, edit governance, export |
| ADMIN | All inventory screens | Same as OWNER |
| MANAGER | All inventory screens | Create counts, add lines, cancel counts, approve counts, edit governance, create and edit locations, Adjust Stock, run reconciliation, export CSV. Cannot start a count, count lines, complete a count, or mark ready for review. Cannot delete locations |
| INVENTORY_CLERK | All inventory screens | Create counts, add lines, start counts, count lines, complete counts, mark ready for review, cancel counts, approve counts, create and edit locations, Adjust Stock, run reconciliation, export CSV. Cannot save variance reasons. Cannot delete locations |
| WAREHOUSE_SUPERVISOR | All inventory screens | Same as INVENTORY_CLERK |
| WAREHOUSE_OPERATOR | All inventory screens, view plus execute | Start counts, count lines, complete counts, mark ready for review. Cannot create counts or add lines, cannot Adjust Stock, cannot approve counts, cannot run reconciliation, cannot edit governance, cannot create, edit, or delete locations |
| READ_ONLY | All inventory screens | View only. Can export the Stock Levels CSV |
| ANALYST | All inventory screens | View only. Can export the Stock Levels CSV |
| PROCUREMENT_MANAGER | None of these screens | No Inventory access. The sidebar does not show the section. |
| SALES_MANAGER | None of these screens | No Inventory access. The sidebar does not show the section. |
| ACCOUNTING_MANAGER | None of these screens | No Inventory access. The sidebar does not show the section. |
| MARKETPLACE_MANAGER | None of these screens | No Inventory access. The sidebar does not show the section. |
Two things to know about buttons. The “Adjust Stock” button is shown to every viewer, but the server refuses the call without Inventory create access. Cycle-count action buttons depend on the count’s status, not on the role, and “Run Reconciliation” is shown to any viewer though it needs Inventory approve access. The server refuses each call, but the screen does not say so upfront.
10. Quick answers
Where is my stock? Stock Levels shows the buckets per product and warehouse. Product 360 shows on hand by warehouse, plus stock by location and LPN on the “Stock by location / LPN” tab.
Why is Available lower than On Hand? Allocated stock is subtracted. On Stock Levels, Available is on-hand minus allocated. On Product 360, ATP adds bulk available on top.
Why is stock in ROD not sellable? ROD means counted at the bay, not yet put away. Putaway moves it to a storage location and makes it available for sale. See chapter 6.
How do I fix a wrong number? For one bucket on one product, use Adjust Stock with a written reason. For on-hand stock found by counting, use a cycle count and approve it. Both write movements to the ledger.
Who can approve a cycle count? Roles with Inventory approve: OWNER, ADMIN, MANAGER, INVENTORY_CLERK, WAREHOUSE_SUPERVISOR. Approval also needs a reason code or notes on every non-zero variance line.
What does the ledger prove? Every stock change, with date, product, type, impact, bucket, signed adjustment, reference, location, operator, and audit notes. If a number looks wrong, the ledger shows how it got there.
What if reconciliation shows a discrepancy? Investigate the SKU in the Movement Ledger, then correct with Adjust Stock or an approved cycle count. Reconciliation itself changes nothing.
Can I delete a location that holds stock? The delete does not check. Move stock out first.
Why does the same SKU appear twice on Stock Levels? One row per product and warehouse. The table does not label which warehouse a row belongs to. Open Product 360 to see on hand by warehouse.