Skip to content

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.

Updated 5 May 2026·For v2.2.0·4 min read

Creating a simple product

1

Open Products → New Product

Reachable from the Products page header or any “Add Product” call-to-action across the app.

2

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

3

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.

4

Save

The product lands on the Products list with On hand: 0. You’re ready to restock it.

products · new product form · simple + quantity

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 reportqty_remaining × layer_cost summed 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.