Flectic
Odoo AppsOdoo

Odoo Project Billing: Turning Billable Time Into Invoices

Odoo project billing links a sales order, the project it spawns, and timesheets on that project so validated hours or reached milestones become a draft invoice without re-keying. The service product’s Invoicing Policy decides whether you bill a fixed fee, hours worked, or milestones; analytic accounts keep revenue, cost, and margin on one ledger. Here is the full chain for SME services firms, including rate models, common leakage points, and how it compares to Dynamics 365 Project Operations.

14 min readUpdated Aug 3, 202615 sources cited

TL;DR — Key takeaways

  • Install Project and Accounting, then enable Analytic Accounting under Accounting settings, because no record shows on profitability without an analytic account.
  • Odoo project billing is the link between three apps that already exist in the suite: Sales, which holds the order the customer agreed to; Project, where the work is tracked as tasks and timesheets; and Invoicing or Accounting, where the invoice is posted to the ledger.
  • The cleanest way to understand Odoo project billing is to walk the chain in the order data actually moves.
  • The Invoicing Policy on the service product is the single decision that determines when a billable project earns revenue.
01Foundations

What Odoo project billing actually is

Odoo project billing is the link between three apps that already exist in the suite: Sales, which holds the order the customer agreed to; Project, where the work is tracked as tasks and timesheets; and Invoicing or Accounting, where the invoice is posted to the ledger. The point of the link is that the same record the consultant fills in (a timesheet line) is the record the finance team invoices from. There is no second billing spreadsheet and no end-of-month reconciliation between a time-tracking tool and the books.

The technical hinge is the service product. A product whose Product Type is set to Service can carry an Invoicing Policy such as Based on Timesheets or Based on Milestones, and a Create on Order setting that tells Odoo to spawn a project and task the moment a sales order is confirmed. That single product configuration is what makes a project billable end to end, because it is what ties the analytic account on the sales order to the analytic account on the project's timesheets.

Underneath it all sits the analytic account. Odoo's documentation is explicit that for any record to appear on the project profitability dashboard it must be linked to both the project and its analytic account, and that same account is what lets a single timesheet show up once as revenue (what the customer pays) and once as cost (what the employee earns) without doubling the books. Get the analytic account right and billing, margin, and cost reporting all read from one source of truth.

02The flow

The billable chain: sales order to invoice

The cleanest way to understand Odoo project billing is to walk the chain in the order data actually moves. It starts in Sales with a quotation for a service product configured to invoice Based on Timesheets and to create a Project and Task on order. The moment the quotation is confirmed, Odoo creates the sales order and, because of the Create on Order setting, automatically creates the matching project and task in the Project app. Two smart buttons on the order (Projects and Tasks) take you straight to them.

Work then happens where work always happens: on the task. Team members open the task's Timesheets tab and add lines for the date, the employee, and the hours spent. According to Odoo's time-and-materials documentation, those hours are immediately reflected back on the sales order in the Delivered column and in a Recorded Hours smart button. The delivery, not the order, is what makes the work billable, which is the whole difference between selling time and selling a fixed product.

Invoicing is the last step, not a separate process. From the sales order you click Create Invoice, choose Regular invoice, and Create Draft Invoice. Odoo writes a customer invoice draft pre-filled with the work delivered, and the Analytic Distribution column on the invoice lines is what keeps that invoice tied to the project's profitability. Confirm the draft and it posts to the ledger, moving the corresponding amount on the profitability report from To invoice into Invoiced. No step in that chain requires typing the hours twice.

The same chain supports incremental billing. A two-week sprint can be billed as a regular invoice for hours logged so far, leaving remaining hours for the next cycle, while the sales order’s Amount to invoice keeps a running tally of what is still billable. Finance does not need a parallel tracker; the sales order is the billing queue.

03The pivotal setting

Service product invoicing policies explained

The Invoicing Policy on the service product is the single decision that determines when a billable project earns revenue. Odoo's general Sales documentation frames the choice as invoicing what is ordered versus invoicing what is delivered: the default is Ordered quantities, where a customer is invoiced once the sales order is confirmed, while Delivered quantities waits until a delivery is validated before an invoice can be created. For services, that choice is specialized into the policies that drive the profitability report.

