Serial Numbers
Serial Numbers gives you one searchable list of every individually tracked unit across all your serial-tracked products — its current status, warranty expiry, and which customer it was sold to.
Overview
This page is a read-only, filterable ledger of serial numbers already recorded against your serial-tracked products (e.g. phones, appliances, anything with an IMEI or unique unit number) — it does not add new serials itself.
New serial numbers are added from the Inventory page: open a serial-tracked product's ⋮ menu → Serial Numbers to register new units as they arrive, and their status updates automatically to Sold when billed at POS.
A left-hand status rail (All / Available / Sold / Returned / Damaged) shows a live count badge per status, and a Products list below it lets you narrow to one specific product.
Before You Start
- At least one product must be marked "Serial Tracked" (on the Products page) and have serial numbers registered against it via Inventory → ⋮ → Serial Numbers before anything appears here.
- Adding serial numbers to a product from Inventory requires the Advanced plan tier or above for the Inventory feature.
Step-by-Step Guide
1 Filter by status
- Use the left rail to switch between All Serials, Available, Sold, Returned and Damaged — each shows its own live count.
- The grand total badge at the top of the page adds up all four statuses.
2 Filter by a specific product
- Use the Products dropdown at the top, or click a product name in the left rail's Products list, to see only that product's serials.
- Click "All Products" to clear the product filter.
3 Search, sort and export the list
- Use the table's search box to find a serial number, product name/SKU, or customer name/phone.
- Click any column header (Serial Number, Product, Status, Batch, Warranty Expiry, Customer, Sale Date) to sort by that column.
- Switch page size (25/50/100) at the bottom, and use the export button to download the current view as a spreadsheet.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Grand total badge | Sum of Available + Sold + Returned + Damaged counts, shown at the top of the page. |
Product filter dropdown | Restricts the table to serials belonging to one serial-tracked product. |
Status rail | All Serials / Available / Sold / Returned / Damaged, each with its own count badge; clicking one filters the table instantly. |
Serial Number column | The unique serial/IMEI value, shown in monospace font. |
Product column | Product name and SKU the serial belongs to. |
Status column | Colour-coded badge: Available (green), Sold (blue), Returned (amber), Damaged (red). |
Batch column | The batch/lot number this serial was received under, if batch tracking is also used for the product. |
Warranty Expiry column | The warranty end date recorded for this specific unit, if any. |
Customer column | Name and phone of the customer this unit was sold to (populated automatically once sold). |
Sale Date column | The date this specific serial was billed at POS. |
Tips & Best Practices
- Use the Damaged status to flag defective units returned by customers so they never get accidentally re-sold at POS.
- Search by customer phone number when a customer calls in about a warranty claim — it is faster than looking up their whole purchase history.
- Keep Warranty Expiry filled in when registering serials; it is what makes warranty-claim lookups useful later.
Troubleshooting & FAQ
The list is completely empty.
I can't find a "Serial Numbers" action on a product in Inventory.
A serial still shows Available after I sold the unit.
Can I edit or delete a serial number from this page?
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/SerialNumbersPage.jsxfrontend-app/packages/pos-react-lib/src/pages/inventory/SerialNumbersPanel.jsx
Backend endpoints used:
GET /productsGET /serialsPOST /serialsGET /serials/product/:productId/statsPATCH /serials/:idDELETE /serials/:id
Related tables (db-core repositories):
ProductSerialProductSale
Redux slices:
scope (selectCurrentScope / getScopeQueryParams)
Feature flag key: inventory
The page fetches per-status counts with four parallel GET /serials?status=X&limit=1 calls (reading only total from each) rather than one combined stats endpoint, so the count badges update independently of the currently loaded table rows. The table itself is rendered by the shared DataGrid component with client-side search/sort/export.