We don't recommend this.
Allowing negative inventory (with good monitoring) reveals problems that need fixing—like mismatched transactions, theft, or process lags. If you block users, some issues may just get hidden instead of addressed.
If negative inventory is disallowed, users may:
-
Start inflating inventory with fake Receipts
-
Delay validating transfers in Odoo
- Create unnecessary inventory adjustments
- Adjust transfers to the quantity available but ship the original quantity requested
-
Might ship or transact using similar or incorrect SKUs
- Give up on Odoo and use manual or shadow systems
Each of these makes reconciliation even harder and introduces audit/compliance risks.
Your Users are smart, empower them with good tools and get out of their way. Train them on what to do when inventory goes negative and create robust processes to resolve the issues it uncovers.
This is not a complete solution but a prototype. Work with your Odoo Digital Advisor or Odoo Partner if you don't have the skills to create this yourself and to ensure it does not need modifications to work in your database.
1) In Developer Mode, visit Settings --> Technical --> Automation --> Automation Rules
2) Create an Automation Rule like this:

3) Add an Action of type Execute Code like this:

accuracy = env["decimal.precision"].precision_get("Product Unit of Measure")
for record in records:
diff = round(record.quantity, accuracy)
if (diff < 0 and record.product_id.is_storable and
record.location_id.usage in ["internal", "transit"]):
raise UserError(f'You need {-diff} more {record.product_id.name}(s) to complete this Transfer!')
You will then see an blocking message like this:

Be ready to ARCHIVE this Automation Rule if it blocks Users from doing things they need to do.
Did you ever find a solution to this, Ricardo?