Odoo's project profitability documentation is explicit that timesheet revenue is broken down according to the Invoicing Policy on the product form, naming three service-specific options: Prepaid or Fixed Price, Based on Timesheets, and Based on Milestones. Each one answers a different commercial question, and picking the wrong one is a classic cause of billing disputes and skewed margins, so it should be decided per product during implementation rather than at go-live.

Commercially, services firms usually map those policies onto four engagement styles: pure time-and-materials, fixed-fee or prepaid productized work, phased milestone delivery, and retainers. Retainers in stock Odoo are typically modeled as prepaid or fixed-price service products (or Subscriptions for recurring cadence), not as a separate timesheet policy—overage hours still need a Based on Timesheets line if you bill beyond the included allotment.

How each service invoicing policy recognizes revenue in Odoo
Service invoicing policyWhen revenue becomes billableBest fit
Prepaid / Fixed Price (ordered quantity)On sales order confirmation, for the agreed fixed feeProductized services and fixed-fee retainers billed upfront
Based on TimesheetsAs validated timesheet hours accrue on the linked taskTime-and-materials consulting and hourly billable work
Based on MilestonesWhen a project milestone is marked reached, updating the delivered percentagePhased projects and fixed-price deliverables billed by stage
Delivered quantities (materials, re-invoiced purchases)When the delivery or vendor bill is validatedGoods, pass-through expenses, and subcontracted purchases on a project
04Engagement design

T&M, fixed price, milestones, and retainers mapped to Odoo

Policy labels in the product form are not the same as the commercial conversation with a client. Map the engagement first, then choose the product policy that matches how cash is supposed to move. Getting this wrong is the most common reason hours sit in To invoice forever or invoices go out before work is done.

Hybrid deals are normal: discovery on T&M, build on milestones, and a prepaid support block for the first ninety days. Odoo handles that with multiple sales order lines, each with its own service product and Invoicing Policy, sharing one project analytic account. Unified reporting stays clean when every line carries the same analytic distribution; it fragments when teams invent a second project for each policy.

Commercial billing models and the Odoo product pattern that implements them
Commercial modelOdoo product patternWatch-outs
Time and materialsService + Based on Timesheets + Create on Order Project and Task; unit price is the bill rateDecide project-rate vs employee/role lines before the first timesheet
Fixed price / prepaidService + Prepaid/Fixed Price (ordered quantities); optional down payment for cash earlyDo not mix a down payment with Delivered quantities when nothing is delivered yet
Milestone / phased fixed feeService + Based on Milestones; enable Milestones on the project or template firstReaching a milestone updates Delivered %; Create Invoice is still a finance step
Retainer (included hours)Prepaid block for included fee; optional second Based on Timesheets line for overageStock Odoo does not auto-track included-hour buckets; process design or customization fills the gap
Hybrid engagementMultiple SO lines with different policies, one project analytic accountDo not expect one product to be both T&M and milestone on the same line
05Policy deep dive

Time-and-materials billing with Based on Timesheets

Based on Timesheets is the policy most professional services firms reach for first, because it bills exactly the hours the team logged. To use it, the Timesheets feature must be enabled in the Project app's settings, Analytic Accounting must be checked under Accounting settings, and the service product must have its Product Type set to Service with Invoicing Policy set to Based on Timesheets and Create on Order set to Project and Task. Only products configured this way can invoice time spent on a project.

Once a sales order carrying that product is confirmed, the project and task appear automatically, and every timesheet line added to the task flows back to the order's Delivered column. When it is time to bill, Create Invoice on the sales order produces a draft that lists the delivered work, and Odoo's documentation stresses watching the Analytic Distribution column on that draft, because that distribution is what keeps subsequent time-and-material invoicing accurate and tied to the right analytic account.

Rate design matters as much as the policy. In the default configuration, project-rate billing uses a single service product and a single unit price for every timesheet on the engagement—suitable for blended-rate SOWs. Employee- or role-oriented billing is achieved by putting separate sales order lines (for example Senior Consultant and Analyst) at different unit prices and mapping people to the correct line on the project’s invoicing configuration so each timesheet inherits the matching rate. That mapping is person-based in standard Odoo: when someone rotates off a project, the mapping needs a deliberate update or the wrong rate ships on the next invoice.

