Running an HVAC business with Odoo

How do I record materials used and returned on an Odoo job?

Workflow overview: How do I record materials used and returned on an Odoo job?
Workflow overview. Instructional screenshots show the actual demo interface.

Reconcile Odoo job materials with actual delivery and return records, then check net delivered stock, backorders and ordered-quantity billing.

Alex needs the office’s materials record to agree with physical stock. In this example, the one filter delivered for a training job was unused and comes back to the warehouse. We retain the original delivery, complete its native return and record the remaining backorder and billing exception on the matching job.

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. Use the existing parts order/delivery from reserve and deliver parts and its manually referenced job from create a manual service job. S00007’s Customer Reference identifies Demo Service Job H40 / task 5. That is the materials job in this lesson. The separate create a task from a sales order example, S00008 / task 6, remains a time-billed service job and is not silently merged into this order. Work as the owner with stock/sales access. Begin with original delivery WH/OUT/00002 Done for one filter, WH/OUT/00003 Ready for the remaining two, warehouse one reserved one and van two unreserved. Use only genuinely unused, inspected material for a real return; this rehearsal is wholly fictional.

Step-by-step workflow

Return one unused filter, check stock reserved for the open backorder and keep the billing decision under review. This fictional example records no installed material or customer refund.

Step 1. Match the job, parts order and completed delivery

Open S00007 and check its Customer Reference, customer and filter line. Its ordered quantity is 3.00, Delivered 1.00 and Invoiced 0.00. Open Delivery and select the completed WH/OUT/00002, not the outstanding WH/OUT/00003. Check the service-site address and original completed one-filter quantity. Delivery records explain movement to the customer; they do not prove a part was installed or consumed.

Action 1: Match the existing S00007 parts order. The actual target is highlighted in gold.
Match the existing S00007 parts order.
Action 2: Check the correct property customer. The actual target is highlighted in gold.
Check the correct property customer.
Action 3: Open Other Info for the manual job reference. The actual target is highlighted in gold.
Open Other Info for the manual job reference.
Action 4: Match the Customer Reference to Demo Service Job H40 / task 5. The actual target is highlighted in gold.
Match the Customer Reference to Demo Service Job H40 / task 5.
Action 5: Return to the saved filter line. The actual target is highlighted in gold.
Return to the saved filter line.
Action 6: The original ordered quantity is three filters. The actual target is highlighted in gold.
The original ordered quantity is three filters.
Action 7: One filter was delivered before this unused return. The actual target is highlighted in gold.
One filter was delivered before this unused return.
Action 8: Invoiced remains zero. The actual target is highlighted in gold.
Invoiced remains zero.
Action 9: Open this order’s native Delivery list. The actual target is highlighted in gold.
Open this order’s native Delivery list.
Action 10: Choose the original Done WH/OUT/00002, not its backorder. The actual target is highlighted in gold.
Choose the original Done WH/OUT/00002, not its backorder.
Action 11: Check the original delivery remains Done. The actual target is highlighted in gold.
Check the original delivery remains Done.
Action 12: Check the service-site delivery address. The actual target is highlighted in gold.
Check the service-site delivery address.
Action 13: The completed original movement contains one filter. The actual target is highlighted in gold.
The completed original movement contains one filter.
Action 14: Keep S00007 as the original Source Document. The actual target is highlighted in gold.
Keep S00007 as the original Source Document.

Step 2. Record the materials report on the matching task

Open Demo Service Job H40, click Log note and record the parts-order/delivery references, one unused filter, zero used in this synthetic example and the open two-filter backorder. Click Log once. Preserve the original scope and earlier quotation reference. Our pre-return note did not change stock, delivery or billing quantities. This task’s stock/order relationship is a manual reference; no Project material-consumption link was created.

Action 15: Open the app menu for the matching manual job. The actual target is highlighted in gold.
Open the app menu for the matching manual job.
Action 16: Choose Project without changing the stock records. The actual target is highlighted in gold.
Choose Project without changing the stock records.
Action 17: Open the existing Demo Service Jobs H40 board. The actual target is highlighted in gold.
Open the existing Demo Service Jobs H40 board.
Action 18: Open the original manual materials task. The actual target is highlighted in gold.
Open the original manual materials task.
Action 19: Preserve the original task scope and earlier quotation reference. The actual target is highlighted in gold.
Preserve the original task scope and earlier quotation reference.
Action 20: Choose Log note for the internal materials report. The actual target is highlighted in gold.
Choose Log note for the internal materials report.
Action 21: Record zero used and one unused filter in this labelled rehearsal. The actual target is highlighted in gold.
Record zero used and one unused filter in this labelled rehearsal.
Action 22: Review the references and pending two-filter backorder before logging. The actual target is highlighted in gold.
Review the references and pending two-filter backorder before logging.
Action 23: Log this one internal materials report. The actual target is highlighted in gold.
Log this one internal materials report.
Action 24: The saved report is a manual handoff, not a stock movement. The actual target is highlighted in gold.
The saved report is a manual handoff, not a stock movement.

