A serum in 30 ml and 50 ml is two products on the shelf and one product in the catalog. Until now, editing those combinations was buried, one row at a time. Renaming “Size” rebuilt every priced row from scratch. There was no screen that could put stock on 50 ml in warehouse A.
That gap is closed. Sizes, colours, and other options now have a tab of their own — with a preview before anything is generated, a grid you can edit in bulk, and on-hand counts per combination and warehouse.
Products with no options are unchanged. Create, receive, transfer, count, and sell them exactly as before.
Options you can see
Add Size, Colour, or whatever the clinic actually sells as named axes. Values are chips, not a comma-separated box. Drag axes into the order the shop should show. Rename an axis or a value and the combinations keep their prices, barcodes, and stock — a rename is a rename, not a delete.
A live banner answers “what will Generate do?” before you commit: how many combinations stay, how many are new, which labels would be hidden. If stock or history is at risk, a confirmation names each affected combination and its quantity. Hide 50 ml by mistake, add the value back, and the combination returns with its stock and prices intact.
There is a ceiling: more than two hundred combinations is refused, in the preview and on the server, so a typo cannot explode the catalog.
One grid, one save
Price, cost, barcode, low-stock threshold, photo, and active switch sit on the same grid as the combination label the invoice already uses — “Blue / M”, not a different admin string.
Select eight sizes, apply +10% to the price, review the drafts, save once. Nothing is posted until Save. Changed cells are marked; a row can be reverted; leaving with unsaved edits is a prompt, not a silent discard.
Stock on a combination is the on-hand number you type for the warehouse selected above the grid. That is correcting a count, not receiving a purchase — buying stock with cost still goes through the usual receive path, so the two never get confused. Warehouse B is independent of warehouse A.
Give 50 ml its own photo; siblings keep the parent image until they have one. The clinic website store already shows that combination image when the store is on.
From the products list
The variants count on a product row opens the product on the Variants tab. Expanding the row shows each combination and its stock without opening anything — so a rolled-up low-stock number is no longer a mystery.
Read-only inventory users see the axes and the grid. They cannot generate, bulk-edit, save, or upload.
Selling those combinations on the clinic website is the store switch, not a second catalog. See the online-store drop.