What standard Odoo does not ship is a full professional-services rate card matrix—client-specific role rates, weekend multipliers, volume tiers, and pre-bill write-offs. Those patterns are common in consulting and legal work and typically require process design, pricelist discipline, or a custom module. For most SME services firms, clean product lines, correct employee mapping, and a weekly create-invoice rhythm close more leakage than a complex rate engine.

06Policy deep dive

Milestone and fixed-price billing

Milestone-based invoicing is built for work delivered in clearly defined phases, billing customers progressively as each stage completes instead of all upfront or all at the end. Odoo configures it at the product level: a Service product with Invoicing Policy set to Based on Milestones, and a Create on Order of Project, Project and Task, or Task. Notably, Odoo's milestone documentation states that the Based on Milestones option only appears once at least one project has Milestones enabled, and that a project template can pre-define the milestones for every new project spun from a sales order.

The billing trigger is deliberate. Reaching a milestone does not automatically create an invoice; instead, marking a milestone as reached updates the Delivered percentage on the sales order line, which updates the amount ready to invoice. A four-stage implementation split into 25 percent increments, for example, exposes exactly one quarter of the fee as billable each time a stage is signed off. Only then does Create Invoice turn that delivered amount into a draft invoice, and the process repeats until every milestone is complete.

Fixed-price and prepaid work uses the same chain with the Ordered quantities policy: the full fee is billable on order confirmation, and a down payment is the mechanism for collecting part of it early. Odoo's down payments documentation is careful to distinguish a down payment (an upfront invoice for a percentage or fixed amount of the order) from a payment term or installment plan on a single invoice, and it warns that combining a down payment with a Delivered quantities policy can force a credit note when nothing has yet been delivered, because Odoo does not allow negative invoice totals.

07Beyond time

Re-invoicing expenses, materials, and purchases

Billable projects rarely contain only time. Travel, lodging, subcontracted services, and pass-through materials all need to reach the customer's invoice, and Odoo routes them through the same analytic account as the timesheets. The time-and-materials documentation shows that an expense recorded in the Expenses app can be tied to a sales order through the Customer to Reinvoice and Analytic Distribution fields, after which it appears as its own line on the order and can be invoiced with Create Invoice just like delivered hours.

There is an important precondition. That Analytic Distribution field will only offer the sales order as an option when the order contains a service product billed Based on Timesheets, Based on Milestones, or on Delivered Quantities. For purchases specifically, the product on the purchase order must be marked Can be Expensed, have its Invoicing Policy set to Delivered quantities, and use the At cost option in the Re-Invoice Expenses field, so that the vendor bill lands on the project and can be passed through to the customer at cost.

The effect is that every cost-bearing record on the project (a timesheet, an expense, a validated purchase, a vendor bill) can become a revenue line on an invoice with no manual copy. Because each one carries the project's analytic account, it also appears in the right place on the profitability report, which is what lets a services firm see margin in real time rather than reconstructing it after the fact from three different systems.

08Margin engine

Project profitability and the billable amounts

Billing is only half the picture; the other half is knowing whether the billable work is actually profitable. Odoo's project profitability dashboard sits inside the project and reads every record linked to the project and its analytic account. It splits into Revenues and Costs, and the same timesheet appears in both sections simultaneously, once as the revenue the customer pays for the work and once as the cost of the wages paid to the employee, so margin is the difference rather than a number stitched together from separate reports.

The report organizes amounts into three columns that mirror the billing lifecycle. Expected holds amounts anticipated from existing sales or purchase orders; To invoice (for revenues) or To bill (for costs) is where amounts move once work is delivered, such as when a timesheet is created or validated, a delivery is marked done, or a delivered quantity is updated on the sales order; and Invoiced or Billed is where they land once an invoice or bill is confirmed. Reading those columns tells a project manager exactly what has been earned but not yet billed.

Operationally, treat the To invoice column as the week’s work queue for finance. If hours pile up there while utilization looks healthy, you are leaking cash even though utilization reports look fine. Cost-side timesheet amounts come from the employee’s HR cost settings, so a missing cost rate makes revenue look perfect and margin look invented.

