How to Raise a Purchase Order for Services in Odoo · Calibre Consulting

Raise purchase orders for services in Odoo.

Set service products up for purchasing in Odoo: no receipts, bills matched to the order, and bills that post to the expense account you choose.

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

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.

Set up a service product step by step

  1. Open the Purchase app and go to Products > Products. Click New, or open the product you want to buy.
  2. On the General Information tab, set Product Type to Service. The Track Inventory checkbox disappears, because services are never stocked.
  3. Make sure the Purchase checkbox under the product name is ticked. The Purchase tab only appears when it is.
  4. Still on General Information, set Category to a category meant for services. The next section explains why this matters for your ledger.
  5. 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.
  6. Save.

Choose a control policy

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:

  1. Open the Purchase app and go to Configuration > Products > Categories. Click New.
  2. Name it, for example Professional Fees, Subcontracting or Freight.
  3. In Account Properties, set Expense Account to the ledger account for that spend. Save.
  4. 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

  1. In the Purchase app, create an order with one service line and, if you like, one goods line. Click Confirm Order.
  2. 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.
  3. Open the Other Information tab. Billing Status reads Waiting Bills.
  4. 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.
  5. 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

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 →