Step 3. Create the return from the completed delivery

Return to WH/OUT/00002 and click Return once. In this runtime it opens a new Draft receipt, WH/IN/00008, with Source Document: Return of WH/OUT/00002. Receive From is the service-site contact and Destination Location is WH/Stock. The copied filter starts with Demand: 0.00. We did not see the proposed quantity/refund wizard, so do not assume a return has already been received.

Action 25: Reopened Done WH/OUT/00002: create one native Return. The actual target is highlighted in gold.
Reopened Done WH/OUT/00002: create one native Return.
Action 26: The new return is Draft, not received stock. The actual target is highlighted in gold.
The new return is Draft, not received stock.
Action 27: Keep the identity of this one generated return. The actual target is highlighted in gold.
Keep the identity of this one generated return.
Action 28: Receive From is the original service-site contact. The actual target is highlighted in gold.
Receive From is the original service-site contact.
Action 29: Check WH/Stock as the destination. The actual target is highlighted in gold.
Check WH/Stock as the destination.
Action 30: The Source Document retains Return of WH/OUT/00002. The actual target is highlighted in gold.
The Source Document retains Return of WH/OUT/00002.
Action 31: The copied filter begins with zero demand. The actual target is highlighted in gold.
The copied filter begins with zero demand.

Step 4. Set the actual return quantity and prepare the receipt

On the copied filter row, set Demand to 1, leave the field by clicking the receipt heading, then Save manually and wait for saving to finish. Click Mark as To Do once. Check Ready, Demand: 1.00 and Quantity: 1.00. This prepares the return; physical internal stock still totals three until validation. Return All and Clear were visible, but this procedure entered only the intended quantity.

Action 32: Edit Demand on the existing copied filter row. The actual target is highlighted in gold.
Edit Demand on the existing copied filter row.
Action 33: Enter only the one unused filter being returned. The actual target is highlighted in gold.
Enter only the one unused filter being returned.
Action 34: Click the receipt heading to commit the final cell. The actual target is highlighted in gold.
Click the receipt heading to commit the final cell.
Action 35: Save the return Demand once and wait. The actual target is highlighted in gold.
Save the return Demand once and wait.
Action 36: Review the saved one-filter demand before preparing it. The actual target is highlighted in gold.
Review the saved one-filter demand before preparing it.
Action 37: Mark this same return as To Do once. The actual target is highlighted in gold.
Mark this same return as To Do once.
Action 38: Ready prepares the return; it has not yet received stock. The actual target is highlighted in gold.
Ready prepares the return; it has not yet received stock.
Action 39: Check one filter Demand and Quantity in the prepared receipt. The actual target is highlighted in gold.
Check one filter Demand and Quantity in the prepared receipt.
Action 40: Retain the original service-site source contact. The actual target is highlighted in gold.
Retain the original service-site source contact.
Action 41: Verify WH/Stock destination before validation. The actual target is highlighted in gold.
Verify WH/Stock destination before validation.

Step 5. Validate once and check net delivered quantity

After confirming the product, location and actual returned amount, click Validate once. Wait for Done. The receipt retains one returned filter and the original transfer reference. Reopen S00007: its original ordered quantity stays 3.00, while Delivered is now 0.00 and Invoiced stays 0.00. The original one-filter delivery remains Done alongside the linked return; it was not deleted or rewritten.

Action 42: Validate this one actual return once. The actual target is highlighted in gold.
Validate this one actual return once.
Action 43: The retained return is now Done. The actual target is highlighted in gold.
The retained return is now Done.
Action 44: Keep the identity of the same WH/IN/00008 return. The actual target is highlighted in gold.
Keep the identity of the same WH/IN/00008 return.
Action 45: The completed return contains one unused filter. The actual target is highlighted in gold.
The completed return contains one unused filter.
Action 46: Reopen the same S00007 parts order after its return. The actual target is highlighted in gold.
Reopen the same S00007 parts order after its return.
Action 47: The agreed ordered quantity still shows three filters. The actual target is highlighted in gold.
The agreed ordered quantity still shows three filters.
Action 48: Net Delivered is zero after one out and one back. The actual target is highlighted in gold.
Net Delivered is zero after one out and one back.
Action 49: Invoiced remains zero; this return created no invoice. The actual target is highlighted in gold.
Invoiced remains zero; this return created no invoice.
Action 50: The order total remains 66.78 pending commercial review. The actual target is highlighted in gold.
The order total remains 66.78 pending commercial review.

