Skip to content

Invoice project work from a sales order

Quick summary: The service product on a sales order determines what becomes invoiceable. Choose timesheets, an upfront fixed quantity, manual delivery, or milestones before confirming the order, then invoice only the quantity that the chosen method makes available.


Open products in Odoo

Your Odoo address

Enter the base address of your Odoo instance. It will be stored only in this browser.

The documentation does not receive your address, username, or password.

Open the service product and set Create on Order to the project/task workflow you need. Then choose Invoicing Policy:

Invoicing policy What becomes invoiceable Best suited to
Based on Timesheets Billable hours recorded against the sales order item Time-and-material services
Prepaid/Fixed Price The ordered quantity when the sales order is confirmed An agreed amount billed upfront or as a fixed price
Based on Delivered Quantity (Manual) The Delivered quantity entered manually on the sales order item Approved partial delivery that is not measured by hours or milestones
Based on Milestones The quantity or percentage assigned to milestones marked Reached Fixed-price work billed at agreed progress points

Do not change the method on an active order without first checking existing delivered quantities, timesheets, milestones, and invoices. For a new commercial arrangement, a separate order line is usually clearer than rewriting the history of an invoiced line.

Open sales orders in Odoo

Your Odoo address

Enter the base address of your Odoo instance. It will be stored only in this browser.

The documentation does not receive your address, username, or password.

  1. Add the configured service to the quotation. Check the quantity, unit, price, taxes, and customer-facing description.
  2. Confirm the quotation only after acceptance. Depending on Create on Order, Odoo creates or links a project and/or task.
  3. Open the generated project or task from the sales order. Check the customer and Sales Order Item before work is recorded.
  4. On the sales order, compare the ordered, Delivered, and invoiced quantities. The difference between delivered and already invoiced quantities is what can normally be put on the next regular invoice.
  1. Record time on the task and check each entry’s date, duration, description, and Sales Order Item. Follow the timesheet guide for entry and review.
  2. Return to the sales order. Hours linked to a Based on Timesheets line increase that line’s Delivered quantity.
  3. Click Create Invoice, choose the regular invoice for delivered items, and use Timesheets Period when you need to invoice only unbilled eligible entries within a date range.
  4. Review the draft invoice quantity and the included timesheets before posting it. An invoiced timesheet can no longer be freely reassigned or edited.

Charge one timesheet to a different order item

Section titled “Charge one timesheet to a different order item”

Odoo normally derives a timesheet’s Sales Order Item from its task, project, or employee-rate mapping. An individual entry can use another eligible item for the same customer even when the task is linked elsewhere.

  1. Open the task’s Timesheets tab or open the entry in Timesheets.
  2. Show the Sales Order Item column if it is hidden.
  3. On the individual, not-yet-invoiced entry, choose the intended sales order item. This manual choice overrides the automatically derived item for that entry; it does not change the task’s own link or the other entries.
  4. Recheck Delivered on both affected order lines before creating the invoice.

If the intended item is unavailable, check that it is an eligible service line for the same commercial customer and that the project is billable. Choose a Based on Timesheets item when the entry should be billed by the hour; linking it to a fixed-price, manual, or milestone item does not turn that item into hourly billing. Do not move an already invoiced entry; correct the invoice through the authorized accounting process.

For Prepaid/Fixed Price, confirming the sales order makes its ordered quantity invoiceable. Open the order, click Create Invoice, and review the draft against the agreed fixed amount. Timesheets can still measure effort and profitability, but they do not change the invoiceable quantity of this line.

If only part of a fixed price should become due later, do not improvise by changing worked hours. Use separate order lines, an agreed deposit workflow, or milestones that represent the commercial schedule.

For Based on Delivered Quantity (Manual), an authorized user enters the approved amount directly in Delivered on the sales order item. Save, confirm the quantity now due, and create the regular invoice. Record the acceptance or approval in the task or order chatter so the reason for the manual quantity remains visible.

Never use a manual delivered quantity to duplicate hours or a milestone already made invoiceable. Check Delivered and already invoiced quantities before every update.

  1. Open Milestones from the project or sales order. For each milestone, check its Sales Order Item, Quantity (%) or quantity, and deadline. The milestones for an order line should represent the agreed billing allocation.
  2. Complete and obtain acceptance for the milestone according to the contract.
  3. Mark only that milestone Reached. Odoo adds its assigned share to Delivered on the linked sales order item; completing a task or moving a stage does not do this by itself.
  4. Return to the sales order, verify Delivered, and create and review the draft invoice.

If milestone percentages overlap or exceed the intended total, the delivered quantity and invoice will be wrong. Correct the allocation before marking milestones reached.

On a recurring subscription with a Based on Timesheets line, Delivered is period-specific rather than a cumulative backlog. Odoo counts uninvoiced eligible entries from the subscription’s last invoice date (or start date) up to, but not including, Next Invoice Date.

This makes backdated or multi-period billing easy to misread: widening Timesheets Period does not necessarily combine several subscription periods into one delivered quantity. If more than one period is outstanding, invoice chronologically, one subscription period at a time. Review and post each invoice through the normal accounting workflow so Next Invoice Date advances, then recheck Delivered and the included entries before creating the next invoice. Do not move the date forward merely to expose later hours without first resolving the earlier period, and do not post early while valid timesheets for that period are still missing.

The sales order retains the commercial basis for billing, while the linked project records execution. Each invoice can be traced to the ordered quantity, approved manual delivery, reached milestones, or specific timesheets.

  • Nothing to invoice: check the line’s invoicing policy, Delivered, existing draft invoices, milestone status, timesheet dates, and Sales Order Item links.
  • Hours appear on the wrong line: correct Sales Order Item on each uninvoiced timesheet; changing only the task’s default does not rewrite manual choices on individual entries.
  • Hours are recorded but absent from a subscription line: compare their dates with the last invoice/start date and Next Invoice Date, then process outstanding periods in order.
  • A fixed-price line follows hours: verify that the product uses Prepaid/Fixed Price, not Based on Timesheets.
  • A milestone did not change delivery: check that it is Reached, linked to the correct sales order item, and assigned a nonzero quantity or percentage.

See Odoo 19 time-and-material invoicing and milestone invoicing.