This guide shows how to buy services, such as consulting, repairs or freight, on purchase orders in Odoo, and what changes compared with buying stock. The short answer: set the product's type to Service. Odoo then lets you bill the service against the confirmed order without waiting for a receipt, and keeps it out of your inventory. The part that needs a decision is accounting, because a service bill posts to an expense account taken from the product or its category. The steps were verified on Odoo 19.
It is written for purchasing managers and accountants who already buy raw materials or packaging through Odoo and are adding services to the same process.
Before you start
- Version and edition: Odoo 19, Community or Enterprise. The purchase rules described here read the same in the Odoo 20 source. The 3-way matching option mentioned below needs Enterprise.
- Apps: Purchase, plus Accounting (called Invoicing in Community) for the bills.
- Access rights: the Control Policy field on a product is only shown to users whose Purchase access is Administrator. The expense account fields on products and categories are only shown to users with full accounting visibility; with the Enterprise Accounting app, that means Read-only, Bookkeeper or Administrator.
- Terms used: a service product is a product with Product Type set to Service, which Odoo never counts as stock. A receipt is the inventory operation that records goods arriving. The control policy decides which quantity on a purchase order line can be billed: the ordered quantity or the received quantity.
What changes when the product is a service
The order itself is created and confirmed exactly as for goods. Four things differ on a service line.
- No receipt. When the order is confirmed, Odoo creates a receipt only for lines whose product is Goods. An order with only service lines creates no receipt at all, and a mixed order creates one receipt holding only the goods.
- Billable on confirmation. Odoo sets a service's control policy to On ordered quantities by itself, so the full quantity is billable once the order is confirmed and the Billing Status shows Waiting Bills.
- Received quantity is entered by hand. On a goods line, the Received column is filled in by the receipt. On a service line it stays editable, so someone can record how much of the service has been delivered.
- No stock value. A service line creates no stock movement and never appears in inventory valuation.
Set up a service product step by step
- Open the Purchase app and go to Products > Products. Click New, or open the product you want to buy.
- On the General Information tab, set Product Type to Service. The Track Inventory checkbox disappears, because services are never stocked.
- Make sure the Purchase checkbox under the product name is ticked. The Purchase tab only appears when it is.
- Still on General Information, set Category to a category meant for services. The next section explains why this matters for your ledger.
- Open the Purchase tab. Under Vendor Bills, Control Policy already reads On ordered quantities. Change it only if you want to bill against delivered quantities instead.
- Save.
Choose a control policy
- On ordered quantities suits fixed-price work, retainers and services billed in full up front. Everything ordered is billable from the moment the order is confirmed.
- On received quantities suits work delivered in parts, such as hours or project stages. Nothing is billable, and the Billing Status reads Nothing to Bill, until someone types the delivered amount in the Received column of the order line. If 3 of 5 ordered days are entered as received, only 3 can be billed.
Changing the Product Type resets the control policy, so set the type first and the policy second.
In Enterprise, Purchase > Configuration > Settings also offers 3-way matching in the Invoicing section. It adds a Should Be Paid field to vendor bills, on the Other Info tab, with the values Yes, No and Exception. For a service on ordered quantities it compares the billed quantity with the ordered quantity; on received quantities it compares it with what was entered as received. A unit price on the bill that differs from the order also gives Exception.
Where a service bill posts in the ledger
For a service, Odoo picks the expense account for each bill line in this order: the Expense Account on the product's Accounting tab if one is set; otherwise the Expense Account on its product category; otherwise the company's default expense account in the Accounting settings.
The simplest way to control the general ledger codes is one category per type of spend, each with its own expense account:
- Open the Purchase app and go to Configuration > Products > Categories. Click New.
- Name it, for example Professional Fees, Subcontracting or Freight.
- In Account Properties, set Expense Account to the ledger account for that spend. Save.
- Assign each service product to the matching category.
These account fields are stored per company, so in a multi-company database set them in each company.
How this differs from your stocked goods
A goods product with Track Inventory ticked follows the Inventory Valuation setting on its category. On Perpetual (at invoicing), its bill line posts to the category's Stock Account, not the Expense Account. On Periodic (at closing), it posts to the Expense Account, the same field a service uses. On a test order mixing both, the service line went to its own category's expense account under either setting.
This is why a service should not borrow a raw material category. If those categories are on Perpetual, their Expense Account has never been used by a bill and may be blank or point at the wrong account without anyone noticing.
Check that it worked
- In the Purchase app, create an order with one service line and, if you like, one goods line. Click Confirm Order.
- If there is a goods line, a Receipt button appears at the top of the order, and the receipt lists only the goods. With service lines only, no Receipt button appears.
- Open the Other Information tab. Billing Status reads Waiting Bills.
- Bill the order: in the Accounting app, go to Vendors > Bills, click New, choose the vendor and pick the order in Auto-Complete (shown to Purchase users). Set the bill date and confirm.
- Users with full accounting visibility can open the bill's Journal Items tab. The service line should sit on the expense account of the service category.
Common mistakes to avoid
- Using Goods for a service. A Goods product, even without Track Inventory, still lands on the receipt, so warehouse staff are asked to receive consulting hours.
- Expecting to see Control Policy. Users who are not Purchase Administrators do not see the field, even though it still applies.
- Leaving received quantities empty. A service on On received quantities stays at Nothing to Bill until the Received column is filled in.
Steps verified on Odoo 19. Menus and labels can differ on other versions.
Common questions
Does Odoo create a receipt for services on a purchase order?
No. Odoo creates a receipt only for lines whose product type is Goods. An order with only service lines has no receipt, and a mixed order's receipt lists only the goods.
Can I bill a service purchase order before the work is delivered in Odoo?
Yes, by default. Odoo sets the control policy of a service product to On ordered quantities, so the full ordered quantity is billable once the order is confirmed.
How do I bill a service only for the part that was delivered?
Set the product's Control Policy to On received quantities on its Purchase tab, which needs Purchase Administrator access. Then enter the delivered amount in the Received column of the order line, and only that amount becomes billable.
Which account does an Odoo vendor bill for a service post to?
The Expense Account on the product's Accounting tab if one is set, otherwise the Expense Account on its product category, otherwise the company's default expense account. Giving services their own categories keeps each type of spend on its own ledger account.
Why do my stock purchases post to a different account than my services?
Tracked goods follow their category's Inventory Valuation setting. On Perpetual (at invoicing) the bill posts to the Stock Account, while services always post to an expense account.
Talk to the team.
If you are setting this up, or Odoo is not behaving the way this guide describes, book a 30-minute call. We will look at your configuration and tell you what it needs. Calgary studio, in-house team, no offshore handoffs.
Book the call →