Simple products — the default Quantity mode
A simple product is a product line tracked as a single integer count. You have 12 of them, you sell one, you have 11. No variants, no per-unit identifiers, no lot numbers — just a number that ticks up on restock and down on sale. This is Fexl Lite’s default tracking mode and the right choice for the overwhelming majority of retail stock: t-shirts, soft drinks, packaged groceries, hardware, cleaning supplies, anything where one unit off the shelf is as good as the next.
Creating a simple product
Open Products → New Product
Reachable from the Products page header or any “Add Product” call-to-action across the app.
Fill the basics
Name (the way it appears on the POS grid and on receipts), category (autocomplete from existing categories), condition (new / used / refurbished / etc.), and selling price. Optional: MSRP, barcode (manual entry, scan, or Generate Barcode for an auto-unique EAN-compatible code), and SKU (auto-generated, editable).
Leave Structure on Simple and Tracking on Quantity
These are the defaults — don’t touch them unless you specifically need variants, IMEIs, or lot/expiry tracking. The form’s info note is explicit: use the Restock action after saving to add stock and set the unit cost.
Save
The product lands on the Products list with On hand: 0. You’re ready to restock it.
Costing — WAC on top of FIFO layers
Every restock writes one ingress row to inventory_transactions with a qty_remaining set equal to the quantity received. That row is a FIFO cost layer. When a sale leaves the building, Fexl Lite walks open layers oldest-first and the actual per-layer cost is what posts to COGS — see FIFO costing for the full mechanics.
The products.cost_price field is a separate, derived number — the weighted average across all past restocks. The Restock dialog shows it as the Avg suggestion chip and updates it after every receive. WAC is what reports show as “current cost” for valuation defaults; FIFO is what books actually consume on each sale.
When simple products aren’t enough
Bug #46 was a lesson: a customer asked why their COGS reports averaged across price drift instead of walking layers, and the answer was that Quantity-tracked products use WAC for the front-end “current cost” but the books are FIFO underneath. If you genuinely need per-lot semantics surfaced in the UI — expiry warnings, recall by batch — that’s Batch tracking, not a Quantity workaround.
Pick a different mode when:
- Each unit has a unique manufacturer identifier the customer cares about (IMEI, serial number) → Serialized.
- Stock arrives in lots with a shared expiry date and selling expired stock is a real risk (food, pharma, cosmetics) → Batch & expiry.
- The product comes in size × colour × style combinations sold from one parent line → Variants.
What you’ll see across the app
- Inventory page — one row, one number in the Stock Level column, one badge (In Stock / Low Stock / Out of Stock).
- POS — tap or scan the product, the unit lands in the cart at the selling price. No picker.
- Receipt — line shows product name and price.
- Inventory Valuation report —
qty_remaining × layer_costsummed across all open layers. Matches the balance sheet inventory line for this product. - Inventory Moves report — every ingress and egress in the period as a separate row, each with its own per-unit cost.
Related
Tracking modes overview
The three precision levels side by side.
Restock a product
Add stock and open a fresh FIFO layer at the cost you paid.
FIFO costing
Per-layer cost via qty_remaining — the engine under all three modes.
Variants
When a “simple” product needs to split into size and colour.