Step 6. Check where the returned stock is reserved

Open the filter product and its 4.00 on-hand link to Stock by Location. Under Internal Locations, the saved rows show WH/Stock: 2.00 / Reserved Quantity: 2.00 and WH/Demo Van 01: 2.00 / Reserved Quantity: 0.00. Total physical stock increased three to four, but free stock stays two. Odoo assigned the returned stock to the existing two-filter backorder, which remains Ready and uncompleted. Do not mistake reserved stock for another customer delivery.

Action 51: Open Inventory to review physical stock after the return. The actual target is highlighted in gold.
Open Inventory to review physical stock after the return.
Action 52: Choose the native Inventory app. The actual target is highlighted in gold.
Choose the native Inventory app.
Action 53: Open Products without changing the saved inventory. The actual target is highlighted in gold.
Open Products without changing the saved inventory.
Action 54: Choose Products. The actual target is highlighted in gold.
Choose Products.
Action 55: Open the existing H12-FILTER product. The actual target is highlighted in gold.
Open the existing H12-FILTER product.
Action 56: Match the saved filter before reading its stock. The actual target is highlighted in gold.
Match the saved filter before reading its stock.
Action 57: Physical on hand is now 4.00 Units. The actual target is highlighted in gold.
Physical on hand is now 4.00 Units.
Action 58: Open the native Stock by Location view. The actual target is highlighted in gold.
Open the native Stock by Location view.
Action 59: Keep the Internal Locations stock scope. The actual target is highlighted in gold.
Keep the Internal Locations stock scope.
Action 60: Warehouse stock now shows two units, both reserved. The actual target is highlighted in gold.
Warehouse stock now shows two units, both reserved.
Action 61: WH/Stock physical quantity is 2.00. The actual target is highlighted in gold.
WH/Stock physical quantity is 2.00.
Action 62: WH/Stock Reserved Quantity is also 2.00. The actual target is highlighted in gold.
WH/Stock Reserved Quantity is also 2.00.
Action 63: The van retains two unreserved filters. The actual target is highlighted in gold.
The van retains two unreserved filters.
Action 64: Van Reserved Quantity remains 0.00. The actual target is highlighted in gold.
Van Reserved Quantity remains 0.00.
Action 65: Totals are four physical units and two reserved. The actual target is highlighted in gold.
Totals are four physical units and two reserved.
Action 70: Review the remaining backorder through the existing Delivery list. The actual target is highlighted in gold.
Review the remaining backorder through the existing Delivery list.
Action 71: Open the existing two-filter WH/OUT/00003 backorder. The actual target is highlighted in gold.
Open the existing two-filter WH/OUT/00003 backorder.
Action 72: The backorder remains Ready and uncompleted. The actual target is highlighted in gold.
The backorder remains Ready and uncompleted.
Action 73: Its two-filter Demand and Quantity remain reserved, not delivered. The actual target is highlighted in gold.
Its two-filter Demand and Quantity remain reserved, not delivered.

Step 7. Reconcile the order’s billing policy before invoicing

Check the filter’s Invoicing Policy: Ordered quantities. Although net Delivered is zero after the return, this line still has three units to invoice and the order remains $66.78. No customer invoice, credit note or refund was created. A return did not approve changing the ordered quantity or commercial agreement. Hold the materials billing decision for office review and use the separate agreed-order-change workflow if the scope changes.

Action 66: Return to this same filter product. The actual target is highlighted in gold.
Return to this same filter product.
Action 67: Ordered quantities keeps the commercial billing decision separate. The actual target is highlighted in gold.
Ordered quantities keeps the commercial billing decision separate.
Action 68: S00007 still has three ordered, zero Delivered and zero Invoiced. The actual target is highlighted in gold.
S00007 still has three ordered, zero Delivered and zero Invoiced.
Action 69: The unchanged 66.78 total is not a refund or revised agreement. The actual target is highlighted in gold.
The unchanged 66.78 total is not a refund or revised agreement.

Step 8. Save the final job handoff and reopen the return

On Demo Service Job H40, use Log note to record the completed return reference, one out/one back/net zero, zero used in this rehearsal, the two-filter backorder and ordered-quantity billing exception. Keep this parts task in Office Review / In Progress. Reopen S00007’s 3 Delivery list and the same Done return; it includes the original delivery, backorder and return. Reopening retained one return, not another movement. The separate hourly task and 1.5-hour entry remain unchanged.

