Fashion online: variants, sizes and returns
A fashion store doesn’t have a catalogue problem, it has a combination problem: the same jacket comes in eight sizes and twelve colours, and every one of those variants leads its own life in the database.
The catalogue explodes before the traffic does
On a fashion store the product page is only a shopfront. What matters is the combination. PrestaShop writes every size × colour crossing into product_attribute, with the matching stock in stock_available: 8 sizes and 12 colours make 96 rows for a single reference. A few hundred models are therefore enough to pass tens of thousands of combinations, and the back office starts to drag before the first visitor arrives.
WooCommerce goes further: each variation is a content item in its own right, post_type = product_variation, with its own set of rows in wp_postmeta. The database grows quickly, product editing screens get heavy, and filtering queries by size or colour are the first to suffer. Shopify approaches it from the other end and caps the number of options and variants per product. Past that ceiling a model has to be split across several product pages, which scatters internal linking and separates pages that should have been one.
Variants are behind a large share of the requests I get from clothing merchants: entering images per variant, purchase price per variant, and how the size selector behaves on mobile.
What breaks as the wardrobe grows
- Images belong to the colour, not the size: PrestaShop goes through product_attribute_image, and every image variant declared in image_type multiplies the files generated on disk.
- Stock empties out size by size and never evenly: middle sizes go first, the extremes sit there until the sales.
- Hiding a sold-out size makes the visitor think the whole model has gone; it should stay visible, struck through, with an explicit state.
- A size exchange exists natively in none of the three platforms: it is either a credit note or a second order, never a single operation.
- Putting a return back into stock has to be conditional: a garment that comes back worn, stained or without its tag is not resellable and must not reappear for sale.
- Size guides and FR/UK/US/IT conversions differ from one brand to the next: they are product data, not an image dropped into the footer.
- End-of-line discounts apply per combination: a specific_price carries an id_product_attribute, and a discount set on the product alone misses the remaining sizes entirely.
How I work on a fashion catalogue
-
I start from the combination generator
Before adding anything, I count the rows actually present in product_attribute and stock_available, and how many match variants that were never made. Clothing catalogues carry combinations born from an import that crossed every size with every colour. Deleting them lightens the database and the admin screens before any performance work begins.
-
I attach the images to the colour
I check that each image is linked to the combinations of the right colour, then cut the formats generated in image_type down to those the theme genuinely uses. On a catalogue with heavy seasonal turnover, that is what keeps the disk from filling with thumbnails nobody displays.
-
I make unavailability readable
A sold-out size stays visible and struck through with a clear label, and the selector shows the state of every size without forcing a click on each one. I wire the back-in-stock alert into the same place: it is the only reliable signal on demand for the extreme sizes.
-
I build the exchange as its own flow
Since none of the three platforms knows what an exchange is, I build it explicitly: a return request typed as an exchange, a hold on the replacement size while the parcel travels, then a conditional restock after inspection. A damaged item leaves sellable stock instead of returning to it.
-
I push pricing down to the combination
End-of-line pricing is driven per variant: a specific_price targeting an id_product_attribute clears the sizes left over without discounting the ones still selling at full price. A discount set on the whole product destroys the margin on the middle sizes.
Pages related to variants
-
Variant bugs on PrestaShop
Combinations missing from the front end, stock that doesn’t follow, images tied to the wrong attribute: common causes and their fixes.
-
Variable products displayed wrongly on WooCommerce
Empty selector, invisible variations, price shown as a range: what is really happening around variations and wp_postmeta.
-
Shopify variant limits
What the platform actually caps, and the consequences when a model has to be split across several product pages.
-
Variant
What the term covers in practice, and how it differs from one platform to another.
Frequently asked questions
Should sold-out sizes be hidden?
At what point does a catalogue become heavy?
Can a size exchange be handled without a new order?
Where should the size guide live?
How do I discount a single size at end of line?
Describe your need in one minute
A few targeted questions so I can reply with an estimate rather than another questionnaire.