Running an HVAC business with Odoo

How do I purchase subcontractor services for an Odoo job?

Workflow overview: How do I purchase subcontractor services for an Odoo job?
Workflow overview. Instructional screenshots show the actual demo interface.

Buy a subcontractor service for an Odoo job, link the purchase to its project, record service acceptance and review the draft vendor bill.

Alex needs a specialist’s site review before the proposed installation. This Odoo subcontractor purchase order keeps the supplier, service scope and job together. We buy one fictional service Unit, select the installation project and test how a manually accepted service becomes a draft bill. The bill remains available for review before any posting or payment decision.

Alex Rivera and Demo Air HVAC are fictional training examples. Prices, dates, quantities and business situations in this guide are illustrative.

Before you begin

Tested in stock Odoo 20.0-20260926 Community as the demo owner administrator, with official modules and standard configuration. Complete H47 installation project setup, H30 purchase orders and H59 supplier bills. Purchase, Project, Invoicing and their official project/purchase integration are installed. Reuse Demo Installation H47 — S00011, its existing Project Account and customer. Keep the three H47 tasks and their states. This example buys a service directly from a supplier; it does not add a customer charge. Use a training company and local mail sink. No real supplier communication, visit, invoice or payment takes place.

Step-by-step workflow

Step 1. Prepare the fictional supplier contact

Open Contacts, search for Demo Specialist Services H48 and use New only if it does not already exist. Enter that name and services-h48@demoair.example.invalid. On Sales & Purchase, choose the existing Immediate Payment under the Purchase section’s Payment Terms. Save and reopen. This build’s new-contact screen uses Name (company or person) without a Company/Person radio; the saved example is a contact. Complete and verify the appropriate supplier identity, address, tax and payment details for your business before a real purchase.

Action 1: One fictional supplier; synthetic local-only email. The actual target is highlighted in gold.
One fictional supplier; synthetic local-only email.
Action 2: Open Sales & Purchase for supplier terms. The actual target is highlighted in gold.
Open Sales & Purchase for supplier terms.
Action 3: Select Immediate Payment for purchases. The actual target is highlighted in gold.
Select Immediate Payment for purchases.
Action 4: Save this supplier once. The actual target is highlighted in gold.
Save this supplier once.
Action 5: Reopened same supplier; saved contact type retained. The actual target is highlighted in gold.
Reopened same supplier; saved contact type retained.

Step 2. Create a separate purchased service

Open Purchase → Products → Products → New. Enter Demo Subcontractor Site Review H48, select Service, keep Purchase checked and clear Sales. Set Reference H48-SITE-REVIEW and Cost $150. Selecting Service initially chooses Hours here, so explicitly select Units beside Cost for this fixed-price review. This is one service Unit, with no stock tracking. Check the actual Purchase Taxes; the training product inherits an illustrative 6%, which is not advice about the tax treatment of subcontractor labor.

Action 6: Purchased Service: $150 per Unit, Sales off. The actual target is highlighted in gold.
Purchased Service: $150 per Unit, Sales off.
Action 7: Open Purchase for bill-control policy. The actual target is highlighted in gold.
Open Purchase for bill-control policy.
Action 10: Save the service once and reopen. The actual target is highlighted in gold.
Save the service once and reopen.

Step 3. Choose the service billing basis

Open the product’s Purchase tab. Change Control Policy from On ordered quantities to On received quantities. In the purchase note, enter the fictional scope: one pre-installation review of the H47 proposed scope/site context; no actual visit, technical authorization, commissioning, completed installation or customer approval is established. Save and reopen. This policy bases the proposed bill quantity on the recorded service acceptance; it does not inspect the work for you.

Action 7: Open Purchase for bill-control policy. The actual target is highlighted in gold.
Open Purchase for bill-control policy.
Action 8: Bill only received service quantities. The actual target is highlighted in gold.
Bill only received service quantities.
Action 9: Label the proposed review as fictional scope. The actual target is highlighted in gold.
Label the proposed review as fictional scope.
Action 10: Save the service once and reopen. The actual target is highlighted in gold.
Save the service once and reopen.
Action 11: Reopened saved policy: On received quantities. The actual target is highlighted in gold.
Reopened saved policy: On received quantities.

