All posts
Functional5 min read

Billing Projects by Timesheet Hours in Odoo

Configure Odoo project billing to automatically generate invoices from timesheet entries - supporting fixed-price, time-and-materials, and milestone billing models for professional services.

Project Billing from Timesheets in Odoo#

Professional services firms bill clients based on hours worked, project milestones, or fixed prices. Odoo connects timesheets to invoices - eliminating manual billing preparation and ensuring every billable hour is captured.

Prerequisites#

Apps → Project and Timesheets → install.

Sale Order Billing Methods#

When creating a sale order line for a service product, choose the billing method:

  • Fixed Price: invoice the full amount at project start or milestone
  • Based on Timesheets: invoice based on actual hours logged
  • Based on Milestones: invoice when a milestone is reached

Time-and-Materials Billing Setup#

Product → General tab:

  • Product Type: Service
  • Invoicing Policy: Timesheets

Sale Order:

  • Product: Consulting Services
  • Price: $150/hour
  • Quantity: estimate (e.g., 40 hours)

When confirmed, a project task is created automatically. Employees log time on the task.

Logging Timesheets#

Timesheets → My Timesheets → New:

  • Date: 2027-10-14
  • Project: Customer Project
  • Task: Requirements Analysis
  • Hours: 3.5
  • Description: Interviewed 5 stakeholders, documented requirements

Or from the task itself:

Project → [Task] → Timesheets tab → Add a line.

Generating an Invoice from Timesheets#

Sale Order → Create Invoice:

  • Invoice what: Timesheets (unbilled hours only)
  • Odoo calculates: hours logged since last invoice × hourly rate = amount

The invoice includes a detail line per timesheet entry (or summarized, depending on configuration).

Fixed Price Billing with Timesheet Tracking#

Some clients want fixed price but you want to track hours for profitability:

Sale Order billing: Fixed Price (invoices 100% upfront or at milestones)

Project → Profitability tab: tracks hours logged vs. budgeted

At project close: actual hours × internal cost rate = cost of delivery → compare to fixed fee → margin analysis.

Milestone Billing#

Sale Order → Milestones:

  • Milestone 1: Requirements sign-off → bill 25% ($3,750)
  • Milestone 2: Development complete → bill 50% ($7,500)
  • Milestone 3: Go-live → bill 25% ($3,750)

When a milestone is marked complete:

Sale Order → Create Invoice → Milestone:

  • Select the completed milestone → invoice for that amount

Reporting on Project Profitability#

Project → Project → [Project] → Profitability:

  • Revenue billed vs. budgeted
  • Hours logged vs. estimated
  • Cost of hours (internal rate) vs. revenue (billable rate)
  • Gross margin %: (Revenue − Cost) / Revenue

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

Get started free