Products¶
1. Purpose¶
Products are the catalogue of everything the business buys, sells, stocks or charges for. Every sales line, purchase line, stock move and invoice line points at a product, and the product carries the defaults — price, tax, unit of measure, accounts — that those documents inherit.
A badly configured product catalogue produces wrong prices, wrong taxes, wrong stock valuation and empty dashboards, all at once and all silently.
2. Features¶
- Product records with internal reference, barcode, and sales and purchase descriptions
- Product categories, hierarchical, carrying costing method and valuation configuration
- Product types — storable, consumable and service — determining whether stock is tracked
- Units of measure, with conversion inside a UoM category (buy in cartons, sell in pieces)
- Separate purchase and sales units of measure per product
- Sales price and cost, with cost maintained by the costing method
- Product variants from attributes — size, colour, capacity — as one template with many variants
- Taxes defaulted per product for both customer and vendor documents
- Income and expense accounts per product or per category
- Product packagings
- Vendor pricelists per product, with lead times and minimum quantities
- Images and product presentation
- Archiving, so discontinued products leave the selection lists without breaking history
3. Where to find it¶
- Menu: Inventory → Products → Products, and the equivalent under Sales and Purchase
- Technical name:
product - Tier: Odoo core (Community Edition)
- Available in: Odoo 16, 17 and 18. Required directly by our Odoo 16 and 17 modules.
4. Modules used¶
| Module | Tier | Why it is needed |
|---|---|---|
product |
Odoo core | Products, templates, variants, categories, units of measure, pricelists |
uom |
Odoo core | Units of measure. Split into its own module in Odoo 18; part of product before that. |
stock |
Odoo core | Only if stock is tracked — gives the product on-hand quantities |
account |
Odoo core | Income and expense accounts, and product taxes |
NestERP custom modules that build on Products¶
| Module | Odoo version | What it adds |
|---|---|---|
inventory_dashboard |
16 | Product-level stock dashboard |
aegis_dg |
16 | Dangerous-goods classification on products |
5. Configuration¶
- Agree the category tree with the client first. Categories carry costing method and valuation, so the tree is an accounting decision, not a merchandising one.
- Create product categories — Inventory → Configuration → Product Categories. On each, set the Costing Method and Inventory Valuation, and if valuation is automated, the stock input, output and valuation accounts.
- Enable Units of Measure — Inventory → Configuration → Settings. Without this, every product is transacted in Units only.
- Create units of measure and their categories if the client buys and sells in different units. Conversion only works inside a single UoM category.
- Enable Variants if products differ by attribute, then create the attributes and their values before creating templates.
- Create the products. For each: internal reference, category, type, sales price, cost, customer and vendor taxes, and the units of measure.
- Set the product type correctly. This decides whether stock exists — see the Version differences section, because the field changed in Odoo 18.
- Add vendor pricelists on the Purchase tab for products that are bought.
- Set income and expense accounts where they should differ from the category default.
Configuration traps
- Product type is the single most consequential field on the record. Get it wrong and the product holds no stock, appears in no inventory report, and is invisible to dashboards that filter on storable products. We have hit this in production: on the Odoo 16 inventory system, newly created products defaulted to the wrong type and were silently missing from the dashboard.
- Costing method and valuation live on the category, not the product. A product inherits whatever category it is filed under.
- Unit of measure cannot be changed once a product has stock moves. Odoo blocks it, correctly. Decide the buying and selling units before go-live.
- UoM conversion only works within a UoM category. Cartons and kilograms cannot convert to each other.
- Taxes default from the product, then get overridden by the customer's fiscal position. When a tax looks wrong on an invoice, check both.
6. How it's used¶
Creating a product¶
- Storekeeper or Product Manager — Inventory → Products → Products → New.
- Sets name, internal reference, product type and category.
- Sets the sales price, and the cost if the costing method is Standard.
- Sets the units of measure for purchase and sale.
- Confirms the customer and vendor taxes.
- Adds vendors and their prices on the Purchase tab.
Day-to-day¶
- Purchasing — selects products on purchase orders; price and UoM default from the vendor pricelist.
- Salesperson — selects products on quotations and sales orders; price and tax default from the product and pricelist.
- Product Manager — archives discontinued products rather than deleting them, so historical documents stay intact.
Screenshots needed
Save to docs/assets/products/: product list view · product form General Information tab
· product form Purchase tab with vendor pricelist · product category showing costing and
valuation · units of measure configuration · a variant template with its attributes.
7. Access rights¶
| Group | Can do |
|---|---|
| Sales / User | Read products, select them on documents |
| Inventory / User | Read products and see stock quantities |
| Inventory / Administrator | Create and edit products, categories and units of measure |
| Manage Product Variants | Unlocks attributes and variant creation |
| Manage Multiple Units of Measure | Unlocks the UoM fields |
Products can be shared across companies or restricted to one. A product with no company set is visible to all companies — usually what a client wants for a shared catalogue, and occasionally a surprise in multi-company deployments.
8. Version differences (16 / 17 / 18)¶
- Product type is the
typefield: Storable Product, Consumable, Service. Stock is tracked only for storable. detailed_typealso exists alongsidetype, and the two can disagree if records are created programmatically — a real trap we hit on the Odoo 16 inventory system, where new products ended up invisible to the dashboard.- Units of measure are part of the
productmodule.
- Same product type model as 16.
attrsandstatesremoved from view definitions.
- Storability moved out of
typeinto a separate boolean,is_storable.typenow carries only consumable and service. Any domain, filter, report or dashboard testingtype == 'product'returns nothing on Odoo 18.
This is not theoretical: it was the one and only fix stock_dashboard needed for its
v18 upgrade. Check every product-type test when porting a module to 18.
- uom is a separate module rather than part of product.
- <tree> elements superseded by <list>.
9. Known limitations¶
- No product lifecycle management or engineering change orders. Enterprise.
- No native multi-vendor price comparison beyond the vendor pricelist.
- Variant explosion is not managed — attributes with many values generate every combination unless variants are created selectively.
- Product images are single-image per product in core; extra media requires the website module.
- No approval on price changes — anyone with product-edit rights can change a sales price or cost.
- Barcode fields exist, but barcode scanning workflows are Enterprise (
stock_barcode).
Needs verification on the Thalia live instance
- The product category tree, and the costing method and valuation on each
- Whether Units of Measure and Variants are enabled
- How products are typed — and whether any storable products are mistyped
- Whether products are company-specific or shared across companies
- Whether vendor pricelists are maintained, or prices entered per order
- Which taxes are defaulted on products, and whether fiscal positions override them