What each profitability column means for billing
Profitability columnWhen amounts move into itBilling signal
ExpectedA sales or purchase order exists for the projectWork sold but not yet delivered
To invoice (revenues) / To bill (costs)Timesheet created or validated, delivery done, or delivered quantity updatedEarned and ready to be invoiced
Invoiced / BilledThe customer invoice or vendor bill is confirmedRecognized on the ledger
09Operational control

Where project billing leaks revenue (and how to close it)

Unbilled hours are the silent leak professional services partners talk about constantly: time is worked, utilization looks fine, and cash never follows. Odoo partners and practitioners repeatedly frame the problem as disconnected tools—spreadsheet timesheets, a separate PSA, and a finance system that never see the same analytic account. The native sales-order-to-invoice chain exists to remove that gap, but only if every hour lands on a billable task linked to the right order line.

Leakage is rarely one bug. It is a stack of small configuration and process misses: time logged on a non-billable internal project, a product with the wrong Invoicing Policy, missing employee-to-SO-line mapping so hours deliver to the wrong rate, expenses without Customer to Reinvoice, and a finance calendar that only creates invoices at month-end after clients have already disputed the period. Each miss shows up differently on the profitability dashboard—hours stuck in To invoice, revenue at the wrong unit price, or cost with no matching sales line.

Close the leaks with a short operating rhythm rather than a bigger report. Require timesheets on the sales-order-linked task (not a free-text project), review Delivered versus Ordered on open sales orders weekly, create draft invoices on a fixed cadence, and reject time that has no sales order item before the period closes. When migrating from another billing stack, keep the cutover on a period boundary, leave open invoices in the old system, and run one parallel billing cycle so mismatches surface before customers do.

Common Odoo project-billing leakage points and the fix
Leakage pointWhat you seeFix
Time on non-billable or wrong taskHours in Timesheets but Delivered stays flat on the SOLog only on tasks created from the service product / SO item
Wrong Invoicing Policy on productOrder confirmed but nothing becomes To invoice after workMatch policy to commercial model (T&M vs ordered vs milestone)
Missing employee → SO line mappingAll roles bill at one blended rate or wrong rateMap people to role lines on the project invoicing tab; update on staffing changes
No analytic accounting / distributionProfitability empty or expenses not reinvoicableEnable analytic accounting; keep project analytic on SO, timesheets, expenses
Expenses without reinvoice fieldsCost on the project, no revenue lineSet Customer to Reinvoice + Analytic Distribution; use At cost for pass-through POs
Month-end-only invoicingLarge To invoice balance, client disputesWeekly or biweekly Create Invoice from the sales order
Hybrid work on one product lineMilestone % and hours fight on the same lineSplit SO lines by policy; share one project analytic account
10Practical setup

Getting the configuration right

Most project billing problems in Odoo trace back to a handful of configuration steps skipped at setup. The apps must be installed in the right relationship, the features must be switched on, and the service product must carry the policy that matches how the work is actually sold. None of it is difficult, but each step gates the next, so it is worth laying them out as a checklist rather than discovering them one error message at a time.

Two warnings recur in the documentation and are worth flagging before the checklist. First, reaching a milestone does not create an invoice automatically; it only updates the delivered quantity, so a finance step is still required to turn a reached milestone into a posted invoice. Second, mixing a down payment with a Delivered quantities policy can produce a credit note instead of an invoice when nothing has been delivered yet, because Odoo refuses negative invoice totals, a behaviour that is correct but surprising the first time you hit it.

Projects themselves should be marked billable under Sales & Invoicing when you create or configure them from the project side, and service products used for helpdesk or field time follow the same Based on Timesheets pattern once Time Billing is enabled on the team. Consistency across Project, Helpdesk, and Field Service keeps finance from inventing a second process for “almost the same” hours.

  • Install Project and Accounting, then enable Analytic Accounting under Accounting settings, because no record shows on profitability without an analytic account.
  • Enable Timesheets in the Project app's Time Management settings; time-based invoicing is unavailable until this is on.
  • Set the service product's Product Type to Service, then choose the Invoicing Policy (Based on Timesheets, Based on Milestones, Prepaid or Fixed Price) and the Create on Order behavior (Project and Task, Project, or Task).
  • For milestone billing, enable Milestones on at least one project first, because the Based on Milestones policy only appears once that condition is met.
  • For multi-rate T&M, create one service product line per billable role on the sales order and map employees to those lines on the project invoicing configuration.
  • For re-invoiced purchases, mark the product Can be Expensed, set its Invoicing Policy to Delivered quantities, and use At cost for Re-Invoice Expenses so vendor bills pass through cleanly.
  • Watch the Analytic Distribution column on draft invoices, since that linkage is what keeps time-and-materials billing and profitability accurate.
  • Run a weekly billing review: open sales orders with Amount to invoice greater than zero, create drafts, and clear To invoice before the next period starts.
