Home / Help Center / pos-app / Stock / Godown / Inventory
📦 Stock / Godown

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.

📍 Menu path: Stock / Godown → Inventory
👤 Who uses it: All roles can view; Adjust/Batches/Transfer/Import/Waste/Bin/Consignment need the Inventory Create or Edit permission; CSV/Excel export needs the Export permission (Settings → Staff Permissions)

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

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).

  1. Use the search box to find a product by name or SKU (results update automatically after you stop typing).
  2. 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).
  3. Click a column header (Product, SKU, Stock, Expiry) to sort — click again to reverse the direction.
  4. Toggle between Table view and Grid (card) view using the icons on the right of the filter bar.
  5. 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

  1. The top stats row shows total SKUs, total units, total stock value (at cost price) and category count — informational only.
  2. 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.
  3. 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

  1. For a ±1 change (e.g. correcting a miscount), use the small − / + buttons next to the quantity in the table or grid row.
  2. For anything else, click Adjust (or the ⋮ menu → same action) to open the Stock Adjust panel.
  3. 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).
  4. Enter the quantity (or the target quantity for Adjustment) — a live "Stock after adjustment" preview appears.
  5. Optionally fill in a Note, Reference # (PO/bill number), Batch/Lot # and Expiry Date, then click Save Changes.
  6. 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.
💡 All quantity changes — quick ±1, the Adjust panel, bulk stock take, transfer, repack, assemble, waste and consignment — ultimately go through the same backend adjust endpoint, so every change is captured in Stock History.

4 Run a full bulk stock take

  1. Click Start Stock Take in the page header — the table switches into bulk-edit mode and an amber banner appears.
  2. Type the freshly counted quantity directly into any row's quantity box; rows you don't touch are left unchanged.
  3. 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

  1. Open a row's ⋮ menu and choose Batches (Advanced tier) to see every batch/lot recorded for that product.
  2. Click Add Batch and fill in Batch/Lot # (required), Quantity, Expiry Date, Received Date, Cost Price per unit, Supplier Ref/PO # and Notes.
  3. 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.
  4. 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

  1. Open ⋮ → Transfer (Advanced tier), or click the header-level Transfer button and search for the source product yourself.
  2. Search and pick both the "From" and "To" products — each shows its current stock once selected.
  3. 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.
  4. Click Transfer to move the units — useful for repacking one SKU into another or correcting a mis-billed product.
💡 Use the swap (⇄) button to quickly flip From/To without re-searching both products.

7 View the full stock movement history

  1. 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.
  2. Each entry shows the quantity delta, the before → after values, who/what triggered it (note/reference), and the timestamp.
  3. Use Previous/Next to page through older movements (20 per page).

8 Scan a barcode to jump straight into Adjust

  1. Type or scan a barcode into the "Scan barcode…" box in the filter toolbar and press Enter or click Find.
  2. 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

  1. Click Import in the page header to open the Bulk Import wizard.
  2. 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.
  3. Each row is matched by SKU or Barcode; leave any column blank to leave that field untouched on the matched product.
  4. Review the Preview & Validate step — rows with errors (missing SKU/Barcode, non-numeric quantities) are highlighted red and are skipped automatically.
  5. 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

  1. 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.
  2. 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

  1. 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.
  2. Enter how many finished kits to assemble; rows short on component stock are highlighted red and assembly is blocked until resolved.
  3. Click Assemble to consume the components and add the finished kits to stock in one step.

12 Repack bulk stock into retail packs

  1. 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.
  2. 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.
  3. Click Repack — stock is deducted from the source and added to the target pack product in one linked transaction.

13 Manage consignment stock

  1. Open ⋮ → Consignment (Enterprise tier) to see the consignment log for that product — quantity received, returned and sold per supplier batch.
  2. 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.
  3. 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

  1. Open ⋮ → Waste / Loss (Advanced tier) and choose a type: Waste, Theft, Spoilage or Damage.
  2. 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

  1. Open ⋮ → Default Supplier and pick which supplier should automatically receive a purchase order when this product falls to or below its reorder point.
  2. 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

  1. Click Valuation in the page header to open the report, generated fresh each time it opens.
  2. 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).
  3. 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 / ButtonWhat it does
