Stock Restrictions
& Controls
Give your business complete control over every stock operation. Block bad habits, enforce process, protect your inventory data — with 12 independent restrictions and a full audit trail.
Stock Errors Cost Real Money
Without controls, any user can create receipts without a PO, validate wrong quantities, or backdate operations — and by the time you notice, the damage is done.
Receipts created without a Purchase Order
Inventory gets updated with no traceability, no approval, and no matching purchase record.
Wrong quantities validated
Users receive 150 units when 100 were ordered — stock valuation is wrong before anyone notices.
Backdated operations
Dates are changed retroactively, corrupting your stock history and making audits unreliable.
Deliveries from unregistered vendors
Products received from suppliers not on your approved list, bypassing procurement controls.
Negative stock
Deliveries processed when there's nothing in stock — creating phantom inventory that doesn't exist.
No record of who tried what
When something goes wrong you have no log of which user attempted the blocked operation.
Stock Restrictions & Controls puts a configurable enforcement layer over every stock operation. Turn on only the restrictions you need — each one is fully independent. Admins always bypass everything. Inventory Managers bypass user-level controls. Every blocked attempt is logged with who, when, and what they tried.
Admin Always Wins. No Exceptions.
Administrators bypass every single restriction — automatically
Any Odoo user with the Administrator role bypasses all 12 restrictions with zero exceptions.
No configuration needed — it's built into the core logic.
Inventory Managers bypass the three user-control restrictions (validate, cancel, delete) but are still subject to quantity controls, stock controls, and vendor controls — unless they are also Administrators.
Regular users are subject to whatever restrictions are enabled in settings.
The Stock Restrictions section is only visible to Inventory Managers and Administrators. Regular users cannot access or modify any restriction settings.
12 Controls. Every Toggle Independent.
Turn on only what your business needs. Enabling one restriction never affects another. Each fires its own clear error message with actionable instructions.
Block manual receipts without a Purchase Order
Receipts must always be created from a PO. Anyone trying to create one manually gets a clear error with exact navigation instructions on where to go instead.
Block manual deliveries without a Sales Order
Deliveries must always be created from a SO. Prevents loose, untracked deliveries from slipping through without a source document.
Block over-validation of quantities
Cannot validate more than the demanded quantity. The error shows exactly: product, demanded qty, done qty, and maximum allowed.
Block under-validation of quantities
Cannot validate less than the demanded quantity. Forces full processing — no partial sneaking through without manager involvement.
Configurable tolerance % for over/under
Set a tolerance that applies to both over and under validation. Example: 5% means ±5% of demanded qty is allowed. Set to 0 for strict enforcement.
Block zero-quantity validation
Cannot validate an operation where done quantity is 0. Stops accidental empty validations that corrupt stock records.
Block negative stock on deliveries
Deliveries that would push stock below zero are blocked. The error clearly shows: product, current stock, and what was attempted.
Block backdating stock operations
Scheduled dates cannot be set to a date in the past. Protects the integrity of your stock history from retroactive manipulation.
Only Inventory Managers can validate operations
Regular warehouse users cannot click Validate. All validation must be done by an Inventory Manager or Administrator.
Only Inventory Managers can cancel validated operations
Once a picking is Done, regular users cannot cancel it. Prevents unauthorised reversal of completed stock operations.
Only Inventory Managers can delete draft operations
Draft pickings cannot be deleted by regular users. Prevents accidental or intentional removal of pending operations.
Block receiving from unregistered vendors
Receipts from vendors not on the product's approved vendor list are blocked at validation. Enforces your procurement policy automatically.
Restriction Audit Log
When enabled, every blocked attempt is recorded with the user's name, timestamp, operation reference, restriction triggered, and full details. Admin bypasses are recorded separately and highlighted. View it under Inventory → Configuration → Restriction Audit Log.
Real Results from a Live Database
Every screenshot below is taken from an actual Odoo 16 installation during testing. No mockups.
The Stock Restrictions Settings Panel
All 12 restrictions organised into clear sections. Enable only what you need — each toggle is fully independent. Accessible from Inventory → Configuration → Settings → Stock Restrictions.

Clear, Actionable Error Messages for Every Restriction
Every restriction shows a detailed error — not just "not allowed" but exactly what went wrong, the product name, the quantities involved, and what the user should do instead.
Block Manual Receipt

Block Over-Validation

Block Under-Validation

Block Negative Stock

Block Unregistered Vendor

Block Backdating

User Controls Work Per Role
When "Only Inventory Managers can validate" is enabled, regular users see this error. Inventory Managers and Administrators validate without any restriction.

Complete Restriction Audit Trail
The audit log captures every event — blocked attempts show the exact user who tried, the restriction that fired, the operation reference, and full details. Administrator bypasses are highlighted separately.

Common Questions
Where do I find the restriction settings?
Go to Inventory → Configuration → Settings and scroll to the Stock Restrictions section. This section is only visible to Inventory Managers and Administrators — regular users cannot see or change any settings.
Does the Administrator really bypass everything?
Yes — absolutely every restriction, with no exceptions. Any Odoo user with the Administrator role (Settings/Technical access) bypasses all 12 restrictions automatically. This is by design so your system admin always retains full operational control. Their bypass actions are still recorded in the audit log when it is enabled.
What about Inventory Managers?
Inventory Managers bypass the three User Control restrictions — validate, cancel, and delete. However, they are still subject to quantity controls (over, under, zero), stock controls (negative, backdate), and vendor controls — unless they are also Administrators.
Can I enable just one or two restrictions?
Yes. Every restriction is completely independent. You can enable only the ones you need — for example, just "Block negative stock" and "Block zero-quantity" while leaving everything else off. There is no minimum required.
What does the tolerance % do exactly?
The tolerance applies to both over and under validation. For example, with a demanded quantity of 100 and 5% tolerance set:
- Over-validation: maximum allowed is 105
- Under-validation: minimum required is 95
Set tolerance to 0 for strict enforcement with no wiggle room.
Why does "Under-validation" also block the Inventory Manager?
Quantity controls apply to everyone except Administrators. An Inventory Manager shouldn't be able to receive the wrong quantity any more than a regular user. If a Manager needs to bypass a quantity restriction, they should use an Administrator account for that specific operation.
How does the audit log work?
Enable it in Settings → Stock Restrictions → "Enable restriction audit log". After that, every blocked attempt is recorded with the user, timestamp, restriction name, operation reference, and details. Go to Inventory → Configuration → Restriction Audit Log to view it. Administrator bypasses are highlighted in amber so you can tell them apart from genuine violations.
Does it slow down my Odoo instance?
No. The restrictions only run lightweight checks — a config parameter read and simple comparisons. The audit log only fires when a restriction is triggered, not on every operation. Performance impact is negligible even in high-volume warehouses.
Is it compatible with Odoo 16 Community and Enterprise?
Yes. The module is built and tested on Odoo 16.0 and works on both Community and Enterprise editions.
Does it work in multi-company setups?
Yes. All restriction settings are stored per-company via Odoo's standard config parameter system. Each company's users see and apply only their own company's restriction settings.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module