11Platform comparison

How it compares to Dynamics 365 Project Operations

Microsoft's counterpart for billable project work is Dynamics 365 Project Operations, and its billing model is built around actuals rather than a product policy. Microsoft's documentation defines actuals as the reviewed and approved financial and schedule progress on a project, created when time, expense, and material usage entries, journal entries, and invoices are approved, and it notes that the way actuals are generated depends on whether the engagement uses a time-and-materials or fixed-price billing model. In other words, the approved entry, not the sales order line, is the atom that eventually becomes an invoice.

That is a fundamentally different architecture from Odoo's. Where Odoo makes a service product on a sales order the trigger and lets the analytic account carry cost and revenue, Project Operations generates cost and sales actuals on approval, then funnels those actuals into invoice proposals for confirmation. Microsoft's time overview confirms the upstream: time entries record the actual time a resource consumes and are used to calculate cost and sales prices, and team members submit them for approval, with the ability to recall an entry for correction. The correction model is therefore heavier, using recall and correction journals to reverse or edit actuals, where Odoo leans on a manager validation step and draft invoices or credit notes.

For an SME choosing between them, the trade-off is depth versus weight. Project Operations brings a work-breakdown-structure-first design, deep resource scheduling, and tight ERP-side finance for project-heavy organizations, at the cost of a Dataverse and Power Platform deployment. Odoo delivers the same sales-order-to-invoice chain in a lighter, Kanban-first, modular app model on a single database, which is why smaller services firms often reach its threshold faster. The decision is less about which can bill a project, both can, and more about how much project-management machinery the organization actually needs around the invoice.

Odoo project billing versus Dynamics 365 Project Operations
DimensionOdoo project billingDynamics 365 Project Operations
Billing triggerService product Invoicing Policy on the sales order (timesheets, milestones, or ordered quantity)Approved time, expense, and material actuals flow into invoice proposals
Cost and revenue modelAnalytic account links every record; profitability shows Expected, To invoice, InvoicedCost and sales actuals generated on approval; time-and-materials and fixed-price models
ArchitectureModular Odoo apps (Sales, Project, Timesheets, Invoicing) on one databaseDataverse and Power Platform; Lite, Resource/Non-Stocked, and Stocked deployments
Correction modelManager validates timesheets; edit the draft or issue a credit noteRecall or cancel approvals to reverse actuals; correction journals edit them
Typical fitSME services firms wanting lightweight Kanban plus native billingProject-heavy organizations needing deep scheduling and ERP-side finance
FAQ

Frequently asked questions

How does Odoo invoice time spent on a project?

Configure a service product with Product Type set to Service, Invoicing Policy set to Based on Timesheets, and Create on Order set to Project and Task. When a sales order for that product is confirmed, Odoo creates the project and task automatically, hours logged on the task flow back to the order's Delivered column, and Create Invoice turns the delivered hours into a draft invoice.

What is the difference between Based on Timesheets and Based on Milestones in Odoo?

Based on Timesheets bills the validated hours actually logged on the task, suiting time-and-materials work, while Based on Milestones bills fixed percentages of the order as project milestones are marked reached, suiting phased or fixed-price deliverables. Reaching a milestone does not create an invoice automatically; it updates the delivered quantity, and a separate Create Invoice step turns that into a draft invoice.

How does project profitability work in Odoo?

The profitability dashboard reads every record linked to the project and its analytic account, splitting amounts into Expected, To invoice or To bill, and Invoiced or Billed. The same timesheet appears once as revenue (what the customer pays) and once as cost (what the employee earns), so the margin is the difference and updates in real time as hours are logged and invoices are confirmed.

Can you re-invoice expenses and purchases to a customer in Odoo?

