In Odoo 19 every product has one of three types: Goods, Service or Combo. Stock tracking is a separate Track Inventory checkbox on goods. Variants come from attributes, units of measure no longer use categories, and pricelists hold rule-based prices per customer group, quantity or period. Get the product master right before you import thousands of SKUs; it is the hardest thing to fix later.
This is part 8 of our Odoo 19 guide, after quotations and sales orders. Products and pricelists are a shared base module (Products & Pricelists, Community) used by Sales, Purchase, Inventory, Point of Sale and eCommerce alike.
Product types in Odoo 19: Goods, Service and Combo
The Product Type field has three values. In the database they are consu, service and combo; Goods is the default.
| Type | Use it for | Notes |
|---|---|---|
| Goods | Anything physical you sell or buy | With Inventory installed, tick Track Inventory to manage stock quantities; leave it off for consumables you do not count |
| Service | Labour, consulting, installation, AMC contracts | Can be invoiced on ordered or delivered quantities, milestones or timesheets |
| Combo | Meal deals, bundles, "choose one from each group" offers | Built from combo choices, each a list of products with optional extra prices; used in Sales, POS and eCommerce |
If you are coming from Odoo 17 or earlier, the old "Storable Product" and "Consumable" types have gone. They are now one type, Goods, plus the Track Inventory checkbox. Once tracking is on you can also choose tracking by quantity, lots or unique serial numbers. Migration scripts map the old values, but check a sample after any upgrade.
For Indian companies, the product also carries an HSN/SAC Code field from the Indian localisation. It flows to invoices and to POS receipts, so fill it at product-creation time, not at GST-return time.
Variants and attributes
Turn on Variants in the Sales (or Inventory) settings. Attributes such as Size or Colour, and their values, are defined once. Each product template then picks the attributes and values it uses. Each value can carry an extra price on top of the template's sales price.
The key setting is on the attribute: Variant Creation.
- Instantly creates a variant for every combination as soon as you save. Each variant can have its own barcode, internal reference, cost and stock.
- Dynamically creates a variant only when that combination is first added to an order. This suits made-to-order configurations.
- Never does not create variants at all. The value is recorded as a description on the order line, which suits engraving text, gift wrap or a "no onions" choice.
Odoo caps instant generation at 1,000 new variants per template by default (the system parameter product.dynamic_variant_limit). If you hit it, the model is wrong, not the limit. Three sizes by four colours is a variant problem; forty lengths by sixty finishes is usually a "Never" attribute plus a price rule. The Multi-checkbox display type only works with "Never", because a single variant cannot hold several values of the same attribute.
Other display types (Radio, Pills, Select, Color, Image) only change how the choice looks on the configurator, the website and in POS.
Units of measure and packagings in Odoo 19
Odoo 19 simplified units of measure. UoM categories are gone. Each unit now has a Reference Unit and a Contains factor: a Pack of 6 contains 6 Units, and a kg contains 1,000 g. Enable Units of Measure & Packagings in the settings and manage them under Sales › Configuration › Units & Packagings.
Packagings are now additional units on the product itself (the Packagings field): a box of 24 or a pallet of 40 boxes becomes a unit you can sell in. The purchase unit is set per vendor line on the product's vendor pricelist. That is where "we buy in cartons, sell in pieces" belongs.
Unit Reference Contains Units — 1 Pack of 6 Units 6 g — 1 kg g 1000 Box/24 Units 24 ← your own packaging
Pricelists and price rules
Enable Pricelists in Sales settings, then open Sales › Products › Pricelists. A pricelist has a currency, optional country groups (and a website, if you use eCommerce), and a set of rules. Each rule has:
- Apply On: All Products, Product Category, Product or Product Variant.
- Price Type: Discount (a percentage off), Formula, or Fixed Price.
- Based on (for formulas): Sales Price, Cost or Other Pricelist, with a discount, a surcharge, rounding, and minimum and maximum margins.
- Minimum quantity and a start and end date, for quantity breaks and time-limited promotions.
When several rules match, the most specific wins: variant, then product, then category, then all products, with higher minimum quantities checked first. Assign a pricelist to a customer on the contact form, in the Sales & Purchase tab, so dealers, distributors and retail customers each get their own prices automatically.
How the price shows on the quote matters to customers. If you enable the Discounts setting, Discount-type rules appear on the order line as the list price with a visible discount percentage. Formula and Fixed Price rules simply change the unit price. Use Discount rules when your customer expects to see "MRP less 15%"; use Formula or Fixed when the net price is the price.
Price by rule, not by hand. Every manual discount a salesperson types is a margin decision nobody reviewed.
A sensible order to set up the product catalogue
- Agree product categories, since they drive accounting properties and pricelist rules.
- Decide Goods vs Service vs Combo, and Track Inventory, for each product family.
- Define units and packagings before importing products.
- Create attributes and choose the Variant Creation mode for each.
- Import products with HSN/SAC codes, taxes, barcodes and vendor lines.
- Build pricelists last, as rules on categories rather than thousands of fixed prices.
If you are moving from Tally, expect the stock item master to need restructuring. Tally's stock groups and units rarely map one-to-one to Odoo categories, variants and packagings, and it is cheaper to redesign them than to import them as they are.
Next in the series: selling these products over the counter with Odoo 19 Point of Sale for retail and restaurants. For help restructuring a messy item master, see our Odoo implementation service.
Questions we get asked
What are the product types in Odoo 19?
Odoo 19 has three product types: Goods, Service and Combo, stored as consu, service and combo. Goods is the default. Whether goods are stock-managed is controlled by a separate Track Inventory checkbox, which replaced the old Storable Product type. Combo products bundle choices from groups of products, for example a meal deal or a gift hamper.
What happened to storable products in Odoo 19?
The separate Storable Product type no longer exists. Since Odoo 18, physical items are all of type Goods, and ticking Track Inventory on the product makes Odoo manage stock quantities, with optional tracking by lots or serial numbers. When a database is upgraded, former storable products become Goods with Track Inventory enabled.
When should I use variants instead of separate products in Odoo?
Use variants when products share a name, description and most settings but differ by attributes such as size or colour, and each combination needs its own stock, barcode or cost. Use separate products when items differ in category, taxes or vendors. For choices that do not need stock, such as engraving, set the attribute's Variant Creation to Never.
How do pricelist rules decide which price applies in Odoo 19?
Odoo looks at the rules on the customer's pricelist that match the product, quantity and date. The most specific rule wins: product variant first, then product, then product category, then all products, and higher minimum quantities are checked before lower ones. A rule can give a discount, a formula based on price or cost, or a fixed price.