Step 4. Add the supplier and service to one RFQ

Open Purchase → Orders → Requests for Quotation → New. Select the existing Demo Specialist Services H48 from the Vendor dropdown. Payment Terms should show Immediate Payment. Click Add a product and select H48-SITE-REVIEW. Check 1 Unit at $150 and the copied scope. The tested totals are $150 untaxed + $9 demo tax = $159. Review the agreed supplier price rather than assuming the product’s Cost proves a current supplier agreement.

Action 12: One Unit at $150; copied fictional scope and $159 total. The actual target is highlighted in gold.
One Unit at $150; copied fictional scope and $159 total.

Step 5. Select the installation project

Open Other Info. In Source, enter S00011 / H48 fictional site-review service. In Project, search for and select the existing Demo Installation H47 — S00011; do not create another project from the dropdown. Source is a readable reference. Project is the native link used here to allocate the service line to the installation’s existing Project Account. A typed order number alone would not establish that allocation.

Action 13: Link the purchase to the installation project. The actual target is highlighted in gold.
Link the purchase to the installation project.
Action 14: Source is a manual reference to S00011. The actual target is highlighted in gold.
Source is a manual reference to S00011.
Action 15: Find the existing installation project. The actual target is highlighted in gold.
Find the existing installation project.
Action 16: Select existing project; native allocation follows. The actual target is highlighted in gold.
Select existing project; native allocation follows.

Step 6. Review the planned service date and save

Set Expected Arrival to October 22, 2026 at 9 AM America/New_York, using the native date/time control. For this service it is a proposed supplier planning value, not a booked technician appointment. Review scope, supplier, payment terms, quantity, price, tax and project. Click Save manually, wait for the save and reopen P00010. Confirm that the project and one service line persist. Leave supplier messages unsent in this training exercise.

Action 17: Expected Arrival: October 22 at 9 AM local time. The actual target is highlighted in gold.
Expected Arrival: October 22 at 9 AM local time.
Action 18: Save and reopen this RFQ without sending. The actual target is highlighted in gold.
Save and reopen this RFQ without sending.
Action 19: Same saved P00010, still an unsent RFQ. The actual target is highlighted in gold.
Same saved P00010, still an unsent RFQ.

Step 7. Confirm the purchase and inspect the service line

Click Confirm Order once as the owner. Reopen P00010 and check Purchase Order, ordered 1, Received 0 and Billed 0. This owner can confirm directly under the company’s existing purchase-approval configuration; another role must follow the applicable approval process. The service has no warehouse receipt. Its manually recorded Received quantity is the billing input. The form offers Upload Bill; the bill-creation action used below is in the Purchase Orders list.

Action 20: Owner confirms this purchase once; no supplier message. The actual target is highlighted in gold.
Owner confirms this purchase once; no supplier message.
Action 21: Confirmed service PO: Received 0, Billed 0; no stock receipt. The actual target is highlighted in gold.
Confirmed service PO: Received 0, Billed 0; no stock receipt.

Step 8. Record the service acceptance deliberately

For a real job, review the supplier’s actual work and agreed acceptance basis first. In this isolated training example, simulate acceptance by clicking the service line’s Received cell, entering 1, leaving the cell and saving. Wait and reopen: Received should remain 1. Use Log note to state that this is an H48 synthetic acceptance test, with no real visit, supplier invoice, technical sign-off, completed installation, customer approval or payment; keep the bill in Draft. Click Log. Recording a quantity documents your decision; Odoo has not independently verified that the service occurred.

Action 22: Synthetic training acceptance: Received 1 Unit. The actual target is highlighted in gold.
Synthetic training acceptance: Received 1 Unit.
Action 23: Save the one received service Unit once. The actual target is highlighted in gold.
Save the one received service Unit once.
Action 24: Reopened Received 1, Billed 0; acceptance needs its note. The actual target is highlighted in gold.
Reopened Received 1, Billed 0; acceptance needs its note.
Action 25: Use an internal note for this fictional acceptance. The actual target is highlighted in gold.
Use an internal note for this fictional acceptance.
Action 26: State the synthetic acceptance and draft-bill hold. The actual target is highlighted in gold.
State the synthetic acceptance and draft-bill hold.
Action 27: Log one internal acceptance note; no recipients. The actual target is highlighted in gold.
Log one internal acceptance note; no recipients.
Action 28: Reopened internal note; no real service certified. The actual target is highlighted in gold.
Reopened internal note; no real service certified.