Yes. Expenses tied to a sales order through the Customer to Reinvoice and Analytic Distribution fields appear as a line on the order and can be invoiced with Create Invoice, provided the order contains a service product billed on timesheets, milestones, or delivered quantities. For purchases, the product must be marked Can be Expensed with Invoicing Policy set to Delivered quantities and Re-Invoice Expenses set to At cost.

What is the Dynamics 365 equivalent of Odoo project billing?

The equivalent is Dynamics 365 Project Operations, which bills through actuals rather than a product policy: approved time, expense, and material entries generate cost and sales actuals that flow into invoice proposals. It uses a work-breakdown-structure-first design on Dataverse and the Power Platform, compared with Odoo's lighter sales-order-driven, analytic-account model on a single database.

Is a down payment the same as a milestone invoice in Odoo?

No. A down payment is an upfront invoice for a percentage or fixed amount of the sales order, distinct from a payment term or installment plan on a single invoice. A milestone invoice is triggered by project progress, marking a milestone reached updates the delivered quantity and then Create Invoice bills that stage. Mixing a down payment with a Delivered quantities policy can force a credit note when nothing has been delivered yet.

Why are my project timesheets not showing on the profitability dashboard?

The most common cause is a missing analytic account link. Odoo requires every record to be linked to both the project and its analytic account before it appears on profitability, so check that Analytic Accounting is enabled, that the sales order carries the project's analytic distribution, and that timesheets are logged against the task belonging to that project.

What is the difference between project-rate and employee-rate T&M billing in Odoo?

Project-rate billing uses one service product and one unit price for every timesheet on the engagement—ideal for blended rates. Employee- or role-oriented billing uses multiple sales order lines at different prices and maps employees to those lines on the project so each timesheet inherits the correct rate. Standard Odoo does not provide a full client-role rate card matrix; that pattern needs process design or customization.

How do I stop unbilled hours from piling up in Odoo?

Log time only on tasks linked to a sales order item, keep Analytic Accounting on, review open sales orders with Amount to invoice greater than zero every week, and create draft invoices on a fixed cadence instead of waiting for month-end. Fix wrong products and missing employee-to-line mappings as soon as Delivered hours appear at the wrong rate. Treat the profitability To invoice column as finance’s work queue, not a report to ignore.

Can one Odoo project combine time-and-materials and milestone billing?

Yes, by using multiple sales order lines with different Invoicing Policies on service products that share the same project analytic account—for example a Based on Timesheets line for advisory hours and a Based on Milestones line for a fixed deliverable. A single product line cannot cleanly be both policies at once; structure the order, not the product, for hybrid commercial models.

How should retainers be set up for Odoo project billing?

Model the included retainer fee as a Prepaid or Fixed Price service product (or a Subscription for recurring cadence), and add a separate Based on Timesheets line if overage hours are billable. Standard Odoo does not automatically track included-hour buckets and overage thresholds; that needs an operating process or customization. Keep both lines on the same analytic account so profitability stays coherent.

Sources & methodology

15 cited

