Guide · Invoicing

Invoicing timesheets in Odoo: from time entry to invoice

If you bill by the hour, you want every hour worked on the invoice, and nothing twice. Odoo does that in Community too, with a service product invoiced based on timesheets. How to set it up, where it goes wrong in practice, and what TimeViking adds.

Updated on · by the TimeViking team

How Odoo invoices time

In Odoo, a timesheet line is an analytic line on a project, optionally with a task. Invoicing doesn't happen on the line itself but through a sales order:

  1. a service product with the invoicing policy "Based on Timesheets";
  2. a confirmed sales order with that product;
  3. a project or task linked to the order line;
  4. timesheet lines on that project or task, which automatically get the sales order item;
  5. an invoice for the delivered hours not invoiced yet.

That lives in the module sale_timesheet, which Odoo installs as soon as you use Sales and Timesheets together. It is Community: we checked it in the source code of Odoo 18, 19 and 20.

Say an IT consultancy implements a system for a logistics customer on a time-and-materials budget. The quotation becomes a sales order, the tasks go into a project, and every Friday the project manager sees on the sales order how many hours have been delivered so far.

How to set it up

  1. Create a service product invoiced on timesheets

    In Sales: a product of type Service, with the invoicing policy Based on Timesheets and, under Create on Order, a task or a project. Set your hourly rate.

  2. Confirm a sales order

    Create a quotation for the customer with that product and the estimated hours, and confirm it. Odoo creates the project or task and links it to the order line.

  3. Have your team log time on that task

    Every timesheet line on the project or task gets the sales order item. The Delivered column on the sales order adds up the hours.

  4. Review the hours

    In Timesheets, filter on the project and the period, and check that every line has a sales order item. Lines without one don't make it to the invoice.

  5. Create the invoice

    On the sales order: Create Invoice. Odoo takes the delivered hours that haven't been invoiced yet. Once the invoice is posted, those timesheet lines are locked.

Three ways to price a project

On a billable project you choose in Odoo how hours get a price (the Pricing field):

OptionWhen
Task rateEach task is linked to its own order line. Handy when you sell different services to different customers.
Project rateOne hourly rate for the whole project, whoever does the work.
Employee rateThe same work at a different rate per person, for example junior and senior. You map an order line per employee.

On each timesheet line Odoo also sets a billable type: billed on timesheets, at a fixed price, on milestones, manually, or non-billable. In the Timesheets reports you group on it to see which share of the hours actually becomes revenue.

Where it goes wrong in practice

The same questions keep coming back on the Odoo forum. Most have the same cause: a timesheet line that isn't linked to the sales order item.

  • The project was created by hand. Then it has no order line, and the hours never reach the invoice. Link the project or task to a sales order item afterwards.
  • The invoicing policy was changed afterwards. Odoo doesn't apply that retroactively to existing lines.
  • Someone logged time on the wrong task. A task without an order line, or an internal task, doesn't count.
  • The sales order isn't confirmed. Only after confirmation does Odoo create the project and the link.
Tip: show the Sales Order Item column in the Timesheets list. An empty cell is an hour you won't invoice.

Invoiced hours are locked

Once a timesheet line is on a posted invoice, Odoo no longer lets you delete it ("You cannot remove a timesheet that has already been invoiced"), not even as an administrator. If something must change, cancel the invoice or issue a credit note. In Odoo 18 and 19 the invoice field is called timesheet_invoice_id, in 20 reinvoice_move_id; the behaviour is the same.

What TimeViking adds

TimeViking doesn't create invoices: that stays in Odoo. What it does is make sure the hours are in there on time and in the right place.

  • Hours on the right task. Your team picks a project and task from Odoo, on the phone too. Odoo links the line to the task's sales order item itself, just like a line entered in Odoo.
  • Before the invoice goes out: weekly approval. The project manager sees each person's submitted hours and the billable share, and sends a week back if something is off. See approving timesheets in Odoo.
  • Billable hours and their value per project, customer or person, with export to Excel and CSV.
  • Invoiced lines are left alone. If a line is on an invoice, the app doesn't change or delete it and tells you why.

Read more about the connection on the Odoo integration page; what it costs, on pricing.

Try TimeViking with your own Odoo.

Free for teams of up to 3 users, forever. Larger teams get a 30-day free trial, no card needed.

Frequently asked questions

Can I invoice timesheets in Odoo Community?

Yes. The module sale_timesheet (Sales and Timesheets together) is Community, LGPL-3, in Odoo 18, 19 and 20. You don't need Enterprise for it.

Why don't the delivered hours on my sales order match the timesheets?

Usually some timesheet lines aren't linked to the sales order item: the project was created by hand, or the task has no item. Show the Sales Order Item column in the Timesheets list and filter on empty values. Odoo also doesn't apply an invoicing policy you change afterwards retroactively.

Can I still change an invoiced timesheet line?

Not once the invoice is posted: Odoo then refuses deletion too. Cancel the invoice or issue a credit note. TimeViking doesn't try to force such a line and shows why it's locked.

Does TimeViking invoice by itself?

No. You create invoices in Odoo. TimeViking puts the hours in Odoo, on the right project and task, so Odoo can link them to the sales order. In the app you see billable hours and their value per project, and export them to Excel.

More guides