Skip to content

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

  1. Prerequisite — employees must exist with a manager set. The manager is the approver; without one, submitted expenses have nobody to approve them.
  2. 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.
  3. Decide the cost basis per product — a fixed unit cost (per kilometre, per night) or an amount the employee enters.
  4. Set the reimbursement journal and payment method in Accounting.
  5. Configure the email alias if the client wants employees to submit receipts by email.
  6. Enable analytic accounting and create the analytic accounts if expenses must be attributed to departments, branches or projects.
  7. 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

  1. Employee — Expenses → My Expenses → New. Selects the expense product, enters the amount and date, attaches the receipt.
  2. Employee — groups expenses into a report and clicks Submit to Manager.
  3. Manager — reviews and Approves, or refuses with a reason.
  4. AccountantPosts Journal Entries. The expense hits the expense account and, if paid by the employee, creates a payable to them.
  5. AccountantRegisters 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_expense is not a dependency of any Odoo 16 module in the NestERP stack.
  • attrs and states removed from views.
  • Pulled in by ohrms_core, hr_multi_company and thalia_mgmt_dashboard_v17.
  • <tree> elements superseded by <list>.
  • hr_expense was added to hrms_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