Every pricing figure and statistic on this page is traced to a primary or vendor source with a verification date. Where partner pages are cited, their platform bias is disclosed in-line.

  1. 01
    Invoicing for time spent on a project requires a Service product with Invoicing Policy set to Based on Timesheets and Create on Order set to Project and Task; confirming the sales order creates the project and task, logged hours update the Delivered column, and Create Invoice produces a draft invoice.odoo.com · verified Verified via web crawl of the Odoo 19.0 'Invoicing based on time and materials' page (2026-08).
  2. 02
    The Analytic Distribution field for re-invoicing only offers the sales order when the order contains a service product billed Based on Timesheets, Based on Milestones, or on Delivered Quantities.odoo.com · verified Verified via web crawl of the Odoo 19.0 'Invoicing based on time and materials' page (2026-08).
  3. 03
    Project profitability reads records linked to the project and its analytic account, splits amounts into Expected, To invoice (revenues) or To bill (costs), and Invoiced or Billed, and the same timesheet appears under both revenues and costs.odoo.com · verified Verified via web crawl of the Odoo 19.0 'Project profitability' page (2026-07/08).
  4. 04
    Timesheet revenue is broken down according to the Invoicing Policy on the product form, with the named options Prepaid or Fixed Price, Based on Timesheets, and Based on Milestones.odoo.com · verified Verified via web crawl of the Odoo 19.0 'Project profitability' page (2026-07/08).
  5. 05
    Odoo's general invoicing policies are Invoice what is ordered (default, invoice on sales order confirmation) and Invoice what is delivered (invoice after delivery is validated).odoo.com · verified Verified via documentation index and prior direct fetch of the Odoo 19.0 'Invoicing policies' page.
  6. 06
    Milestone invoicing uses a Service product with Invoicing Policy set to Based on Milestones; the option is only available once at least one project has Milestones enabled; reaching a milestone updates the Delivered percentage on the sales order but does not automatically create an invoice.odoo.com · verified Verified via web crawl of the Odoo 19.0 'Invoice project milestones' page (2026-08).
  7. 07
    A down payment is an upfront invoice for a percentage or fixed amount, distinct from a payment term or installment plan, and combining a down payment with a Delivered quantities policy can force a credit note because Odoo disallows negative invoice totals.odoo.com · verified Verified via Odoo 19 documentation tree (down payments / invoicing method).
  8. 08
    In Dynamics 365 Project Operations, actuals represent reviewed and approved financial and schedule progress, created when time, expense, and material usage entries, journal entries, and invoices are approved, and their creation depends on the time-and-materials or fixed-price billing model.learn.microsoft.com · verified Verified via Microsoft Learn 'Actuals' documentation.
  9. 09
    In Dynamics 365 Project Operations, time entries record the actual time a resource consumes and are used to calculate cost and sales prices; team members create and submit them for approval and can recall an entry for corrections.learn.microsoft.com · verified Verified via Microsoft Learn 'Time overview' documentation.
  10. 10
    Odoo 19 default T&M supports project-rate (single unit price for all timesheets) and employee mapping to sales order lines for multi-rate billing; client-specific role rate cards, overtime multipliers, volume tiers, and hybrid T&M+milestone on one clean product line are not fully covered out of the box.silentinfotech.com · verified Verified via direct fetch of Silent Infotech Odoo 19 T&M rate card article (2026).
  11. 11
    Odoo 18/19 timesheet project billing flow: enable Timesheets and project Billable, configure service products Based on Timesheets with Create on Order, log hours on SO-linked tasks, then Create Invoice from Delivered hours; project dashboard exposes Expected / To Invoice / Invoiced revenue.cybrosys.com · verified Verified via direct fetch of Cybrosys timesheet billing walkthrough (2025/2026).
  12. 12
    Helpdesk Time Billing creates a Service on Timesheets product (Service type, Based on Timesheets) when Time Billing is enabled on a team, extending the same timesheet-to-invoice product pattern beyond Project.odoo.com · verified Verified via web search snippet of Odoo 19 Helpdesk track-and-bill documentation (2026-08).
  13. 13
    Practitioner and partner messaging on X repeatedly frames unbilled hours as silent revenue leakage and positions Odoo timesheets linked to invoices as the fix for service firms.x.com · verified X post by Greytrix Business Solutions (2026-07-07) on unbilled hours and Odoo Timesheet-to-invoice linking.
  14. 14
    Service-business Odoo messaging on X stresses connecting projects, timesheets, and billing so untracked time does not become lost profit.x.com · verified X post by RAVA Global Solutions (2026-07-31) on Odoo projects, timesheets, and billing for service businesses.
  15. 15
    Billing system migrations should cut over on a period boundary, leave open invoices in the old system, and run one parallel cycle before flip—relevant when moving timesheet billing onto Odoo.x.com · verified X post by Bailey Spell (2026-08-03) on safe billing migration cutover practices.

Related services & solutions

Wire up billable projects the right way

Flectic implements Odoo and Dynamics 365 for SME services firms across Canada, the UK, and the US, helping teams connect sales orders, projects, timesheets, and invoices so margin is visible in real time. Whether you bill by the hour, by the milestone, or on a fixed fee, we can configure the service-product policies and analytic accounts that keep billing accurate, delivered with AI-accelerated implementation designed to be up to 3x faster. Book an ERP Readiness Call to map your path.

Book an ERP Readiness Call
Response within one business day