4.3 Pricing: price lists, discounts & product variants
Key Takeaways
- A pricelist applies rules scoped by minimum quantity, date validity, and customer or country group, computing price as a fixed price, a discount percentage, or a formula.
- Formula rules derive price from the sales price, the cost, or another pricelist, then apply discounts, surcharges, margin floors, and rounding.
- Manual per-line discounts require enabling the Discounts setting, whereas pricelists can apply discounts automatically.
- Coupon and promotion programs run campaign rewards such as buy-X-get-Y and code-based discounts, operating independently of pricelists.
- Product variants are generated from attributes and values where each value can add an extra price, while units of measure and tax-included versus tax-excluded pricing are configured separately.
Configuring prices in Odoo 19
Pricing in Odoo starts simple and scales to complex rules. Every product has a Sales Price on its form — the default amount charged to customers. On top of that base, pricelists, discounts, coupons and promotions, taxes, units of measure, and product variants shape the final price on an order line. The functional exam expects you to know which tool does what and when each applies.
Pricelists
A pricelist is a set of rules that adjust prices for particular conditions. Enable pricelists under Sales ▸ Configuration ▸ Settings ▸ Pricelists, choosing between two modes: Multiple prices per product (simple fixed prices per pricelist) or Advanced price rules (discounts, formulas) for the full rule engine. Each rule can be scoped by several conditions:
| Condition | Example |
|---|---|
| Minimum quantity | Buy 10 or more, get a lower unit price (volume break) |
| Date validity | A promotional price valid only within a start/end date range |
| Product / category | Rule targets one product or an entire product category |
| Customer | Pricelist assigned to a customer or a country group |
A rule computes the price in one of three ways:
- Fixed Price — an exact amount, ignoring the product's list price.
- Discount — a percentage off the sales price.
- Formula — derive the price from the sales price, the cost, or another pricelist, then apply a discount or surcharge, enforce a margin floor and price rounding, and optionally cap it with minimum/maximum margins.
Pricelists are assigned to customers on the contact record (Sales & Purchase tab) or to a country group; the applicable pricelist is selected automatically on the quotation, and a rep can switch it manually. Every database ships with a default (public) pricelist used when a customer has none assigned, so pricing always resolves. A worked formula example: a rule "based on Sales Price, discount 15%, rounding to 0.05, minimum margin 10%" starts from the list price, cuts 15%, rounds the result to the nearest five cents, and refuses to drop below a 10% margin over cost — this is how customer-segment and geographic pricing is achieved without editing each product.
Discounts on order lines
To grant an ad-hoc discount on a specific line, enable the Discounts setting in Sales configuration; this adds a Discount % column to order lines. Pricelists can apply discounts automatically, but the manual discount column requires this setting to be on. Access rights can restrict which users may apply or exceed discounts.
Coupons and promotion programs
Odoo's Coupons & Promotions feature (a Sales setting) adds two program types that operate independently of pricelists:
- Promotion programs — automatic rules such as "buy 2 get 1 free," "10% off orders over $100," or free shipping, applied automatically once conditions are met.
- Coupon programs — generate codes that a customer enters (in eCommerce, POS, or on a sales order) to unlock a reward.
These are ideal for marketing campaigns and time-boxed offers, whereas pricelists define the ongoing base price a customer sees.
Taxes: included versus excluded
Product prices can be interpreted as tax-excluded (tax is added on top at the order) or tax-included (the displayed price already contains the tax). This is governed by the product's customer taxes and the company price setting. Tax-included pricing is common in B2C retail and many countries, while tax-excluded is typical B2B. Fiscal positions can automatically remap taxes based on the customer's country or status, but the included-versus-excluded choice is fundamental to how the sales price itself is read on the order.
Units of measure
With the Units of Measure setting on, a product can have a sales UoM that differs from its purchase or stock UoM, as long as both belong to the same UoM category (for example, Unit, Weight, Volume). Odoo converts quantities automatically using the category's conversion factors — you might purchase in "Box of 12" yet sell in single "Units," and stock stays consistent.
Product variants and extra prices
Variants let one product template carry many sellable versions. You define attributes (such as Size and Color) and their values (Small/Medium/Large, Red/Blue), and Odoo generates a variant for each combination. Crucially, each attribute value can add an extra price — for example "Large: +$5" — which is added to the template's base sales price whenever that variant is chosen. Variant creation can be set per attribute to generate all combinations instantly, create them dynamically (only when actually sold), or never (attributes appear as options with no separate variant records). Attributes also render as configuration choices in the eCommerce shop and on quotations.
Bringing it together, remember the hierarchy of pricing tools: the product Sales Price is the base; pricelists adjust it by rule (fixed, discount, or formula) for quantity, date, and customer; the Discounts setting enables manual line discounts; coupons and promotions run campaign rewards; taxes decide tax-in versus tax-out; units of measure convert quantities; and variant extra prices add attribute-based surcharges. Knowing which lever to pull for a given scenario is exactly what the certification tests.
Which pricelist computation type sets a specific amount regardless of the product's list price?
How do you make a product attribute value add to the sales price, for example so a larger size costs more?
What must be enabled in Odoo 19 to show a manual discount column on sales order lines?