Step 9. Create the draft bill from the selected order

Open Purchase → Orders → Purchase Orders. Check only the P00010 row and choose the toolbar’s Create Bills once. Open the resulting Draft Bill. It proposes the one accepted service Unit, with the purchase reference and copied scope, price and tax. Check existing bills before this action; this guide does not establish a duplicate-invoice prevention rule. Do not create a physical receipt to make a service bill available.

Action 29: Select only this P00010 purchase order. The actual target is highlighted in gold.
Select only this P00010 purchase order.
Action 30: Create one draft service bill from the selected PO. The actual target is highlighted in gold.
Create one draft service bill from the selected PO.
Action 31: One Draft Bill; $159 remains due and unposted. The actual target is highlighted in gold.
One Draft Bill; $159 remains due and unposted.

Step 10. Review the bill and leave it in Draft

Compare Vendor, P00010 Purchases, quantity 1, Units, $150 price and $159 total. Enter Bill Reference DEMO-H48-DRAFT-REVIEW and Bill Date October 15, 2026 for this synthetic draft. Leave the fields, let the changes save and reopen the same bill. The copied line Account is Cost of Goods Sold in this company; its tax and account still need the appropriate accounting review. Keep the bill Draft and unpaid. The visible Amount Due $159 and 100% PO Matching badge do not establish approval, posting or payment.

Action 31: One Draft Bill; $159 remains due and unposted. The actual target is highlighted in gold.
One Draft Bill; $159 remains due and unposted.
Action 32: Bill Date: October 15, 2026. The actual target is highlighted in gold.
Bill Date: October 15, 2026.
Action 33: Keep the bill reference labelled for draft review. The actual target is highlighted in gold.
Keep the bill reference labelled for draft review.
Action 34: Save pending changes to this same draft bill. The actual target is highlighted in gold.
Save pending changes to this same draft bill.
Action 35: Inherited Cost of Goods Sold needs review; bill remains Draft. The actual target is highlighted in gold.
Inherited Cost of Goods Sold needs review; bill remains Draft.
Action 36: 100% PO Matching is separate from posting or payment. The actual target is highlighted in gold.
100% PO Matching is separate from posting or payment.
Action 47: Same saved bill: $159 remains due; no payment recorded. The actual target is highlighted in gold.
Same saved bill: $159 remains due; no payment recorded.

Step 11. Find the purchase from the installation project

From the bill, click P00010 Purchases. Open Other Info, click the Project field and its Internal link. In the project form, choose More → 1 Purchase Orders. With one linked purchase, this opens P00010 directly in the tested case. The job can find its supplier order through the native link. The project’s Estimated Costs and Real Costs buttons still show $0 here; do not treat those labels as proof that this draft bill has become a posted job cost.

Action 37: Open the original P00010 purchase from this bill. The actual target is highlighted in gold.
Open the original P00010 purchase from this bill.
Action 38: Review the saved Project link on the purchase. The actual target is highlighted in gold.
Review the saved Project link on the purchase.
Action 39: Use the selected Project internal link. The actual target is highlighted in gold.
Use the selected Project internal link.
Action 40: Open the existing installation project. The actual target is highlighted in gold.
Open the existing installation project.
Action 41: Project Real Costs is $0; this bill is still Draft. The actual target is highlighted in gold.
Project Real Costs is $0; this bill is still Draft.
Action 42: Open More to find the one linked purchase. The actual target is highlighted in gold.
Open More to find the one linked purchase.
Action 43: One Purchase Orders link opens the same P00010 directly. The actual target is highlighted in gold.
One Purchase Orders link opens the same P00010 directly.

Step 12. Reopen the same bill and check what Billed means

