Sales¶
1. Purpose¶
Sales turns a customer enquiry into a quotation, a quotation into a confirmed order, and a confirmed order into a delivery and an invoice. It is where selling prices, discounts, payment terms and delivery commitments are agreed and recorded.
It is the bridge between the commercial conversation and the two things that follow from it: stock leaving the warehouse and money becoming due.
2. Features¶
- Quotations with validity dates, sent to customers as PDF or by email
- Conversion of a quotation to a confirmed sales order in one step
- Order lines with product, quantity, unit price, discount, tax and unit of measure
- Pricelists — different prices per customer, per currency, per quantity break, or per date
- Customer-specific payment terms and fiscal positions, defaulted from the customer record
- Automatic creation of the delivery order on confirmation (
sale_stock) - Invoicing on ordered quantity or on delivered quantity, per product
- Down payments and partial invoicing
- Sales teams and salesperson assignment, with per-team reporting
- Customer portal access to their own quotations, orders and invoices
- Sales reporting — by product, customer, salesperson, period
- Order templates for repeat business (
sale_management)
3. Where to find it¶
- Menu: Sales → Orders / Products / Reporting / Configuration
- Technical names:
sale,sale_management,sale_stock - Tier: Odoo core (Community Edition)
- Available in: Odoo 16, 17 and 18
4. Modules used¶
| Module | Tier | Why it is needed |
|---|---|---|
sale |
Odoo core | Quotations, sales orders, order lines |
sale_management |
Odoo core | The Sales app UI, order templates, pricelist management |
sale_stock |
Odoo core | Links sales orders to delivery orders |
account |
Odoo core | Invoicing the order |
product |
Odoo core | What is being sold, and its price and tax defaults |
multi_branch_base |
Third-party (vendor to confirm) | Branch separation of sales documents |
NestERP custom modules that build on Sales¶
| Module | Odoo version | What it adds |
|---|---|---|
sales_order_override |
17 · 18 | Sales order customisation for client-specific rules |
sales_dashboard |
17 | Sales performance dashboard drawing on accounting data |
inventory_dashboard |
16 | Includes sales movement in the stock picture |
thalia_mgmt_dashboard_v17 |
17 | Sales figures inside the consolidated management dashboard |
5. Configuration¶
- Prerequisite — products and taxes must be configured first. A sales order inherits price and tax from the product; configuring Sales before Products means re-doing work.
- Set the invoicing policy default — Sales → Configuration → Settings. Ordered quantities invoices what was sold; Delivered quantities invoices what actually shipped. This can also be set per product and the product wins.
- Enable the features needed: Discounts, Pricelists, Sales Order Templates, Customer Portal, Margins.
- Create pricelists — Sales → Configuration → Pricelists. Decide early whether pricing is per customer, per currency or per volume; retrofitting pricelists after go-live means re-pricing open orders.
- Create sales teams and assign salespeople, if the client reports by team.
- Set the quotation validity default and the order confirmation email template.
- Configure payment terms and fiscal positions on customers — these drive the invoice, not the order.
- Set the delivery lead time on products and the warehouse, so commitment dates are realistic.
Configuration traps
- Invoicing policy is set in two places — a global default and a per-product setting. The product overrides the default. Mixed policies across products in one order produce invoices that look wrong until you check each line.
- Discounts must be enabled before the discount column appears. Salespeople otherwise edit unit prices directly, which destroys margin reporting.
- Pricelists apply by customer, currency and date. A customer with no pricelist gets the product's list price, silently.
- A confirmed order that has been delivered cannot be freely edited. Cancel and re-create, or amend before delivery.
6. How it's used¶
Quotation to cash¶
- Salesperson — Sales → Orders → Quotations → New. Selects the customer; payment terms, pricelist and fiscal position default from the customer record.
- Salesperson — adds order lines, applies any discount, sets the delivery date.
- Salesperson — Send by Email. The quotation moves to Quotation Sent.
- Customer — accepts, in person or through the portal.
- Salesperson — Confirm. The order becomes a Sales Order and the delivery order is created automatically.
- Storekeeper — picks and validates the delivery (see Inventory).
- Accountant — Create Invoice from the order, then confirms and sends it (see Accounting).
- Accountant — registers the payment when it arrives.
Repeat business¶
- Salesperson — starts from a sales order template rather than an empty quotation.
Screenshots needed
Save to docs/assets/sales/: quotation list · quotation form · confirmed sales order with
the Delivery and Invoice smart buttons · pricelist configuration · sales reporting pivot ·
the NestERP sales_dashboard.
7. Access rights¶
| Group | Can do |
|---|---|
| Sales / User: Own Documents Only | Create and manage their own quotations and orders |
| Sales / User: All Documents | See and manage all sales documents |
| Sales / Administrator | All of the above, plus pricelists, teams and configuration |
| Portal (customer) | View their own quotations, orders and invoices |
Multi-company deployments restrict orders by company. Branch-level separation requires
multi_branch_base.
8. Version differences (16 / 17 / 18)¶
- Views use
attrs/states. sale_managementandsale_stockare separate installs on top ofsale.
attrsandstatesremoved from views.sale_managementandsale_stockare required bymulti_branch_baseon this version.- The version of the Thalia reference instance.
<tree>elements superseded by<list>.sales_order_overrideinstalled on 18 with no code changes required during the upgrade, so behaviour is unchanged from 17 as far as our customisation is concerned.
9. Known limitations¶
- No CRM pipeline in this module. Odoo's
crmis a separate Community app; lead and opportunity management is not part of Sales and is not currently in the NestERP stack. - No subscription or recurring billing. Enterprise.
- No electronic signature on quotations. Odoo Sign is Enterprise; portal acceptance is the Community equivalent.
- No commission calculation for salespeople in core.
- No approval workflow on discounts — a salesperson with edit rights can discount without
a second signature. Compare with purchasing, where we added
purchase_multi_approval. - Margin reporting requires the Margins setting, and is only meaningful if product cost is maintained.
Needs verification on the Thalia live instance
- Whether the invoicing policy is ordered or delivered quantities, globally and per product
- Which pricelists exist and how they are assigned
- Whether discounts are enabled
- Whether sales teams are in use
- Whether the customer portal is enabled and actually used by customers
- What
sales_order_overrideactually changes on the live instance - Whether
multi_branch_baseis separating sales by branch