Action 74: Open the app menu for the final manual job handoff. The actual target is highlighted in gold.
Open the app menu for the final manual job handoff.
Action 75: Choose Project for the original materials job. The actual target is highlighted in gold.
Choose Project for the original materials job.
Action 76: Open the existing service-job board. The actual target is highlighted in gold.
Open the existing service-job board.
Action 77: Reopen the same manual materials task. The actual target is highlighted in gold.
Reopen the same manual materials task.
Action 78: Keep the original scope and earlier quotation reference. The actual target is highlighted in gold.
Keep the original scope and earlier quotation reference.
Action 79: The materials job stays in Office Review. The actual target is highlighted in gold.
The materials job stays in Office Review.
Action 80: Its separate task status remains In Progress. The actual target is highlighted in gold.
Its separate task status remains In Progress.
Action 81: Choose Log note for the final materials reconciliation. The actual target is highlighted in gold.
Choose Log note for the final materials reconciliation.
Action 82: Record the completed return, reservation and explicit billing hold. The actual target is highlighted in gold.
Record the completed return, reservation and explicit billing hold.
Action 83: Review the one-out, one-back reconciliation before posting. The actual target is highlighted in gold.
Review the one-out, one-back reconciliation before posting.
Action 84: Log this one final internal materials handoff. The actual target is highlighted in gold.
Log this one final internal materials handoff.
Action 85: The saved note keeps open work and billing under office review. The actual target is highlighted in gold.
The saved note keeps open work and billing under office review.
Action 86: Reopen S00007 with its original delivery, backorder and return. The actual target is highlighted in gold.
Reopen S00007 with its original delivery, backorder and return.
Action 87: Open the same three-delivery list without another return. The actual target is highlighted in gold.
Open the same three-delivery list without another return.
Action 88: The list retains the original, open backorder and one Done return. The actual target is highlighted in gold.
The list retains the original, open backorder and one Done return.
Action 89: Reopen that same WH/IN/00008 return. The actual target is highlighted in gold.
Reopen that same WH/IN/00008 return.
Action 90: The retained return identity stays WH/IN/00008. The actual target is highlighted in gold.
The retained return identity stays WH/IN/00008.
Action 91: The saved return remains Done for one filter. The actual target is highlighted in gold.
The saved return remains Done for one filter.
Action 92: Finish on the saved original-transfer reference. The actual target is highlighted in gold.
Finish on the saved original-transfer reference.

Check the result

One original customer delivery remains Done for one filter, and one linked Done return brings that same unused filter back to WH/Stock. Net Delivered on S00007 is zero; physical internal stock is four, with two warehouse units reserved for the existing two-unit backorder and two unreserved in the van. Two internal task notes preserve the before/final reconciliation. The parts task remains under review, and ordered-quantity billing still exposes three invoiceable units. No invoice, credit, refund, order change or automatic Project consumption was created.

If your screen differs

A usage note, customer delivery, physical return and customer refund are different records. This example returned one unused filter and reports zero installed/used; it does not demonstrate recording actual installed-material consumption. The relationship to the manual task is an explicit reference, and the separate hourly task is preserved. The Return action here opens a zero-demand Draft receipt, not the proposed wizard. Review Demand, Quantity and destination before validating. Returned usable stock can immediately become reserved for an existing backorder. With Ordered quantities, zero net Delivered did not reduce the three-unit invoiceable quantity or cancel the two-unit backorder. Do not treat that quantity as approved billing, or mark outstanding work complete.

Frequently asked questions

How do I record materials used on an Odoo job? Keep factual job notes and reconcile them with the correct delivery, return and order. Here the owner noted zero used and one unused filter returned, with explicit manual task/order references. The note alone moved no stock, and a delivery did not establish installation. No automatic Project material-consumption feature was demonstrated.
How do I return unused job parts to Odoo inventory?

Open the original Done customer delivery and choose Return. Our native action created a zero-demand Draft receipt. Set the actual Demand, save, Mark as To Do, check Quantity and destination, then Validate once. The Done return retained the original movement link and increased physical internal stock by one.

Does returning stock automatically refund the customer? This return created no customer invoice, credit note or refund. It reduced net Delivered from one to zero, while the Ordered quantities policy left three units invoiceable and the order total unchanged. Review the commercial agreement and accounting documents separately before billing or refunding.

Continue building the business

Continue with How do I close an Odoo job and prepare it for invoicing?. Keep this parts job’s open backorder and billing decision visible; the separate hourly job can be reviewed on its own records.

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.