On P00010, click 1 Vendor Bills and reopen Draft Bill (DEMO-H48-DRAFT-REVIEW). The PO now shows Received 1 / Billed 1 and a 100% Bill Matching badge even though this bill is still Draft and unpaid. Verify the actual bill state and reference before deciding what remains to approve, post or pay. This flow creates one supplier bill; it does not invoice the customer, finish the installation task or authorize payment.

Action 36: 100% PO Matching is separate from posting or payment. The actual target is highlighted in gold.
100% PO Matching is separate from posting or payment.
Action 40: Open the existing installation project. The actual target is highlighted in gold.
Open the existing installation project.
Action 44: Same PO: Received 1 and Billed 1, still a draft bill. The actual target is highlighted in gold.
Same PO: Received 1 and Billed 1, still a draft bill.
Action 45: Open the one linked Vendor Bill. The actual target is highlighted in gold.
Open the one linked Vendor Bill.
Action 46: Same Draft Bill: $159 due, unposted and unpaid. The actual target is highlighted in gold.
Same Draft Bill: $159 due, unposted and unpaid.
Action 47: Same saved bill: $159 remains due; no payment recorded. The actual target is highlighted in gold.
Same saved bill: $159 remains due; no payment recorded.

Check the result

P00010 is one confirmed $159 subcontractor-service purchase linked to Demo Installation H47 — S00011, with one manually accepted service Unit and no stock receipt. Native Project selection assigns 100% of the purchase line to the existing Project Account, and that allocation and the purchase-line link carry into the single $159 draft bill. The saved bill is DEMO-H48-DRAFT-REVIEW, dated October 15, unpaid and unposted. Its draft already makes the PO show Billed 1/Fully Billed; no posted analytic cost entry exists. The project’s displayed cost buttons remain $0. The native project purchase button and PO Vendor Bills button reopen the same records. Existing installation tasks, sales, stock, prior financial records, CRM, portal access and the open H39 supplier exception are preserved. No new message reaches the local sink.

If your screen differs

The native Project field is present with the official project/purchase integration and an existing Project Account in this runtime. The Analytic Distribution column is not exposed in the tested owner screen; selected read-only results verify the copied 100% allocation. This is evidence for this configuration, not a tested result for every project or analytic plan. Received quantities are manual for this service. Zero-to-one billable quantity was checked, but a premature Create Bills attempt and every possible override were not tested; no hard approval lock is claimed. Review the actual supplier invoice, quantities, account, tax, duplicate risk and approvals before posting. Draft billing and PO matching are not payment or actual job profitability. Only the owner role was exercised here; earlier purchase-approval checks remain in H31. Manufacturing subcontracting, automatic sales-triggered service RFQs, customer recharging and posted project costs require separate verification.

Frequently asked questions

How do I purchase subcontractor services in Odoo? In this tested stock Odoo 20 Community setup, create a purchased Service product, choose its Control Policy and add it to a supplier RFQ. Select the job’s native Project field, review and confirm the order, then record actual service acceptance and create the draft bill from the selected Purchase Orders row. The guide uses one fictional fixed-price service Unit and keeps the bill unposted for review.
How do I record receipt of a purchased service in Odoo? This Service product uses On received quantities and a manually editable Received cell on its confirmed purchase order. After reviewing actual service acceptance, record the accepted quantity and save. The tested one-Unit entry made one Unit available to bill without a warehouse receipt. It does not independently verify the supplier’s work.
Can I link a subcontractor bill to an Odoo project? Selecting Project on this purchase assigned 100% to its existing Project Account, and the native purchase allocation carried into the draft vendor-bill line. The project’s Purchase Orders button found the order. The bill remains Draft with no posted analytic cost, despite the PO showing Billed 1/Fully Billed. Review the saved bill and actual cost recognition separately.

Continue building the business

Continue with H55: How do I invoice an installation milestone in Odoo? for the separate milestone invoicing workflow. Preserve this purchase and unposted supplier bill for the later job-cost review.

Talk to an Odoo partner

Bring your current process and the result you need to Onward to plan your Odoo workflow. Talk to an Odoo partner.