Reaction Commerce Forums

How to create customized products?

I would like to create a store on which products are customized by the users. For each product, a user would make many (more than 10) selections. An example would be a customized notebook. You could choose the size, number of pages, cover picture, cover thickness, line format, line color, and so on.

I’ve considered creating all variants for each product, hiding them and mapping the user choices to a variant (as recommended on this topic). However, the number of variants for each product would be huge (e.g. 10 selections, 3 options each = 59,049 variants). Moreover, the possible user choices would evolve frequently, meaning that variants would need to be recreated/updated often.

I’ve also considered extending the product schema, but AFAIU doing so would add properties to all products, not to a specific product.

What’s the recommended way of creating customized products with Reaction Commerce?

Welcome to the Reaction community, @musse!

This is definitely something that we should have out-of-the-box on the API, but unfortunately that’s not the case. If you’d like to work on PR’ing this for the community to use, we would be really grateful for your help.

In the meantime, if you were to do it without re-architetecting the way products and catalogs work, I would advise you to build a system which creates variants on the fly for configurations when they don’t exist yet.

Instead of your staff manually creating the 59,049 needed in your example, your customers would have a UI on the PDP where they can customize their product. You’d have some server-side logic which would check if the variant representing the exact combination of options chosen by the customer already exists. If it does, it would add this variant to the customer’s cart. If it doesn’t, it would automatically create it, publish it and then add it to the customer’s cart. All transparently.

That’s how must configurators work on standard commerce platforms like Magento and SFCC. It would be a lot better to have an API which supports this in a cleaner way, but I’d say this is still a pretty good option if you don’t want to engage in core work.