Inventory
Inventory is the control centre for everything to do with stock — how much of each product you have, where it sits, which batch/expiry it belongs to, and every adjustment, transfer, waste write-off or stock take that changed it.
Overview
Every product with a stock record shows up as one row here: current quantity, minimum/reorder levels, stock value at cost price, expiry status and (if assigned) its bin/shelf location.
The page is scope-aware — Admins viewing "All Branches" see a read-only combined view and a Branch column, while a specific branch scope shows normal editable rows. Admins must pick one specific branch before any write action (Adjust, Batch, Transfer, Waste, etc.) will run; otherwise BazaarPOS blocks the action with a toast asking you to choose a branch from the scope selector.
Some actions are gated by your plan tier: Batch tracking, Product-to-product Transfer, Serial Numbers, Repack and Waste/Loss need the Advanced tier; Consignment Stock and Bin/Shelf Location need the Enterprise tier. Gated buttons are simply hidden rather than shown disabled.
The row-level "⋮" action menu adapts to the product: Serial Numbers only appears for serial-tracked products, Assemble Kit only for kit/BOM products, and Repack only when the product currently has stock to break down.
Before You Start
- Products must already exist (created on the Products page) before they show up here — Inventory does not create new products, only manages the stock of existing ones.
- If you are an Admin viewing an aggregated scope (Company/Unit, not one branch), switch the scope selector to a specific branch first — write actions are blocked otherwise.
- Batch tracking, Transfer, Serial Numbers, Repack and Waste/Loss require the Advanced plan tier or above for the Inventory feature; Consignment and Bin Location additionally require the Enterprise tier.
Step-by-Step Guide
1 Browse, search and filter the stock list
The sidebar has four quick links into this same page, each pre-applying a filter via the URL: All Stock, Low Stock (?filter=low), Out of Stock (?filter=out) and Expiring Soon (?filter=expiring_soon).
- Use the search box to find a product by name or SKU (results update automatically after you stop typing).
- Narrow by Category using the dropdown, or by Stock Status (In Stock, Low Stock, Needs Reorder, Out of Stock, Expiring Soon, Expired, Has Expiry Date).
- Click a column header (Product, SKU, Stock, Expiry) to sort — click again to reverse the direction.
- Toggle between Table view and Grid (card) view using the icons on the right of the filter bar.
- Use the pagination controls at the bottom (25 rows per page) to move through the full list.
2 Read the stock health stats and jump straight to a problem
- The top stats row shows total SKUs, total units, total stock value (at cost price) and category count — informational only.
- The four alert tiles below (Low Stock, Out of Stock, Expiring Soon, Expired) are clickable filters — click one to instantly filter the table to just those rows; click it again to clear the filter.
- When any product has crossed its reorder point, an indigo "Reorder Suggestions" banner appears with a Create Purchase Order button that jumps to Purchase Orders.
3 Quick-adjust or fully adjust a product's stock
- For a ±1 change (e.g. correcting a miscount), use the small − / + buttons next to the quantity in the table or grid row.
- For anything else, click Adjust (or the ⋮ menu → same action) to open the Stock Adjust panel.
- Pick a Movement Type: Restock (add — purchase/receive), Adjustment (set the exact quantity — for stock counts), Damage (remove damaged/expired items), Return (customer return back to stock), or Transfer (move to/from another location).
- Enter the quantity (or the target quantity for Adjustment) — a live "Stock after adjustment" preview appears.
- Optionally fill in a Note, Reference # (PO/bill number), Batch/Lot # and Expiry Date, then click Save Changes.
- If the resulting stock is at or below the minimum level, or exactly zero, an inline Low Stock / Out of Stock alert banner appears in the same panel before you close it.
4 Run a full bulk stock take
- Click Start Stock Take in the page header — the table switches into bulk-edit mode and an amber banner appears.
- Type the freshly counted quantity directly into any row's quantity box; rows you don't touch are left unchanged.
- Click Save Adjustments in the banner to post every entered quantity as one "Bulk stock take" adjustment, or Cancel to discard.
5 Track batches, lot numbers and expiry per product
- Open a row's ⋮ menu and choose Batches (Advanced tier) to see every batch/lot recorded for that product.
- Click Add Batch and fill in Batch/Lot # (required), Quantity, Expiry Date, Received Date, Cost Price per unit, Supplier Ref/PO # and Notes.
- Existing batches can be edited (batch number itself is locked once created) or deleted — deleting a batch reduces the product's total inventory by that batch's quantity, with a confirmation prompt showing the exact impact.
- A running "Batch total" footer compares the sum of all batch quantities against the product's actual inventory count and flags any mismatch in amber.
6 Transfer stock between two products
- Open ⋮ → Transfer (Advanced tier), or click the header-level Transfer button and search for the source product yourself.
- Search and pick both the "From" and "To" products — each shows its current stock once selected.
- Enter the quantity to move (capped at the "From" product's available stock) and an optional note, then review the before/after preview for both products.
- Click Transfer to move the units — useful for repacking one SKU into another or correcting a mis-billed product.
7 View the full stock movement history
- Open ⋮ → History on any row (available to every role, no tier restriction) to see a timeline of every Restock, Return, Opening, Adjustment, Transfer, Sale and Damage event for that product.
- Each entry shows the quantity delta, the before → after values, who/what triggered it (note/reference), and the timestamp.
- Use Previous/Next to page through older movements (20 per page).
8 Scan a barcode to jump straight into Adjust
- Type or scan a barcode into the "Scan barcode…" box in the filter toolbar and press Enter or click Find.
- BazaarPOS looks up the matching inventory row and opens the Stock Adjust panel for it directly — a fast path for a supplier delivery where you're scanning items one by one.
9 Bulk import stock from Excel/CSV
- Click Import in the page header to open the Bulk Import wizard.
- Download the provided .xlsx template (SKU, Barcode, Quantity, Min Stock, Max Stock, Reorder Point, Note columns) or drag your own file onto the drop zone — .csv, .xlsx and .xls are all supported.
- Each row is matched by SKU or Barcode; leave any column blank to leave that field untouched on the matched product.
- Review the Preview & Validate step — rows with errors (missing SKU/Barcode, non-numeric quantities) are highlighted red and are skipped automatically.
- Click Import N records to apply all valid rows; the final step reports how many records updated, how many SKUs were not found, and any row-level errors.
10 Assign a bin / shelf location
- Open ⋮ → Bin Location and type a free-text location code (e.g.
A-01-03, aisle-rack-shelf format), or click one of the quick-pick examples. - Click Save Location — the code then shows as a small violet tag next to the product in the list, and a pin icon marks the row.
11 Assemble a kit / BOM product
- Open ⋮ → Assemble (only shown for products marked as a Kit) to see its Bill of Materials — each component, quantity needed per unit, and current stock.
- Enter how many finished kits to assemble; rows short on component stock are highlighted red and assembly is blocked until resolved.
- Click Assemble to consume the components and add the finished kits to stock in one step.
12 Repack bulk stock into retail packs
- Open ⋮ → Repack (only shown when the row has stock) to break a bulk item (e.g. a 50kg sack) into a smaller retail-pack product.
- Enter the quantity of the source product to consume, search for and select the target pack product, and enter how many packs are produced plus any wastage.
- Click Repack — stock is deducted from the source and added to the target pack product in one linked transaction.
13 Manage consignment stock
- Open ⋮ → Consignment (Enterprise tier) to see the consignment log for that product — quantity received, returned and sold per supplier batch.
- Switch to the + Receive Consignment tab to record new stock taken in on consignment (supplier, quantity, cost price, batch/reference, notes) without owing the supplier until it sells.
- From the log, use Return to Supplier to send back unsold units, or Mark Settled once you've paid the supplier for what sold.
14 Record waste, theft, spoilage or damage
- Open ⋮ → Waste / Loss (Advanced tier) and choose a type: Waste, Theft, Spoilage or Damage.
- Enter the quantity to write off (capped at current stock) and an optional note, then click Record Loss — this deducts stock immediately with the reason attached to the movement history.
15 Set a default supplier for auto-reorder
- Open ⋮ → Default Supplier and pick which supplier should automatically receive a purchase order when this product falls to or below its reorder point.
- This only creates a PO automatically if Auto-Reorder is separately enabled in Settings; otherwise it is used to pre-fill supplier on manual reorders.
16 Run the stock valuation report
- Click Valuation in the page header to open the report, generated fresh each time it opens.
- Choose which costing method to view: Book Value (cost price from product master × quantity), Batch/FIFO Value (remaining batch quantities × their batch cost) or WAC Value (Weighted Average Cost rate × quantity).
- Filter by product name/SKU, and export the full report to CSV including all three valuation methods side by side.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Refresh | Re-fetches the inventory list and stats immediately. |
Export (Excel/PDF button) | Opens the formatted export dialog for the current filtered list; requires Export permission. |
CSV | One-click download of the currently loaded rows as a plain CSV (Name, SKU, Category, Qty, Unit, Min Level, Reorder Point, Last Restocked, Cost Price, Value). |
Valuation | Opens the Stock Valuation Report modal (Book/FIFO/WAC methods). |
Import | Opens the bulk Excel/CSV import wizard for quantities and thresholds. |
Transfer (header button) | Opens Stock Transfer without pre-selecting a source product (Advanced tier). |
Start Stock Take / Exit Stock Take | Toggles bulk-edit mode where every row's quantity becomes directly editable for a full recount. |
SKUs / Units / Value / Categories tiles | Top-row summary stats — total distinct products, total units across all products, total stock value at cost, and number of categories in use. |
Low Stock / Out of Stock / Expiring Soon / Expired tiles | Clickable alert filters — click to filter the table to just that condition, click again to clear. |
Reorder Suggestions banner | Appears only under the "Needs Reorder" filter when items are at/below their reorder point; its button jumps to Purchase Orders. |
Search box | Debounced search across product name and SKU. |
Scan barcode… + Find | Looks up a product by barcode and opens the Adjust panel for the matching row directly. |
Category filter | Restricts the list to one product category. |
Stock status filter | All / In Stock / Low Stock / Needs Reorder / Out of Stock / Expiring Soon / Expired / Has Expiry Date. |
Table / Grid toggle | Switches the product list between a dense table and card-style grid. |
− / + quick adjust | One-unit stock decrease/increase directly from the row, without opening a modal. |
Status badge | Out of Stock (red, qty = 0), Low Stock (amber, qty ≤ min level), or In Stock (green). |
↑ REORDER tag | Shown under the status badge when quantity has dropped to or below the reorder point (but is still above zero). |
Min / Reorder column | Shows the product's configured minimum stock level and reorder point side by side. |
Expiry column | Shows days remaining/expired with colour coding, plus the batch number underneath if one is on the row. |
Bin/shelf tag | Small violet pin-icon tag showing the assigned bin/shelf location code, if set. |
Adjust (row button) | Opens the Stock Adjust panel pre-loaded with that product. |
⋮ Batches | Opens per-product batch/lot tracking with expiry and cost per batch (Advanced tier). |
⋮ Transfer | Opens Stock Transfer with this product pre-loaded as the source (Advanced tier). |
⋮ History | Opens the full stock movement timeline for this product (all tiers). |
⋮ Serial Numbers | Opens inline serial-number management for this product; only shown when the product is serial-tracked (Advanced tier). |
⋮ Assemble | Opens the Kit Assembly panel; only shown for products flagged as a Kit (Advanced tier). |
⋮ Repack | Opens the Repack panel to convert bulk stock into a retail-pack product; only shown when the row has stock (Advanced tier). |
⋮ Consignment | Opens consignment receive/return/settle tracking (Enterprise tier). |
⋮ Bin Location | Opens the bin/shelf location editor (Enterprise tier). |
⋮ Waste / Loss | Opens the write-off panel for Waste, Theft, Spoilage or Damage (Advanced tier). |
⋮ Default Supplier | Opens the auto-reorder supplier picker for this product. |
Tips & Best Practices
- Set realistic Min Stock Level and Reorder Point values per product on the Products page — the Low Stock tile and reorder banner are only as useful as those thresholds.
- Use the barcode scan box during supplier deliveries — it is faster than searching by name for every carton you receive.
- Run the Valuation report before month-end closing so your books, GST filing and physical stock all agree on the same numbers.
- When something doesn't reconcile, check Batches first — the batch-total-vs-inventory mismatch banner catches most data-entry slips.
- If an Admin cannot click Adjust/Transfer/Waste and sees nothing happen, it is almost always the "select a specific branch" guard — switch the scope selector first.
Troubleshooting & FAQ
I clicked Adjust (or Transfer/Waste/Batches) and nothing happened.
Why don't I see Batches, Transfer, Serial Numbers or Waste/Loss on some rows?
Why is Consignment or Bin Location missing even though I have Advanced?
Batch total doesn't match the inventory quantity shown at the top of the Batches panel.
Some rows in my import file were skipped.
What is the difference between "Adjustment" and "Restock" when adjusting stock?
Assemble is greyed out even though I entered a quantity.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/Inventory.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/StockAdjustModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/StockTransferModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/BatchModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/StockHistoryModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/InventoryImportModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/BinLocationModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/AssembleKitModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/RepackModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/ConsignmentModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/WasteLossModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/ValuationReportModal.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/DefaultSupplierModal.jsxfrontend-app/packages/pos-react-lib/src/services/inventoryService.js
Backend endpoints used:
GET /inventoryGET /inventory/statsGET /inventory/:productIdGET /inventory/barcode/:barcodePUT /inventory/:productId/adjustPOST /inventory/bulk-adjustPOST /inventory/transferGET /inventory/:productId/batchesPOST /inventory/:productId/batchesPUT /inventory/:productId/batches/:batchIdDELETE /inventory/:productId/batches/:batchIdGET /inventory/movementsPOST /inventory/importPATCH /inventory/:productId/bin-locationPOST /inventory/assemblePOST /inventory/repackGET /inventory/consignmentPOST /inventory/consignmentPOST /inventory/consignment/:id/returnPOST /inventory/consignment/:id/settlePATCH /inventory/:productId/default-supplierGET /inventory/valuationGET /productsGET /products/:idGET /products/categoriesGET /suppliers
Related tables (db-core repositories):
InventoryProductStockMovementStockBatchConsignmentSupplierKitComponent
Redux slices:
auth (role)license (planInfo.features.inventory tier)scope (useInventoryScope / selectedScope)NavPermissionContext (usePagePermission)
Feature flag key: inventory
All quantity mutations funnel through a single PUT /inventory/:productId/adjust endpoint (see _adjust() in inventoryService.js) — quick ±1, the Adjust panel, bulk stock take and the waste/repack/assemble/transfer flows all end up here or at a small number of dedicated endpoints, so every change lands in Stock History uniformly. Tier gating for row actions is computed client-side from state.license.planInfo.features.inventory (invAdvanced = advanced/enterprise, invEnterprise = enterprise only) rather than from the page-level minTier used by other Stock pages.