I know this is a bit old but I’ve encountered this issue on 2 different M2 stores for different reasons and the fix we implemented hasn’t been mentioned above.

One store was using a cheap “Delete Orders” extension which wasn’t correctly updating the reservations table. The other was a M1 to M2 migration which had Cancelled orders. This meant more Saleable Stock was showing than actual.

There’s a section in the M2 documentation about finding and fixing inventory reservation inconsistencies you can see here: https://devdocs.magento.com/guides/v2.4/inventory/inventory-cli-reference.html

The following command shows you all the “fixes” you need to make in order to resolve the inconsistencies in your inventory.

bin/magento inventory:reservation:list-inconsistencies -r
Code language: PHP (php)

The -r flag puts it in a raw format that makes step 2 of this process much easier. It’ll produce lines like this:

172:bike-123:+2.000000:1
Code language: CSS (css)

Which translates to ORDER ID : SKU : +/- QUANTITY TO ADJUST : STOCK ID

Each one can be fixed by running the create-compensations cli command, e.g.:

bin/magento inventory:reservation:create-compensations 172:bike-123:+2.000000:1

And you can chain multiple fixes in to one command just by putting a space between the compensations you want to create, e.g.:

bin/magento inventory:reservation:create-compensations 172:bike-123:+2.000000:1 173:bike-123:+2.000000:1 174:bike-123:+2.000000:1 etc...

NB – If your SKU’s contain spaces, brackets, ampersands or other special characters you’ll have to escape them with , e.g. “MY\ SKU”.

BUT A WORD OF WARNING ON THIS.

Every time I have run the list-inconsistencies command I have had it report the some of the same inconsistencies multiple times, i.e. it will show multiple records of the same order ID, SKU and quantity to compensate for some orders (but not all). I don’t know if this is because of the sites I’ve worked on or if it’s a Magento bug. If you follow the official documentation it will show you a one-line command that lists the inconsistencies and then fixes them. I would recommend you don’t do this. If you do have more than one of the same inconsistency and you run the fixes you’ll end up going the other way and overcompensating, potentially by a lot.

Instead, I’d output the inconsistencies to a file:

bin/magento inventory:reservation:list-inconsistencies -r > inconsistencies.csv
Code language: PHP (php)

Then open it in something like Excel and de-duplicate the column. You can then safely run the create-compensations command with this list of unique compensations and voila, your inventory reservations table is up to date.