RefreshRe-fetches the inventory list and stats immediately.
Export (Excel/PDF button)Opens the formatted export dialog for the current filtered list; requires Export permission.
CSVOne-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).
ValuationOpens the Stock Valuation Report modal (Book/FIFO/WAC methods).
ImportOpens 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 TakeToggles bulk-edit mode where every row's quantity becomes directly editable for a full recount.
SKUs / Units / Value / Categories tilesTop-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 tilesClickable alert filters — click to filter the table to just that condition, click again to clear.
Reorder Suggestions bannerAppears only under the "Needs Reorder" filter when items are at/below their reorder point; its button jumps to Purchase Orders.
Search boxDebounced search across product name and SKU.
Scan barcode… + FindLooks up a product by barcode and opens the Adjust panel for the matching row directly.
Category filterRestricts the list to one product category.
Stock status filterAll / In Stock / Low Stock / Needs Reorder / Out of Stock / Expiring Soon / Expired / Has Expiry Date.
Table / Grid toggleSwitches the product list between a dense table and card-style grid.
− / + quick adjustOne-unit stock decrease/increase directly from the row, without opening a modal.
Status badgeOut of Stock (red, qty = 0), Low Stock (amber, qty ≤ min level), or In Stock (green).
↑ REORDER tagShown under the status badge when quantity has dropped to or below the reorder point (but is still above zero).
Min / Reorder columnShows the product's configured minimum stock level and reorder point side by side.
Expiry columnShows days remaining/expired with colour coding, plus the batch number underneath if one is on the row.
Bin/shelf tagSmall 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.
⋮ BatchesOpens per-product batch/lot tracking with expiry and cost per batch (Advanced tier).
⋮ TransferOpens Stock Transfer with this product pre-loaded as the source (Advanced tier).
⋮ HistoryOpens the full stock movement timeline for this product (all tiers).
⋮ Serial NumbersOpens inline serial-number management for this product; only shown when the product is serial-tracked (Advanced tier).
⋮ AssembleOpens the Kit Assembly panel; only shown for products flagged as a Kit (Advanced tier).
⋮ RepackOpens the Repack panel to convert bulk stock into a retail-pack product; only shown when the row has stock (Advanced tier).
⋮ ConsignmentOpens consignment receive/return/settle tracking (Enterprise tier).
⋮ Bin LocationOpens the bin/shelf location editor (Enterprise tier).
⋮ Waste / LossOpens the write-off panel for Waste, Theft, Spoilage or Damage (Advanced tier).
⋮ Default SupplierOpens the auto-reorder supplier picker for this product.

Tips & Best Practices

Troubleshooting & FAQ

I clicked Adjust (or Transfer/Waste/Batches) and nothing happened.
As an Admin viewing an aggregated scope (Company or Unit, not a single branch), BazaarPOS blocks all write actions and shows a toast asking you to pick a specific branch from the scope selector first.
Why don't I see Batches, Transfer, Serial Numbers or Waste/Loss on some rows?
Those actions require the Advanced plan tier or above for the Inventory feature. If you are on a lower tier they are hidden entirely rather than shown disabled.
Why is Consignment or Bin Location missing even though I have Advanced?
Those two specifically require the Enterprise tier, one level above Advanced.
Batch total doesn't match the inventory quantity shown at the top of the Batches panel.
This means batches were added/edited/deleted without going through a matching stock adjustment (or vice-versa). Reconcile by editing the batch quantities or running a fresh Adjustment to match the true count.
Some rows in my import file were skipped.
Rows are skipped if they are missing both SKU and Barcode, or if Quantity/Min Stock/Max Stock/Reorder Point contain non-numeric values. The Preview & Validate step marks each bad row in red with the specific reason before you import.
What is the difference between "Adjustment" and "Restock" when adjusting stock?
Restock adds a specific quantity on top of the current stock (e.g. received 20 more units). Adjustment lets you type the exact final quantity you counted, and BazaarPOS works out the difference for you — use it for stock counts.
Assemble is greyed out even though I entered a quantity.
Assembly is blocked whenever any single component does not have enough stock for the quantity you are trying to build — the shortage is highlighted in red in the Bill of Materials table.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/Inventory.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/StockAdjustModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/StockTransferModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/BatchModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/StockHistoryModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/InventoryImportModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/BinLocationModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/AssembleKitModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/RepackModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/ConsignmentModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/WasteLossModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/ValuationReportModal.jsx
  • frontend-app/packages/pos-react-lib/src/pages/inventory/DefaultSupplierModal.jsx
  • frontend-app/packages/pos-react-lib/src/services/inventoryService.js

Backend endpoints used:

  • GET /inventory
  • GET /inventory/stats
  • GET /inventory/:productId
  • GET /inventory/barcode/:barcode
  • PUT /inventory/:productId/adjust
  • POST /inventory/bulk-adjust
  • POST /inventory/transfer
  • GET /inventory/:productId/batches
  • POST /inventory/:productId/batches
  • PUT /inventory/:productId/batches/:batchId
  • DELETE /inventory/:productId/batches/:batchId
  • GET /inventory/movements
  • POST /inventory/import
  • PATCH /inventory/:productId/bin-location
  • POST /inventory/assemble
  • POST /inventory/repack
  • GET /inventory/consignment
  • POST /inventory/consignment
  • POST /inventory/consignment/:id/return
  • POST /inventory/consignment/:id/settle
  • PATCH /inventory/:productId/default-supplier
  • GET /inventory/valuation
  • GET /products
  • GET /products/:id
  • GET /products/categories
  • GET /suppliers

Related tables (db-core repositories):

  • Inventory
  • Product
  • StockMovement
  • StockBatch
  • Consignment
  • Supplier
  • KitComponent

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.