Available for projects & agency overflow · Quick reply, from the person who does the work

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.

Describe my issue Send a message

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Frequently asked questions

Should sold-out sizes be hidden?
No. Hiding a size suggests the whole model has gone and sends the visitor away. I show every size, mark the missing ones visually and offer a back-in-stock alert, which incidentally reveals real demand.
At what point does a catalogue become heavy?
There is no universal threshold: what counts is the number of models multiplied by the number of variants, and how the theme queries the database. A few hundred models routinely pass tens of thousands of combination rows, which is enough to slow the back office long before the shopfront.
Can a size exchange be handled without a new order?
Not natively. PrestaShop, WooCommerce and Shopify can refund or issue a credit note, not exchange. The exchange has to be developed: a typed request, a hold on the replacement size, inspection on arrival, then reshipment. It is a flow, not a checkbox.
Where should the size guide live?
In product data, not in a footer image. FR/UK/US/IT conversions change from one brand and sometimes one cut to the next; keeping them on the product makes them translatable, indexable and fixable without editing a graphics file.
How do I discount a single size at end of line?
By setting the discount on the combination. In PrestaShop a specific_price can target a given id_product_attribute; the same logic exists elsewhere under other names. A product-level discount hits every size, including those still selling well.

Describe your need in one minute

A few targeted questions so I can reply with an estimate rather than another questionnaire.

type
existant
stack (facultatif)
utilisateurs (facultatif)
echeance (facultatif)
Please provide an email or a phone number so I can get back to you.

Please provide an email or a phone number so I can get back to you.