Skip to main content

Sales Order Balances

The Sales Order Balances report answers a single operational question: "What does the team still need to ship?"

It lists every confirmed sales order line that hasn't been fully delivered yet, with the open balance and dollar value.

Navigation: Sales → Reporting → Sales Order Balances

Default view: grouped by Customer, filtered to With Order Balance (lines where balance > 0).

Sales Order Balances list

(Filter With Order Balance removed in the screenshot above to show how the columns are populated — the default view hides lines where balance has reached 0.)


Columns

ColumnMeaning
CustomerBill-to partner from the SO.
S.O. NumberSource sales order.
Date OrderWhen the SO was confirmed.
Due DatePromised delivery date for the line.
Customer ReferenceThe customer's PO number or reference.
SO Ref1Internal reference.
Item CodeInternal product code.
Part NumberVendor / customer-facing part name.
QuantityOriginally ordered quantity.
DeliveredNet shipped — delivered minus refund returns (Odoo standard qty_delivered).
ReturnedSum of done customer returns flagged for refund. Visibility column.
CancelledSum of stock moves on cancelled pickings for the line.
Order BalanceWhat still needs to be shipped (see below).
Unit PriceSO line unit price.
AmountOrder Balance × Unit Price — open dollar value.
Delivery DatesHistory of done moves. +qty = outgoing delivery, -qty = customer return.

How the balance is computed

Order Balance = Quantity − Delivered − Returned − Cancelled

The Returned subtraction is what makes a fully-returned-for-refund SO drop off the report:

  • Customer was sent N, returned N for refund: Delivered = 0 (Odoo nets refund returns out), Returned = N.
  • Order Balance = N − 0 − N − 0 = 0 → SO is treated as operationally complete.

If a customer return was not flagged for refund (e.g. for repair / replacement), the line stays on the report because operationally we still owe them a re-delivery.


Reading common situations

Normal in-flight SO:

QuantityDeliveredReturnedCancelledBalance
1,00060000400

400 still to ship.

Fully delivered:

QuantityDeliveredReturnedCancelledBalance
1,0001,000000

Drops off the default view.

Customer returned everything for refund:

QuantityDeliveredReturnedCancelledBalance
1,00001,00000

SO is operationally finished — drops off the report. The Returned column shows what came back.

Return for replacement (to_refund = False on the return):

QuantityDeliveredReturnedCancelledBalance
1,0001,000000

The return doesn't affect the report — operationally the goods were delivered. Repair / replacement is tracked separately.


Reading Delivery Dates

The history string uses signed quantities so you can see at a glance what happened:

04/15/2026(+1,000), 04/27/2026(-1,000)

  • +1,000 on 04/15 — outgoing delivery validated
  • -1,000 on 04/27 — customer return validated

If you only see + entries, the SO is purely on the outbound path. Any - entry means a return happened for that line.