All posts
Integrator9 min read

Odoo pricelist configuration: rule types, B2B vs B2C discount modes, and currency-based pricing

Pricelists in Odoo give you fine-grained control over pricing by customer, product category, quantity, and date range. This guide walks through every rule type, explains the difference between B2B and B2C discount modes, and shows how to configure multi-currency pricelists correctly.

Enabling pricelists#

Pricelists are off by default. Enable them at Sales → Configuration → Settings → Pricing → Pricelists.

Once enabled, pricelists appear in Sales → Configuration → Pricelists and can be assigned to customers on the partner form (Sales & Purchase tab → Pricelist).

Pricelist structure#

Each pricelist has:

  • Currency - all prices in the pricelist are expressed in this currency
  • Rules (formerly called "items") - ordered list of pricing conditions
  • Configuration - whether to show discounts on sales orders

Rules are evaluated in order. The first rule that matches the product, quantity, and date determines the price. If no rule matches, Odoo falls back to the product's standard sales price.

Rule types#

Fixed Price#

Sets an absolute price for a product or product category, regardless of the product's list price.

Use case: a special contract price for a key account customer.

Discount on List Price#

Applies a percentage discount to the product's Sales Price (the price on the product form).

Use case: a tiered reseller program where platinum resellers get 20% off list.

Formula#

The most flexible rule type. You define:

  • Based on: Other Pricelist, Sales Price, or Cost Price
  • Minimum Quantity: quantity threshold
  • Discount: percentage to subtract from the base
  • Price Surcharge: fixed amount to add after the discount
  • Rounding Method: round up to the nearest cent, 0.05, or custom value
  • Minimum Margin: Odoo will not go below this gross margin percentage

Scope: what a rule applies to#

Each rule can be scoped to:

  • All Products - applies broadly, useful for a flat site-wide discount
  • Product Category - internal product category (not the POS category)
  • Product - a specific product template
  • Product Variant - a specific variant (useful for size/color-based pricing)

More specific scopes take precedence over broader ones within the same rule rank.

Date ranges#

Every rule can have Start Date and End Date fields. Rules outside their date range are skipped entirely. This lets you configure promotional pricing in advance and forget about it - when the dates are outside range, Odoo evaluates the next matching rule automatically.

B2B vs B2C discount mode#

The Discount Policy setting on each pricelist controls how discounts appear on sales orders:

"Discount included in the price" (default): The discounted amount is silently folded into the unit price. A product with list price €100 sold at 20% discount shows €80 in the unit price field with no visible discount percentage. Standard for B2B where you do not want to reveal your list price.

"Show public price & discount to the customer": The sales order line shows the original list price and the discount percentage separately. The customer can see they are receiving 20% off. Typical for B2C promotions or website sales.

To change the policy per-pricelist: open the pricelist → Configuration tab → Discount Policy.

Multi-currency pricelists#

When you sell internationally, create a separate pricelist per currency. Each pricelist has its own currency field, and all rule amounts are in that currency.

Currency conversion at order time: If a product's list price is in EUR and the customer's pricelist is in USD, Odoo converts using the exchange rate defined in Accounting → Configuration → Currencies.

Fixed prices bypass conversion: A "Fixed Price" rule specifies the exact amount in the pricelist's currency - no conversion happens. Use this for contractual prices that must not fluctuate with exchange rates.

Assigning pricelists#

  • Per customer: Partner form → Sales & Purchase tab → Pricelist
  • Per sales team: Sales Team configuration → Default Pricelist
  • Per e-commerce country group: Website → Configuration → Countries → assign pricelist per country group
  • Manually on order: The pricelist field is visible on the sales order header and can be changed before confirming

Common mistakes#

Rule order matters: Two overlapping rules will both match - Odoo uses the one listed first (lowest sequence number). Always put more specific rules above general ones.

"Other Pricelist" reference loops: A formula rule that references another pricelist which references back will cause a recursion error. Keep pricelist hierarchies as a directed tree.

Currency on product vs pricelist: If a product has a vendor price in GBP but your pricelist is EUR with a cost-based formula, Odoo converts the cost using the current rate, not the historical rate at time of purchase.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free