HADOOPT
TECHNOLOGIES
Schedule a Tech Consultation
Home
Services
Odoo ERP implementation Rollout, custom modules, migration and support. Web application development SaaS products, portals and internal platforms. Mobile application development Offline-first field apps and customer apps. AI development & automation LLM assistants, document processing, forecasting. Odoo version upgrades ↗ Move to a newer release, scoped and priced on its own site.
Products
OrgExp ↗ Budget, CAPEX and OPEX management.
Blog About Contact Schedule a Tech Consultation
Blog / Odoo 19: Complete Guide for Businesses
Odoo 19 6 min read

Employee expenses and reimbursements in Odoo 19

How Odoo 19 Expenses works without expense reports: categories, receipts, approvals, employee-paid versus company-paid, and re-invoicing customers.

· ERP practice 22 Sep 2026

Odoo 19 Expenses is a Community app where each expense is approved, posted and paid on its own: the expense report (expense sheet) of earlier versions is gone. An employee records the expense with its receipt, chooses whether they or the company paid, and submits it; the approver approves, accounting posts it, and employee-paid expenses are reimbursed by bank payment or, with Enterprise Payroll, through the payslip. Get categories, approvers and the expense journal right first; everything else follows.

What changed in Odoo 19: no more expense reports

Up to Odoo 18, expenses were grouped into an expense report that moved through approval and posting as one unit. In 19.0 the hr.expense.sheet model is gone and only a "Former Report" reference remains on migrated expenses. Each expense now carries its own status: Draft, Submitted, Approved, Posted, In Payment, Paid, or Refused.

In practice this is simpler for approvers, who see a list of items instead of opening reports, and for employees, who no longer have to remember to bundle claims. The trade-off is volume: a travelling sales team produces many small lines. Filters, grouping by employee, and approving in bulk from the list view become the working tools. If you are upgrading from 17 or 18, tell finance before go-live that the report they used to print and sign no longer exists in that form.

Expense categories

An expense category (Expenses > Configuration > Expense Categories) is a product that can be expensed. It carries the expense account, the default taxes and, optionally, a fixed cost. A fresh database has six: Meals, Travel & Accommodation, Mileage, Gifts, Communication and a general Expenses category.

Two patterns are worth knowing:

  • Fixed-cost categories. Mileage ships with a unit of measure of kilometres and a cost of 1.0 per unit. Set that to your per-km rate and employees just enter the distance. The same works for a fixed daily allowance.
  • Open categories. Leave the cost at zero and the employee enters the amount from the receipt.

Keep the list short and aligned with your chart of accounts. Ten categories that map cleanly to expense accounts are easier to report on than forty that finance has to reclassify. For Indian companies, decide per category whether you expect a GST invoice. Where you do, set the GST tax on the category and ask employees to record the vendor, so the input tax lands on the right account; where you usually do not (local travel, small meals), leave the tax off rather than claiming credit you cannot support.

Recording expenses and receipts

Employees record expenses from Expenses > My Expenses, the mobile app, or by email. The Incoming Emails setting gives an alias (expense@ by default); an employee forwards a receipt from their work email address and Odoo creates a draft expense with the attachment.

A few features stop common mistakes:

  • Duplicate warnings when the same receipt or a matching expense has already been submitted, which approvers then have to confirm.
  • Split Expense on a draft, for a hotel bill that covers room, meals and a client dinner in different categories.
  • Foreign currency amounts with the rate shown, so a USD hotel bill is converted to INR for reimbursement.

Expense Digitalization (OCR) reads details such as the amount and date from a photo of the receipt. It is Enterprise-only and uses IAP credits.

Approvals and who approves

Expenses has three access levels: Team Approver, All Approver and Administrator. When an expense is submitted, Odoo looks for the approver in this order: the employee's Expense Approver field, then the manager of their department (if that person is a Team Approver), then their own manager.

Approvers can approve or refuse with a reason. Refused expenses go back to the employee to correct and resubmit. After approval the expense waits for accounting: an accountant clicks Post Journal Entries, choosing the accounting date and, for employee-paid expenses, the journal.

