How to restrict user access to records in Odoo
Add a record rule to the user's Access Profile scoping which records they can see — their own, their team's, one company's, or a custom condition on the record itself. This is separate from model and field permissions: a user can be fully allowed to open a model and still be restricted to a subset of its records.
Decide the scope
Own records, manager-chain ('own + subordinates'), company, or a custom field match.
Apply it to the profile
Combine with model and field rules as needed — the layers stack.
Check it holds in reports
Record restrictions should apply in pivot and graph views too, not just lists.
Pick a scope before you write a domain
Own records: salesperson sees their pipeline. Own + subordinates: a manager sees the team. One company: the local entity. Custom: a tag, a team_id, a warehouse. Those are the four conversations. A raw domain is for the fifth. Record rules without code is how you compile them without XML.
This is not a hidden menu and not a filter on one list. Odoo’s record rules apply to read, write, create, unlink — and to reports if they are real rules.
If the pivot is wrong, the rule is wrong
Open the sales analysis or invoice pivot as that user. If other people’s documents inflate the total, you have a list filter. Multi-company is where this bites — multi-company access control.
Also test the URL of a record they should not see, and an API search_read with no domain. The rule must still constrain the result.
Rules stack with model and field rights
A user can be allowed on sale.order, blocked from margin, and limited to their own rows. Three layers, one profile. Do not create a new group for each layer. Limit employee permissions is the overview; this page is the row layer.
Global ir.rule experiments belong on staging. A broken global rule is a company-wide outage. Named profiles with an exempt admin are how you avoid that.
The rest of the cluster
Before you set it up
Is a record rule the same as hiding a menu?
No. Menus are navigation. Record rules decide which rows exist for that user after they are allowed on the model. Odoo record rules · Menu vs model.
What scopes are typical?
Own records, manager-chain, one company, or a custom domain. Record rules without code.
Do these rules hold in reports?
They should, including pivot and graph totals. If a total still includes other people’s rows, you have a filter, not a rule. Multi-company access.
Ready to lock this down?
Try it on the live sandbox first — nothing to install.