Expenses¶
1. Purpose¶
Expenses handles money staff spend on the company's behalf — travel, fuel, meals, small purchases — and the process of claiming it back. An employee records what they spent, a manager approves it, and accounting posts it and reimburses.
It matters because these costs otherwise arrive as a pile of receipts with no approval trail and no reliable cost centre, and they are exactly the costs a client most wants visibility over.
2. Features¶
- Expense records against an expense product, carrying amount, date and description
- Receipt attachment on each expense, including by email to an alias
- Expense reports grouping several expenses into one submission
- Approval workflow — submitted, approved by manager, posted by accounting, paid
- Two payment modes: paid by the employee and reimbursed, or paid directly by the company
- Posting to the correct expense account, taken from the expense product
- Analytic distribution, so expenses land on the right cost centre or department
- Reimbursement through a normal accounting payment
- Reporting by employee, category, department and period
- Multi-currency expenses
3. Where to find it¶
- Menu: Expenses → My Expenses / Expense Reports / Configuration
- Technical name:
hr_expense - Tier: Odoo core (Community Edition)
- Available in: Odoo 17 and 18 in our stack
4. Modules used¶
| Module | Tier | Why it is needed |
|---|---|---|
hr_expense |
Odoo core | Expenses, expense reports, the approval workflow |
hr |
Odoo core | The employee claiming, and their manager for approval |
account |
Odoo core | Posting the expense and paying the reimbursement |
analytic |
Odoo core | Cost-centre allocation of expenses |
hr_multi_company |
Third-party (Cybrosys) | Expense handling across companies |
ohrms_core |
Third-party (Cybrosys) | Pulls hr_expense into the OpenHRMS suite |
NestERP custom modules that build on Expenses¶
| Module | Odoo version | What it adds |
|---|---|---|
thalia_mgmt_dashboard_v17 |
17 | Expense figures in the consolidated management dashboard |
direct_budget_management |
17 | Budget comparison that expenses count against |
5. Configuration¶
- Prerequisite — employees must exist with a manager set. The manager is the approver; without one, submitted expenses have nobody to approve them.
- Create expense products — Expenses → Configuration → Expense Products. One per expense category: fuel, travel, accommodation, meals, stationery. Each carries the expense account it posts to, its cost, and its taxes.
- Decide the cost basis per product — a fixed unit cost (per kilometre, per night) or an amount the employee enters.
- Set the reimbursement journal and payment method in Accounting.
- Configure the email alias if the client wants employees to submit receipts by email.
- Enable analytic accounting and create the analytic accounts if expenses must be attributed to departments, branches or projects.
- Confirm the approval chain — by default the employee's manager approves and an Expense Administrator posts.
Configuration traps
- The expense account comes from the expense product. A generic "Expenses" product dumps everything into one account and destroys the point of the exercise.
- An employee with no manager cannot get approval. The report sits submitted indefinitely.
- "Paid by company" versus "paid by employee" changes the accounting entirely — one creates a payable to the employee, the other does not. Setting it wrongly produces reimbursements for money the company already spent.
- Analytic distribution is not mandatory by default, so cost-centre reporting quietly has gaps unless it is enforced.
6. How it's used¶
- Employee — Expenses → My Expenses → New. Selects the expense product, enters the amount and date, attaches the receipt.
- Employee — groups expenses into a report and clicks Submit to Manager.
- Manager — reviews and Approves, or refuses with a reason.
- Accountant — Posts Journal Entries. The expense hits the expense account and, if paid by the employee, creates a payable to them.
- Accountant — Registers Payment to reimburse the employee.
Screenshots needed
Save to docs/assets/expenses/: My Expenses list · an expense with a receipt attached · an
expense report awaiting approval · expense products configuration · a posted journal entry
from an expense.
7. Access rights¶
| Group | Can do |
|---|---|
| Expenses / Employee | Create and submit their own expenses |
| Expenses / Team Approver | Approve expenses for their team |
| Expenses / Administrator | Approve, post and configure expense products |
An employee sees only their own expenses. Managers see their team's. Posting requires accounting rights in addition to expense rights.
8. Version differences (16 / 17 / 18)¶
- Not part of our Odoo 16 line —
hr_expenseis not a dependency of any Odoo 16 module in the NestERP stack.
attrsandstatesremoved from views.- Pulled in by
ohrms_core,hr_multi_companyandthalia_mgmt_dashboard_v17.
<tree>elements superseded by<list>.hr_expensewas added tohrms_dashboard's dependencies on 18, where it was absent on 17 — so the dashboard now requires Expenses to be installed.
9. Known limitations¶
- No mobile receipt scanning / OCR. Odoo's expense digitisation is Enterprise. Employees type amounts by hand.
- No per-category spending limits or policy enforcement in core — nothing stops a claim exceeding a policy the client has on paper.
- No mileage tracking beyond a unit-cost product.
- No corporate card statement import and matching.
- Approval is single-stage — the manager, then accounting. There is no multi-level chain like the one we built for purchasing.
- No budget check at submission time. Overspend is visible after posting, not prevented at claim.
Needs verification on the Thalia live instance
- Whether Expenses is actually used, or expenses are entered directly as vendor bills
- Which expense products exist and which accounts they post to
- Whether every employee has a manager set for approval
- Whether the email-alias submission route is configured
- Whether analytic distribution is applied to expenses
- The reimbursement journal and payment method in use