Pending payment orders and held stock
For stock management to work the product(s) you sell need to have the setting stock management at product level enabled.
When an order is placed in WooCommerce it gets the status Pending payment. At this point you don’t see any inventory change in the order notes, which is how WooCommerce handles the order statuses.
Stock quantity changes are added to the order notes once the order is considered paid. Read more about WooCommerce order statuses.
Even though the stock quantity is not yet reduced, the way WooCommerce operates is that it actually reserves/holds the products in an order when the order is placed. This is so that a product can’t be sold out while a customer’s payment is being processed.
You can control this with the help of the WooCommerce Hold stock setting. If you for instance enter 5 minutes in the Hold stock (minutes) field, that is how long the product is held while awaiting order payment. If no payment is received within these 5 minutes the order will be cancelled and the product will be available for purchase again. Please note that this only applies to orders with the Pending payment status, not On hold. When setting the amount of minutes stock will be held you need to consider setting enough time to actually allow a customer the time to finish their order. You also need to consider not setting it too long, so that it remains unavailable for others if the customer decides to not complete the order.
Changed pending payment orders
When a customer places an order in WooCommerce a Pending payment order will be created. If the customer for some reason doesn’t complete the order/payment process at this point, it will remain in pending payment status. If the customer returns to complete the order but makes any changes, or their session has expired, a new order will be created and used instead.
This will cause two orders from the same customer to exist in WooCommerce that also can have the same transaction-ID from the payment provider. This in itself is not a problem, other than it can be confusing, since the customer has only been charged for the Processing order. It can however cause some unforeseen issues. For instance, a discount coupon limited to one (1) use can wrongfully be deemed as no longer valid. This is because it’s tied to the original pending payment order if that order hasn’t been cancelled.
You can read more about this at Discount coupons wrongfully claimed to have already been used.
Why isn’t the order set to Cancelled?
If an order that isn’t finalized by the customer isn’t automatically set to Cancelled after the time set in the Hold stock setting has expired, it most likely means that your website has an issue with WP-cron. WP-Cron is how WordPress handles scheduling time-based tasks in WordPress. You can read more about this at wordpress.org.
Note that WP-cron can be turned off in WordPress, but that system cron can still run on the server. So advise your web developer or your host regarding this.