Works25 User Guide

Stock & Pricing

Why some items live in the Price List and others in Inventory, why a RM0.00 price is not a fault, and why your stock balance is never a stored number.

  • Updated: 28 October 2026
  • For owners, supervisors & store staff
  • 3 parts
A

Pricing: where an item lives, and which price shapes exist

One question decides the module; nine price shapes decide the figure.

A1. Two different homes: Price List and Inventory Goods

This is the first source of mistakes, and it comes down to one question: does the customer pay for this thing?

Point Price List Inventory Goods
What it holds Things billed to customers Physical stock, raw materials, goods
Where Settings → Price List Inventory → Goods
Billable? Yes — it appears in the order item picker No — it is counted through stock movements
Stock quantity? No Yes — SKU, cost, unit, location

A carpet being cleaned → Price List. It is a physical thing, but the customer pays for the service of cleaning it.

The shampoo used to clean it → Inventory Goods. It is never billed directly.

If the customer pays for it, it belongs in the Price List — even if it is a physical object.

If it is kept in the store and runs down as work is done, it belongs in Inventory Goods.

Don't cross them

Don't send staff to Inventory to add a billable service, and don't go to the Price List to fix stock. The two are not substitutes for each other.

Back to contents

A2. The nine pricing shapes on one screen

All of these can live on the same item.

Shape What it is for
Base price A fixed price for one unit
Add-on Pricing by measurement — square feet, kg, metres
Price range Tiered pricing by quantity
Options / variations Choices such as S / M / L, colour, size
Package / sub-items One item containing several sub-items
Contract pricing Special prices for contract customers
Points & vouchers Items that can be bought with points or vouchers
Item tax A sales tax rate per item
Item discount & commission Discount or commission specific to the item

Pricing by measurement: the actual recipe

There is no "measurement" field on an item. It is modelled as base price 0 + an add-on carrying the rate:

1. Edit the item → set the price to 0.

2. Add-Ons → create one named after the unit ("Square Feet" / "Kaki Persegi") → enter the rate → Confirm.

3. At order time the measurement becomes the add-on's quantity — 30 sq ft = add-on quantity 30.

RM0.00 is not a fault

If an item shows RM0.00 on an order, the add-on was not selected or was never created — the price has not gone missing.

Price ranges

A range stores from / to / price, and that price can be computed per unit or as the total for the range. So "1–5 pieces RM8, 6 and above RM6" is two range rows, not two separate items.

Back to contents

A3. Quantity, size and unit price

Each order line stores a size/quantity and a total price.

Unit price = price ÷ size. It is not stored as its own field — it is computed.

That is why the invoice groups items by the rounded unit price: two lines at the same rate appear as one line with the combined quantity.

If a line shows a strange unit price, check its size. A size of 0, or a wrong size, makes the rate look impossible even when the total is right.

Back to contents
B

Stock: movements, purchase orders, counts and own use

Stock is not a number. It is the sum of every movement, and each movement has a type.

B1. There is no stored "stock number"

The most important thing to understand about Works25 inventory: the stock balance is not stored as a number. It is computed every time from the list of stock movements.

The formula

Stock = total in − total out, per location. In means movements with no source location; out means movements with no destination location.

Every change in stock must have a movement. No movement means no change, no matter what is typed on a screen.

If a figure is "corrected" without a movement, it returns to the movement total when the page reloads.

Checking stock means checking the history of movements, not a field.

Back to contents

B2. Every movement has a type, and the type is the meaning

Movement type Meaning Written when
Orderlist A booking not yet confirmed The order is saved
Sales A real sale The bill becomes Done/Delivered
Ordered Ordered from a supplier The PO is saved
ToOrder Flagged as needing to be ordered It is marked for ordering
Stock Arrival Goods received The arrival is recorded
Returns Goods sent back The return is recorded
Internal Use Used by the business, not sold Own use is recorded
Dispose Disposed of The disposal is recorded

The key distinction: a movement that is not committed has not happened. It shows as ordered or to order in the inventory list, but it does not change available stock.

A PO is not a stock movement

A PO is a record in Payables of type PurchaseOrder; its goods are recorded as Ordered lines. Don't look for a PO in the stock movement list.

Back to contents

B3. Adding stock with a Purchase Order

A PO is how you promise stock, not how you add it.

Step What happens
1. Register the supplier A supplier is a profile, not free text
2. Create the PO Pick the supplier, add SKUs, quantity and unit cost
3. Save the PO A PurchaseOrder record is written; Ordered lines are recorded, not yet committed
4. Print the PO The document you send to the supplier
5. Receive the goods Stock Arrival — stock comes in, batches are updated
6. Cost is recorded A cost transaction is written; extra charges can post to Payables

