Home / Help Center / pos-app / Stock / Godown / Expiry Monitor
⏰ Stock / Godown

Expiry Monitor

Expiry Monitor pulls every batch-tracked product with an expiry date into one urgency-sorted view, so you can act on expired and soon-to-expire stock before it becomes a total loss.

📍 Menu path: Stock / Godown → Expiry Monitor
👤 Who uses it: All roles with Inventory view access
🏷️ Plan tier: advanced+

Overview

Batches are grouped into four urgency buckets — Expired, Expires Today, Within 7 Days, Within 30 Days — with a live count on each, and the page auto-opens on the most urgent non-empty bucket.

For each batch you can either create an automatic Clearance Discount (a time-limited markdown so the POS discounts the item until it sells through, with no permanent price change) or Mark Wasted to write the remaining quantity off as a loss.

This is a Stock/Godown page requiring the Advanced plan tier — it is generically mounted in every variant (pointed at /inventory/expiry-monitor), separate from the bakery-specific expiry dashboard used inside the Bakery module.

Before You Start

Step-by-Step Guide

1 Review batches by urgency

  1. The alert banner at the top summarises how many batches are already expired and how many expire today.
  2. Use the four summary cards (Expired / Expires Today / Within 7 Days / Within 30 Days) or the tab bar below them to switch between buckets — each shows its own count.
  3. Within a bucket, use the table's search box to find a specific product, batch or supplier reference, and sort by any column.

2 Create a clearance discount

  1. Click Clearance on a batch row.
  2. Enter a discount percentage (1–99%) when prompted.
  3. BazaarPOS creates a Clearance Discount rule for that product so POS automatically applies the markdown until the stock sells through — no manual price edit needed, and nothing to remember to undo.

3 Write off expired stock as waste

  1. Click Mark Wasted on a batch row.
  2. Confirm the write-off — the remaining batch quantity is deducted from stock immediately with a "WASTE" movement type and a note referencing the batch.
💡 On the generic (non-bakery) mount used here, Mark Wasted deducts stock directly rather than opening a separate wastage-logging page.

Every Field & Button, Explained

Field / ButtonWhat it does
Alert bannerSummarises counts of already-expired and expiring-today batches; only shown when either count is greater than zero.
Expired / Expires Today / Within 7 Days / Within 30 Days cardsClickable summary tiles with live counts; clicking one switches the active tab.
Product columnProduct name; searchable together with batch number and supplier reference.
Batch No. columnThe batch/lot number the expiring quantity belongs to.
Qty Left columnRemaining quantity in that specific batch.
Expiry Date columnThe batch's recorded expiry date.
Status columnColour-coded urgency badge with a "days left" or "expired Nd ago" label.
Supplier Ref columnThe supplier reference/PO number recorded against the batch, if any.
Clearance buttonCreates a time-limited clearance discount rule for the product (prompts for a discount %).
Mark Wasted buttonWrites off the remaining batch quantity as waste, deducting stock immediately.

Tips & Best Practices

Troubleshooting & FAQ

The page is empty even though I know some stock is close to expiring.
Only products with batch tracking and an expiry date recorded show up here. Add batches with an expiry date via Inventory → product ⋮ menu → Batches.
I don't see Expiry Monitor in my sidebar at all.
It requires the Advanced plan tier or above. Ask your Admin to check the current plan under Settings/License if you believe you should have access.
Clicking Clearance didn't seem to change the product's price.
Clearance discounts are applied automatically at POS billing time via a markdown rule — the product's base price is intentionally left unchanged; check Clearance Discounts (Offers & Coupons → Clearance Discounts) to confirm the rule was created.
Mark Wasted removed stock but I wanted to review it first.
On this generic mount, Mark Wasted deducts stock immediately after a confirmation prompt — there is no draft/review step here. Use Inventory → ⋮ → Waste/Loss instead if you want more control over the reason/quantity before committing.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/fnb/ExpiryMonitorPage.jsx

Backend endpoints used:

  • GET /inventory/expiry-monitor
  • POST /markdown-rules
  • PUT /inventory/:productId/adjust

Related tables (db-core repositories):

  • StockBatch
  • Product
  • MarkdownRule
  • StockMovement

Feature flag key: inventory (requires advanced plan tier or above)

This shared component (pages/fnb/ExpiryMonitorPage.jsx) takes apiPath and wastePath props. The bakery variant uses it with apiPath="/bakery/expiry-monitor" and a real wastage page; every other variant's /expiry-monitor route mounts it generically with apiPath="/inventory/expiry-monitor" and wastePath={null}, which is what makes "Mark Wasted" deduct stock directly instead of navigating to a wastage form. The restaurant and bakery variants instead redirect their own /expiry-monitor route to a variant-specific expiry dashboard.