All posts
General8 min read

Odoo for service companies: projects, timesheets, invoicing, and the project-to-cash flow

Service companies - consulting firms, agencies, IT services - need ERP that handles project planning, timesheet capture, and invoice generation in one flow. Odoo's Project + Timesheets + Invoicing stack covers this end-to-end. This guide explains how the modules connect, how billing methods work, and what to configure before you start tracking time.

The Service Company Stack#

Odoo serves service businesses through four connected modules:

  • Project: project and task management with stages, deadlines, and team assignments
  • Timesheets: time logging linked to projects and tasks
  • Sales: sale orders that define what was sold and at what rate
  • Invoicing / Accounting: invoices generated from timesheets or milestones

The integration between these modules is what makes Odoo compelling for service companies. A sale order links to a project; timesheets post to project tasks; invoices pull from timesheet totals. No manual data transfer between systems.


Setting Up the Project-to-Cash Flow#

Step 1: Sale Order with Service Product#

Create a product of type Service with a billing policy:

  • Based on Timesheets: the invoice is generated from actual hours logged
  • Based on Milestones: the invoice is generated when project milestones are marked complete
  • Fixed Price: the invoice is generated for the full sale order amount, regardless of time

Set the product's Create Task field to automatically generate a project task when the sale order is confirmed.

Step 2: Confirm the Sale Order#

Confirming the sale order:

  • Creates a task (or project) linked to the sale order line
  • Sets the budgeted hours from the quantity on the sale order line
  • Enables timesheet logging against the project/task

Step 3: Log Timesheets#

Team members log time from Timesheets → My Timesheets or from within the task. Each timesheet entry links to the project, task, employee, date, and hours.

Managers view all timesheets from Timesheets → All Timesheets filtered by project or employee.

Step 4: Invoice#

For timesheet-billed projects, go to the sale order → Invoice button. Odoo generates an invoice for the hours logged since the last invoice. You can invoice in full or choose a specific date range.

For milestone projects, mark milestones as achieved on the project → an invoice becomes available for that milestone amount.


Project Structure#

Projects and Tasks#

A Project is a container with:

  • Customer and sale order link
  • Stage pipeline (e.g., Planning → In Progress → QA → Done)
  • Team members
  • Budgeted hours (from sale order quantity)
  • Deadline

Tasks live inside projects and are the unit of work:

  • Assignee (person doing the work)
  • Estimated hours (subset of project budget)
  • Deadline
  • Stage (within the project pipeline)
  • Timesheets linked directly to the task

Sub-tasks#

Tasks can have sub-tasks for breaking down complex deliverables. Timesheet hours on sub-tasks roll up to the parent task and the project total.


Billing Methods in Detail#

Timesheet Billing (Time and Materials)#

The customer is billed for actual hours at the configured rate. The sale order line quantity represents the estimated hours. If the actual hours exceed the estimate, the customer is billed for the overrun unless you set an invoice limit.

Set the employee's billing rate on the sale order line (or use a product with a fixed sales price as the hourly rate).

Fixed-Price Billing#

The customer is billed for the agreed amount regardless of hours. Timesheets are still logged for internal cost tracking, but they do not affect the invoice amount. Useful for fixed-scope projects.

Milestone Billing#

Define milestones on the project (e.g., "Design complete", "Development complete", "Go-live"). Each milestone has a value (absolute amount or percentage of the total). When marked achieved, the corresponding invoice becomes available. This matches the payment schedule in many consulting contracts.


Profitability Reporting#

Odoo tracks project profitability by comparing:

  • Revenue: total invoiced or invoiceable amount from sale orders
  • Cost: employee timesheets × employee cost rate (set in the employee record under Settings → Cost)

View profitability from Project → (open project) → Profitability smart button. This shows billed vs budgeted hours and gross margin per project.

For the cost calculation to work, set employee hourly costs in the employee record. Without this, Odoo shows zero labor cost and profitability is misleading.


Timesheet Approval Workflow#

Enable timesheet approval in Timesheets → Configuration → Settings → Timesheets Validation.

When enabled:

  • Employees submit their timesheets at period end
  • Managers review and approve or reject
  • Approved timesheets are locked against further edits
  • Only approved timesheets count toward billable hours

Reporting#

Key reports for service companies:

  • Timesheet Analysis: hours by employee, project, task, customer, and date range
  • Project Profitability: revenue vs. cost per project
  • Employee Utilization: billable vs. non-billable hours per employee
  • Uninvoiced Timesheets: hours logged but not yet invoiced (useful for cash flow visibility)

Access from Timesheets → Reporting and Project → Reporting.


Common Gaps in Service Company Implementations#

No employee cost rate set#

Without employee hourly costs, profitability reports show incorrect margin. Set costs for all employees who log billable time before go-live.

Sale order not linked to project#

If timesheets are logged to a project that is not linked to a sale order, those hours are not invoiceable. Ensure every billable project has a confirmed sale order with the correct billing policy.

Timesheet descriptions lost on invoice#

By default, Odoo aggregates timesheets into a single invoice line with the total hours. If customers need line-level detail, enable Timesheets → Settings → Invoice based on Timesheets → Include timesheets details to generate one invoice line per timesheet entry.

Milestone marked done before deliverable is reviewed#

Milestones trigger invoicing immediately when marked achieved. Ensure your internal review process happens before the milestone is marked - or add an approval step.


ERPeek can audit your Odoo project and timesheet configuration - verifying that all billable projects are linked to sale orders, that employee cost rates are set, and that billing policies match your contract types. See the contact page for details.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free