This is going to be unpopular if you've already done a lot of work on your catalog. So - take it with a grain of salt.
In reality you're not really selling a bundle of products that have varying quantities - having 64GB of RAM in a server may equate to 4x 16GB but does your customer have to know or intuit that? It should just be an option in-and-of itself and not have to deal with quantities. It also sounds like there is a relationship between all of the attributes.
So in this case you're really describing a configurable product.
A configurable product is a product that has many variations that all have fixed specifications. Take a tshirt for instance:
- It can come in red, blue, green
- It can come in small, large, xlarge
- It can come in male, female, tanktop varieties
Each of these products is actually a separate product - e.g. a small red tanktop or a large green male tshirt and for each of these you have a finite quantity available. That is to say that you can sell out of the small size but still have an xlarge available in the same color and style.
So I would recommend that you reconfigure your catalog to these specifications. You would have the following configurable attributes on a Virtual Server:
- RAM quantities (2, 4, 8, 16, 32, 64GB)
- CPU quantities (1x, 2x, 4x, 8x, 16x)
- HDD space (100, 250, 500, 1000GB)
And then you would have physical products that represent each of those configurations. E.g. a 100GB 2xCPU server with 16GB RAM.
Magento helps you create these by defining the pivot attributes and then in the parent configurable product creation screen suggesting that it create the products on your behalf. That helps speed some of this up.
This also lets you avoid the situation where you know you won't be able to accomodate a 16CPU/64GB/1TB box - just mark that option out of stock.
When added to the cart this appears as a single line item with a description and they can then change the quantities at-will.
Hope that helps.
Best Answer
Based on your description the root cause of the problem could be one of those:
You have upgraded to Magento 2.3 from the previous version of Magento where you had some orders placed, but not shipped. As since Magento 2.3 the stock deduction logic has changed drastically and now Magento places reservation at the time of Order placement (negative reservation) and then compensate it at the time of Shipment creation (positive reservation), you face the problem that Magento compensates the reservation which in fact was not created (because an order has been placed on older version of Magento.). You can read more about this here - https://github.com/magento-engcom/msi/wiki/Salable-Quantity-Calculation-and-Mechanism-of-Reservations
another reason for getting this issue is that you had Inventory Configuration Manage Stock = false. With this config option, Magento does not place a reservation at the time of order placement. But then you decided to switch Stock management On, and placing shipment you overcompensated with positive reservation (similar as case 1)