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 case | Employee pays with their own card or cash | Company credit card, company UPI, petty cash |
| What posting creates | A purchase receipt in the Employee Expense Journal, payable to the employee's work contact | A payment from the chosen payment method, with no payable to the employee |
| How it is settled | Register a payment (bank transfer), or add it to the next payslip | Already paid; reconcile with the card or bank statement |
| Settings involved | Employee Expense Journal | Payment 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.
- Decide which categories are ever billable, usually travel, accommodation and mileage for service companies.
- Set those to At cost (or Sales price if your contracts mark up expenses) and leave the rest at No.
- Make sure consultants know which sales order to pick, or set analytic distribution to the project so finance can check.
- 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
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.