A PO does not add stock. It only promises it. Stock rises at the Stock Arrival step. That is why the inventory list shows Ordered and S.O. columns separately from available stock.

Back to contents

B4. Receiving goods (Stock Arrival)

During an arrival three things are written together:

1. Stock movement

Stock Arrival into the chosen location, on the date you set — which can be backdated to when the goods actually arrived.

2. Batch & expiry

If the goods are batch-tracked, the quantity is added to that batch, or a new batch is created.

3. Cost transaction — the value of the goods (unit cost × quantity) is posted to a cost account, so stock and accounting do not contradict each other.

Arrival cost beats PO cost

If the unit cost differs from the PO, the cost entered at arrival is what is used from then on. The PO is an estimate; the arrival is the fact.

Back to contents

B5. Stock check (stock count)

A count does not change stock directly. It compares the physical count with the system balance, then writes a correction.

Step What happens
1. Start the count The system balance is taken as a reference, not changed
2. Enter the physical count The system computes the difference per SKU and per goods type
3. Confirm A correction is written as a movement, with user and date; the count keeps the quantity and cost differences for reference

Never fix stock by editing a balance. Use a count, so there is a trail of who changed it and when.

A repeating difference on the same SKU usually means a missing movement, not a bad count — check whether goods left without a Sales movement, for example used without being recorded as Internal Use.

Count per location. Stock on a different shelf is different stock.

Back to contents

B6. Internal use: goods the business uses itself

Goods used for operations — not sold to a customer — must leave through Internal Use, not through a sale.

Point Detail
Where The inventory location screen, through the own-use button
Who can Only roles granted the own-use permission
Basis A batch of the goods, not just the SKU — the quantity comes out of one batch and its remainder is reduced
Cost Unit cost is taken from the goods cost card
Accounting A cost transaction is written for the value of the goods used
Effect on sales None — it is not a sale, so there is no revenue and no sales tax
Why it has to be separate

If staff use stock for internal work and record it as a sale, you get fake sales, fake commission and tax that should never have been charged. If they record nothing at all, stock disappears for no reason. Internal use is the correct path out of both problems.

Back to contents
C

Cost, availability and problems

When cost is locked in, who can see an item, and the eight complaints that always come.

C1. Cost and COGS: when cost is "locked in"

Every goods item has a unit cost and a cost history per branch.

When a bill becomes Done/Delivered, the unit cost is copied onto the stock movement and a Goods Sold transaction is written.

Which means: changing a goods cost today does not change yesterday's sale. Gross profit stays based on the cost at the time of that sale.

If you correct a cost, it applies to future sales. To correct something already posted, use an account adjustment, not a cost edit.

For goods that have a recipe (one good produced from other goods), the quantity used is recipe quantity × item size, and its cost comes from the component goods' cost.

Beyond recipes, a price item can be linked straight to SKUs through the goods link: each link stores a per-unit quantity and a force-count flag. That is how "one wash uses 50 ml of shampoo" is modelled for an item that is not itself a goods record.

Back to contents

C2. Availability and visibility

Point Meaning
Available flag Whether the item can be chosen on an order
Max user level Whether the item shows on the customer page. Empty or 9 = visible; any other value = hidden
Minimum stock The minimum level for an inventory item
Low Stock flag Computed: available stock plus what is already ordered, compared with minimum stock
Archive Kept but no longer in use

"The item vanished from the customer page." Check max user level and the available flag before assuming it is broken.

"Low stock is on even though I already ordered." Correct — the flag counts goods already ordered too, so it only lights up if stock is still below minimum after those orders.

Stock can go negative. That is not a fault: it means goods left before an arrival was recorded. Fix it with a Stock Arrival, not by editing a number.

Back to contents

C3. Common problems

Symptom Usual cause Action
Item does not appear in the order picker Available flag off, or max user level hiding it Fix it on the item
Price comes out RM0.00 Base price 0 and the add-on is not selected See A2
Strange unit price Wrong size on the order line Fix the size, not the price
Stock did not drop after a sale The bill is not Done/Delivered Move the bill's status forward
Stock did not rise after a PO A PO does not add stock Record a Stock Arrival
Negative stock Goods left before an arrival Record the arrival; look for missing movements
Count does not match the physical stock A movement was never recorded Check that SKU's movement history
Gross profit moved with no change in sales The goods cost was edited Old costs stay on old sales; see C1
Back to contents
Works25
Home Offers