Skip to content
ERP Expert

Station 5 of 10

Sales cycle in Odoo: quotation to collection

Ahmed Hassan Algammal6 min read

What you leave this station with

A full sales cycle executed, a settled understanding of on hand versus reserved versus forecast, and of the moment revenue is recognised alongside the cost-of-goods-sold entry.

Purchasing taught you when an event becomes an entry. Sales teaches something finer: when a quantity becomes a particular customer’s, and when revenue becomes revenue.

Both questions read as theory until you meet their consequences — selling a quantity that exists in a report and not on the shelf, or a month’s profit that appears and then vanishes at the close.

The cycle itself mirrors purchasing, so it needs no explanation from scratch. What needs explaining is where the two diverge.

The cycle, and what each step moves

Step Document Stock effect Accounting effect
1 Quotation None None
2 Confirmed sales order Quantity reserved None
3 Confirmed delivery Quantity actually leaves Cost-of-goods-sold entry — under perpetual valuation
4 Posted customer invoice None Revenue, tax and receivable
5 Posted receipt None An entry

Compare this against the table at station four, row by row. The structure is identical, and the substantive difference is on row two: a confirmed sales order does something to stock, and a confirmed purchase order does not. That difference is the subject of the first half of this station.

When quantity is reserved — the precise answer

Odoo distinguishes three numbers per item, and most people reading the inventory screen conflate them.

Number What it means What moves it
On hand What is physically on the shelf right now The delivery
Reserved Part of on hand, now committed to a specific order Confirming the order
Available On hand minus reserved — what can be sold today Both
Forecast Available plus incoming minus planned outgoing Planning

Reservation happens when the sales order is confirmed, not at delivery. The reserved quantity stays on hand — it has not left the warehouse — but it can no longer be sold to anyone else. Which is why a salesperson sees a balance of 100 and the system refuses to sell 20: because 90 are reserved against earlier confirmed orders. The system is right and the reader is reading the wrong column.

From which comes a practical rule worth writing down: the column that decides whether you can sell today is available, not on hand. Build a report or a decision on on-hand and you sell what is already sold.

Try this now: create two sales orders for the same item at a quantity the balance covers only once. Confirm the first, attempt to confirm the second, and watch both columns. That exercise alone justifies the station.

When revenue is recognised — the precise answer

Here sits the most famous confusion in accounting inside any ERP, and Odoo’s behaviour is unambiguous:

Revenue is recognised when the invoice is posted. Not at delivery, and not on collection.

Three consequences follow immediately:

  1. Goods delivered and not invoiced produce no revenue. These are the deferred invoices that make a month’s sales lower than the truth. The “to invoice” report is the first thing you open before closing.
  2. A posted, uncollected invoice is revenue in full. Revenue does not wait for cash. This is why a company can be profitable on paper and insolvent in cash, and it is not a defect in the system — it is the accrual principle.
  3. A customer advance is not revenue. It is a liability until you deliver. Record it as revenue and you inflate this month’s profit and deflate next month’s.

The entry everybody forgets to read

Confirming the delivery under perpetual valuation generates an entry well before the invoice:

  • Debit: cost of goods sold
  • Credit: stock

That entry never passes across a sales screen, which is exactly why most learners never open it. And it is half of the profit calculation: the invoice records the revenue, the delivery records the cost. Neither alone completes the margin.

This is also the source of a real problem that recurs at every close: if goods are delivered in one month and invoiced in the next, the cost falls in one period and the revenue in another — so the first looks loss-making and the second unusually profitable, with no operational cause. The fix is administrative rather than technical: invoice in the month of delivery. But someone who does not know the two entries are separate does not know where to look.

Read both entries together after you run the cycle and compute the difference by hand. That difference is your margin, and you will measure it numerically at station six.

Partial invoicing and the cases that actually occur

After the simple cycle, run three more, because these are the common ones in practice.

Partial delivery, invoiced on what was delivered. Deliver half the quantity and invoice only that half. Watch the order stay open, and watch the “to invoice” report know the remainder exactly.

An advance before delivery. Record it and open the entry: you will find it in a liability account and not in revenue, until the goods ship and the final invoice is issued.

A return and a credit note. Take a quantity back after invoicing. Two reversing entries appear: the revenue reversed by the credit note, and the cost of goods sold reversed as the goods come back in. Predict both before you see them and you have understood stations four and five together.

The acceptance test for this station

  1. Run a full sales cycle, read the delivery and invoice entries, and compute the margin by hand from them.
  2. Explain in one sentence the difference between on hand and available, then prove it with two sales orders competing for the same balance.
  3. State exactly when the revenue entered the income statement, and prove it from the entry date.
  4. Run a partial delivery and a partial invoice, and open the “to invoice” report.
  5. Run a return with a credit note, and confirm that revenue and cost reversed together rather than one of them.

If you want the same cycle in its accounting logic, independent of any product, it is set out in order to cash. What this product ships in the sales cycle, and where it needs an additional module, is detailed in the Odoo guide.

What comes next

You now have two cycles executed and four entries you can read with confidence. The next station answers the question standing behind all of them: at exactly what figure did the item leave stock? — because the costing method produces a different margin from identical data, and the difference is measured in numbers rather than read in a definition.