Employee-paid versus company-paid

The Paid By field decides what the accounting looks like:

Employee (to reimburse)Company
Typical caseEmployee pays with their own card or cashCompany credit card, company UPI, petty cash
What posting createsA purchase receipt in the Employee Expense Journal, payable to the employee's work contactA payment from the chosen payment method, with no payable to the employee
How it is settledRegister a payment (bank transfer), or add it to the next payslipAlready paid; reconcile with the card or bank statement
Settings involvedEmployee Expense JournalPayment methods allowed for company expenses

For employee-paid expenses, the Reimburse in Payslip setting installs hr_payroll_expense (Enterprise, needs Payroll). Approved expenses then get Report in Next Payslip, and the Indian Regular Pay structure has an Expenses Reimbursement rule that picks them up. It saves a separate bank run each month, at the cost of employees waiting until payday.

Company expense cards through Stripe Issuing exist as a setting, but Stripe Issuing in 19.0 supports only USD, EUR and GBP journals, so it is not an option for INR accounts.

Re-invoicing expenses to customers

With Sales installed, the Sales Expense bridge (sale_expense, Community) installs itself. Each expense category gets a Re-Invoice Costs policy: No, At cost, or Sales price. On the expense, the employee or approver picks the Customer to Reinvoice, which is a sales order. When the expense is posted, a line is added to that sales order and invoiced with the next customer invoice.

  1. Decide which categories are ever billable, usually travel, accommodation and mileage for service companies.
  2. Set those to At cost (or Sales price if your contracts mark up expenses) and leave the rest at No.
  3. Make sure consultants know which sales order to pick, or set analytic distribution to the project so finance can check.
  4. Review the re-invoiced lines on the sales order before invoicing. If an expense is reset after posting, check that the sales order line has been corrected too.

With Projects installed, expenses can also carry the project's analytic distribution, which feeds project profitability reports. That is covered in projects and tasks later in the series.

Expenses > Configuration > Settings > Incoming Emails
Expenses > Configuration > Settings > Employee Expense Journal
Expenses > Configuration > Settings > Payment methods
Expenses > Configuration > Expense Categories
What to configure before the first claim

Next in the series is appraisals and skills. If your current process lives in spreadsheets and emailed receipts, we can help you move it.

Questions we get asked

Where are expense reports in Odoo 19?

They no longer exist. Odoo 19 removed the expense report (expense sheet) model, so each expense is submitted, approved, posted and paid individually, with its own status from Draft to Paid. Expenses migrated from earlier versions keep a reference to their former report. Approvers work from filtered list views, and can approve many expenses at once.

How are employee expenses reimbursed in Odoo 19?

When an employee-paid expense is posted, Odoo creates a purchase receipt payable to the employee's work contact in the Employee Expense Journal. Finance then registers a payment, typically a bank transfer, from the expense or from accounting. With Enterprise Payroll and the Reimburse in Payslip setting, approved expenses can instead be added to the employee's next payslip.

Can I bill employee expenses to a customer in Odoo 19?

Yes, if Sales is installed. Set the expense category's Re-Invoice Costs policy to At cost or Sales price, then choose the customer's sales order in the Customer to Reinvoice field on the expense. When the expense is posted, Odoo adds a line to that sales order, and it is billed with the next invoice for the order.

Is Odoo 19 Expenses free in Community?

Yes. Expenses, email submission, approvals, posting, payments and re-invoicing through Sales are all Community features. The Enterprise-only pieces are receipt scanning (Expense Digitalization, which uses IAP credits), product prediction from descriptions, and reimbursement through payslips, which needs Enterprise Payroll. Company expense cards through Stripe Issuing are limited to USD, EUR and GBP journals.

← Previous Running Indian payroll in Odoo 19: PF, ESI, PT and TDS Next → Appraisals, goals and skills in Odoo 19
Keep reading
Odoo 19 Setting up accounting in Odoo 19: localisation, chart of accounts and journals 6 min read Odoo 19 Bank reconciliation in Odoo 19: feeds, matching and rules 6 min read Odoo 19 Financial reports, assets and month-end closing in Odoo 19 6 min read