Define attributes like Size and Color, auto-generate every combination as a variation with its own barcode, price add-on and stock, and use quantity units to sell the same item by the case or by the each.
A t-shirt that comes in four sizes and five colors is not twenty products — it is one product with twenty variations. PHP Point Of Sale models this in two steps: an attribute is a characteristic that can differ (Size, Color), its values are the options (Small, Medium, Large), and a variation is one sellable combination of values with its own item number, prices and stock. The same Variations tab also holds quantity units — pack sizes like "6-pack" or "Case" — and the item's modifiers.
Everything here happens on the item itself, after creating the item, except global attributes, which have their own management page.
Create and manage global attributes
A global attribute is defined once and reused on any item — the natural choice for Size, Color or Material. A consistent Size attribute across your catalog is also what makes the Best Selling Attribute Value report meaningful later.
- Click Inventory in the left menu and select Attributes.
- Click Add Attribute.
- Enter a Name (e.g. "Shirt Size") and its Values — type each value and press Tab or click the dropdown entry to add it (e.g. Small, Medium, Large). Entering values now is what lets you auto-create variations later.
- Click Save.
On the same page you can filter and sort attributes by name, edit a name or its values inline, and Delete an attribute. Two caveats verified in the app's behavior:
- Editing a global attribute (renaming it or adding values) does not automatically update items that already use it — each item keeps its own selection of values.
- Deleting a global attribute does not remove the variations already created on items; those must be removed on each item individually.
Add attributes to an item
- Open the item in Inventory → Items (click Edit) and go to the Variations tab.
- In the Item Attributes dropdown, pick a global attribute and click Add. The attribute appears as a row where you choose which of its values apply to this item.
- To create an attribute that only this item will ever use, pick New Custom Attribute in the same dropdown, click Add, and give it a name when prompted. A custom attribute lives only inside this item — it cannot be selected on any other item and does not appear under Manage Global Attributes.
- The Manage Global Attributes link takes you to the attributes page if you need a new global one mid-edit.
- Clicking Delete on an attribute row removes the attribute and every variation it generated from this item (after a confirmation).
In the item list, any item that carries attributes shows a stacked icon under its name.
Create the variations
Once attributes and values are chosen, add the actual variations in the Item Variations grid on the same tab. Each variation row has:
- Name — optional; how the variation is identified at the register (e.g. "Green T-Shirt"). Left blank, the variation displays as its attribute values.
- Attributes — the combination this row represents; start typing and pick from the suggested "Attribute: Value" entries. Picking a second value for the same attribute replaces the first.
- Item Number — one or more barcodes for this exact variation; type a number and click Add value. Optional, and the app blocks numbers already used elsewhere.
- Is Ecommerce — Yes/No dropdown, shown when an ecommerce platform is connected. Defaults to Yes, so every variation syncs online unless you switch it off.
-
Variation ID — assigned automatically, displayed as
itemID#variationID. This composite ID is what prints on generated barcodes and what the register uses to ring up the exact variation. - Supplier — each variation can have its own supplier, defaulting to the item's supplier.
Two ways to fill the grid:
- Add Item Variation — adds one blank row at a time. You must add attributes to the item first; otherwise the app tells you so.
- Auto Create Variations — builds every combination of the selected attribute values in one pass (Size S/M/L × Color Black/White = six rows), after a confirmation. Names are auto-assigned; edit anything afterwards.
Click into any cell to edit it, use Delete on a row to remove one variation, and Save when done.
Per-variation pricing
On the item's Pricing tab, an extra Variations table appears listing every variation with its supplier and name. For each variation you can set a Cost Price, Selling Price, and Promo Price with promo start and end dates. Any field left blank falls back to the item's base price — so set only the exceptions, like XXL costing more. See creating items for the rest of the Pricing tab.
Per-variation inventory
On the item's Inventory tab, the single quantity fields are replaced by a per-variation table: each variation carries its own Reorder Level, Replenish Level, Quantity, Limited Sales Quantity (a per-sale cap), damaged quantity with a Damaged Reason, an add/subtract adjustment field, and a comment. Viewing quantities requires the See Item Quantity permission; adjusting them requires Edit quantity. With multiple locations, each location tracks each variation separately, and the Locations tab shows a per-variation grid for location-specific prices and levels.
The inventory tracking history at the bottom of the tab records the variation on every movement, so you can trace exactly which size sold or was received. See stock levels, adjustments and damaged items.
Quantity units — sell by the pack
Quantity units solve a different problem than variations: the same product sold in different pack sizes with correct stock math. They live at the top of the same Variations tab. Click Add in the Quantity Units section and fill each row:
- Name — how the unit shows at the register, e.g. "Ten Pack" or "Case of 6".
- Quantity — how many base units the pack contains. Selling one "Case of 6" deducts 6 from stock.
- Cost Price — the total cost of the whole pack (6 bottles at $0.50 = $3.00).
- Selling Price — what the customer pays for the pack.
- Item Number — an optional barcode for the pack itself, so scanning a case rings up the case; the app rejects numbers already in use.
- Default For sale / Default for Receiving — mark at most one unit as the default automatically applied when selling and/or receiving; ticking one unticks the others.
Add as many units as you like (single, 3-pack, 5-pack, 10-pack…), and Save. To change one later, edit the fields inline; Delete removes a unit.
For products that must never sell in fractions, also check Only Allow Items To Be Sold In Whole Numbers on the Pricing tab.
At the register
- Adding an item with variations puts a Variation line under it on the sale; the cashier clicks it and picks the combination from a dropdown (each choice can show its supplier). Scanning a variation's own item number — or a generated barcode carrying
itemID#variationID— rings up the exact variation with no extra step. - An item with quantity units shows a Quantity Units line reading None in the cart line's expanded details; the cashier clicks it, picks the unit, and confirms. The sale line then prices and deducts stock by the pack. If a unit is marked default for sale, it is applied automatically, and because the unit lives on each cart line it can be switched per line mid-sale — one line by the each and another by the case. See ringing up a sale.
- The inventory history and receipts record which variation and which quantity unit were used.
Receivings work the same way: variations and quantity units (with their own cost) can be chosen per line. Picking an item with variations from the receiving search suggestions first opens a popup asking for a quantity per variation (and, for items with secondary suppliers, which supplier the line is from); turn the popup off with Disable Variation Popup in Receiving in Store Config to fill everything in on the lines instead — see receiving stock.
Interactions with other features
- Barcodes and labels — print a label per variation so every size/color scans exactly; see barcodes and labels and the label designer.
- Ecommerce — variations sync to WooCommerce and Shopify as product variants, and attributes sync both ways; per-variation Is Ecommerce excludes single combinations. See how ecommerce sync works.
- Serialized items — a serial number can be tied to a specific variation on the item's Serial Numbers page; see serialized and special item types.
- Item kits — a kit component can be a specific variation of an item, not just the item; see item kits and modifiers.
- Reports — the Best Selling Attribute Value report breaks sales down by attribute value (which size, which color actually sells), and inventory reports track quantities per variation. See running reports.
- Cloning — cloning an item copies its attributes, variations and quantity units to the new item.
Variation, kit or modifier?
Variations are for one product in different versions with separately tracked stock. If you are bundling several different items together, or adding priced options like toppings, you want item kits and modifiers instead — that article compares all three so you can pick the right structure before building out your catalog.
Common questions
Why is the Auto Create Variations button not doing anything? The item needs at least one attribute with values selected on the Variations tab first. Add the attribute, choose its values, save, then auto-create.
I renamed a global attribute value — why didn't my items change? Edits to a global attribute do not propagate to items that already use it. Each item keeps its own copy of the selected values, so update the items individually (or delete and re-add the attribute on the item).
Do variations need their own barcodes? No — item numbers on variations are optional. Without one, the cashier picks the variation from the dropdown on the sale line. With one, scanning it rings the exact variation directly.
How do I charge a different price only for one size? On the Pricing tab, find that variation's row in the Variations table and enter its selling price. Blank rows keep using the item's base price.
How do I sell a 6-pack without creating a second item? Add a quantity unit on the Variations tab with Quantity 6 and its own cost and selling price. Selling the pack deducts 6 base units from stock, so counts stay accurate whichever way customers buy.
Can I track how many of each size I have at each store? Yes. Quantity is tracked per variation per location — the Inventory tab shows the per-variation grid for your current location, and the Locations tab covers the others.
Why can't I add the quantity unit's item number? The number is already used by another item, variation or quantity unit. The app enforces unique numbers; pick a different code.
What does the Variation ID like "512#3" mean? It is the item ID and the variation ID joined by #. Generated barcodes carry this composite ID, and typing or scanning it at the register rings up that exact variation.
Comments
0 comments
Please sign in to leave a comment.