Variants are one product with several versions, each with its own price, stock and SKU: a t-shirt in three colours and four sizes. Every combination lives separately, yet the catalogue still shows a single product.
The reassuring part first: a product with no combinations behaves exactly as before — price from the base price, stock from the product. The variant matrix is an addition, not a replacement.
The three attribute switches people mix up
The attribute form has three independent switches. Confusing them causes most of the «why doesn't this work» questions.
| Switch | What it does | Where the buyer sees it |
|---|---|---|
| Variant axis | Makes the attribute combinable: its values become a selector | Selector on the product page |
| Filterable | Shows the attribute in category filters. Unrelated to variants | Filter sidebar |
| SEO facet | Allows dedicated landing addresses for this attribute | Separate filter URLs |
Any combination of switches is allowed. Clothing size typically needs all three.
The trap: «variant axis» removes the attribute from the specifications list. That is deliberate — size should not appear both in the selector and in the spec table. But if you enable it on a product without a matrix, it looks like the specification vanished. If you are not going to build combinations, do not switch it on.
Only attributes with discrete values can be an axis: list, multi-list, colour or image. Colour and image draw a swatch or thumbnail in the selector instead of text, but the logic is the same — one value per axis.
Pricing: product mode first, then values
A combination's price is built in two layers, and the order decides everything.
Layer 1. The product's price mode
| Mode | What applies | Who it suits |
|---|---|---|
| Explicit price | You type the price on the combination itself. All modifiers are ignored | Arbitrary sets where prices follow no formula |
| Modifiers | Full price, surcharge, discount, percentage | Clothing, accessories |
| Coefficients | Multiplication only | Rugs, fabrics — anything priced by area |
A product is either coefficient-based or modifier-based. They cannot be mixed within one product, and that is not an interface bug: the foreign operator is simply not applied, silently. If a price «does not react» to a value you configured, the product mode is most likely filtering that operator out.
Layer 2. The value's price mode
Each axis value carries its own effect on the price. With a base price of 1,000:
| Value mode | What it does | Set to | Result |
|---|---|---|---|
| No effect | Value with no pricing impact | — | 1,000 |
| Full price | The whole variant price; base is ignored | 950 | 950 |
| Surcharge | Add an amount | 150 | 1,150 |
| Discount | Subtract an amount | 100 | 900 |
| Percentage | Percent of the current value; negative means a discount | 15 | 1,150 |
| Coefficient | Multiply | 1.2 | 1,200 |
Axis order matters
With several axes they apply one after another — and the result depends on the order, because addition and percentages do not commute:
| Chain (base 1,000) | Result | Why |
|---|---|---|
| +150, then 10% | 1,265 | (1000 + 150) × 1.1 |
| 10%, then +150 | 1,250 | 1000 × 1.1 + 150 |
| full price 500, then +150 | 650 | full price resets the base, the chain continues |
| +150, then full price 500 | 500 | full price wipes everything before it |
1,265 ≠ 1,250 is not a calculation error, it is arithmetic. The order is fixed, so the result is reproducible rather than shifting from one run to the next.
Coefficients are calmer in that respect: multiplication commutes, and 1.2 × 1.5 gives the same result as 1.5 × 1.2.
Stock and the price in listings
Every combination has its own stock, so «blue L sold out» does not block «blue M». In product listings the store shows a range: when combinations differ in price, the buyer sees «from» the cheapest one.
A practical order of work
- Decide which attributes are genuinely axes. Colour and size — yes; a material that changes neither price nor availability — probably not.
- Switch «variant axis» on only for those, remembering they will disappear from the specifications list.
- Choose the product's price mode before filling in values — it decides which operators will work at all.
- Set the pricing on the values rather than on each combination: that way prices compute themselves.
- Spot-check a few combinations by hand, especially with more than one axis and a percentage in the chain.