A functional consultant must explain what each click does to stock and to the books. These are the 7 flows that every implementation is built from.
Version note: Odoo 18 = perpetual (automated) valuation posts an entry at every stock move. Odoo 19/20 = no valuation layers and no entry at receipt/delivery; bills and invoices post, and a periodic closing entry + accruals (Accounting > Review > Inventory Valuation) align the stock account. Odoo 20 can post the accruals directly from the report, and late cost changes correct COGS.
Flow 1 · Order-to-Cash (O2C), make-to-stock
CRM Opportunity ─► Quotation ─► Sales Order ─► Delivery (WH/OUT) ─► Customer Invoice ─► Payment ─► Bank reconciliation
| Step | Menu | Stock effect | Accounting (Odoo 18, perpetual, Anglo-Saxon) |
|---|---|---|---|
| Quotation sent | Sales > Quotations | — | — |
| SO confirmed | Confirm | Delivery created; forecast ↓ | — |
| Delivery validated | Inventory > Deliveries | On-hand ↓ | Dr Stock Output / Interim · Cr Stock Valuation |
| Invoice posted | SO > Create Invoice | — | Dr Receivable · Cr Revenue · Cr Tax payable. Anglo-Saxon also: Dr COGS · Cr Stock Output |
| Payment registered | Invoice > Register Payment | — | Dr Outstanding Receipts · Cr Receivable |
| Bank statement matched | Accounting > Bank | — | Dr Bank · Cr Outstanding Receipts |
Configuration you touch: customers (pricelist, payment term, fiscal position), products (Can be sold, invoicing policy, taxes, routes), sales teams, quotation templates, payment providers, follow-up levels.
Variants: down payment (Create Invoice > Down payment %), invoice before delivery (Ordered quantities), deliver from another warehouse, drop-ship (route Dropship: vendor ships to customer, no stock move in your warehouse).
Flow 2 · Procure-to-Pay (P2P)
Reordering rule / MTO / manual ─► RFQ ─► (Approval) ─► PO ─► Receipt (WH/IN) ─► Vendor Bill (3-way match) ─► Payment
| Step | Accounting (Odoo 18 perpetual) |
|---|---|
| Receipt validated | Dr Stock Valuation · Cr Stock Input / Interim Received |
| Bill posted | Dr Stock Input · Dr Input tax · Cr Payable (any price difference → price-difference account / revaluation under AVCO/FIFO) |
| Payment | Dr Payable · Cr Outstanding Payments → bank |
Landed costs (FIFO/AVCO): Inventory > Operations > Landed Costs → link the receipt, add freight/customs → Validate → stock value increases (v20: per product on the transfer).
Controls: PO double-validation threshold, vendor blocking warnings, bill control policy (ordered vs received), Should Be Paid flag, duplicate-bill detection (v19/20 red/yellow levels).
Flow 3 · Make-to-Order manufacturing
SO (product route: MTO + Manufacture) ─► MO auto-created ─► Components picked (1/2/3-step) ─► Work orders (Shop Floor)
─► Quality checks ─► Finished goods to stock ─► Delivery ─► Invoice
| Step | Accounting (Odoo 18) |
|---|---|
| Components consumed | Dr WIP/Production · Cr Stock (component value) |
| Labour/work center cost | Work center cost per hour → goes into the finished product cost (and analytic) |
| Finished product produced | Dr Stock (FG) · Cr Production |
Settings: Work Orders, By-products, Quality, MPS, Subcontracting, Unlock/Lock, Work-order dependencies. Odoo 20 adds continuous production: the next work order starts as soon as some quantity is produced, a work-order Gantt, a single Produce button, and forced flexible consumption.
Flow 4 · Subcontracting (job work)
- BoM type Subcontracting, subcontractor set on the BoM; product bought from the subcontractor (vendor price = service fee).
- PO to the subcontractor → on confirmation a Resupply Subcontractor transfer sends components (if the route is set).
- Receipt of finished goods → Odoo creates and closes the subcontract MO in the background, consuming the components at the subcontractor location.
- Bill for the service. Finished good cost = components + subcontract fee.
Flow 5 · Record-to-Report (month-end close)
| Task | Where |
|---|---|
| Bank reconciliation complete | Accounting dashboard > bank journal |
| Post vendor bills received / accrue the missing ones | Bills to receive; v19+ accruals from the Inventory Valuation report |
| Inventory closing entry (v19/v20) | Accounting > Review > Inventory Valuation > set date > Generate/Post closing entry |
| Depreciation entries | Assets > compute; posted automatically by date |
| Deferred revenue/expense | Deferred entries (start/end dates on lines) |
| Currency revaluation | Reporting > Unrealized currency gains/losses |
| Tax return | Reporting > Tax return (v19: guided with checks) |
| Review P&L, balance sheet, aged AR/AP | Reporting |
| Lock dates | Accounting > Settings > Lock dates (sales / purchases / tax / everything / hard lock) |
Flow 6 · Project / Service billing
SO line (service product) ─► Project + task auto-created ─► Timesheets / milestones / materials / expenses ─► Invoice
| Service invoicing policy | Invoiced quantity = |
|---|---|
| Prepaid / Fixed price | Ordered qty (invoice up-front) |
| Based on Timesheets | Approved timesheet hours |
| Based on Milestones | Reached milestones (% of the line) |
| Based on Delivered Quantity (manual) | What you type in Delivered |
Profitability: project dashboard (revenues from invoiced SO lines, costs from timesheet cost = employee hourly cost, purchase bills and expenses on the analytic account). In Odoo 20 this moves into dedicated reports.
Flow 7 · Hire-to-Retire (HR)
Recruitment (job → applicant → contract offer) → Employee + contract → Attendance / Time Off / Expenses → Payroll (work entries in v18–19; removed in v20, pay runs rebuilt) → Payslip posting (Dr Salary expense / Cr Salary payable, statutory liabilities) → Payment → Appraisal → Departure (archive).
Odoo 20 licence warning: every active employee record not linked to a user is billed as a Light User. Archive former employees.