How-toOdoo (Sales)Sales / Pricelists

Odoo Multiple Prices per Product: How to Use Pricelists

Question
odoo multiple prices per product

Also searched as

  • odoo sales price list
  • odoo pricelist by customer
  • odoo price by quantity

Short answer

Odoo handles multiple prices per product with pricelists. Enable pricelists in Sales settings, create one pricelist per customer group, currency or channel, add rules by product, category or quantity, and assign the pricelist to a customer or choose it on the quotation. Rules can be a fixed price, a discount percentage or a formula based on another price.

Applies to: Odoo Sales (Community and Enterprise), recent versions. Menu names and setting labels vary slightly between versions, for example Odoo 16, 17 and 18.

Set up multiple prices with pricelists

  1. 1Go to Sales > Configuration > Settings and, under Pricing, enable Pricelists. In some versions you also choose between simple discounts and advanced price rules.
  2. 2Open Sales > Products > Pricelists (the path may be under Configuration in your version) and click New.
  3. 3Name the pricelist, set its currency, and optionally the company and website or country groups it applies to.
  4. 4On the Price Rules tab, add a rule. Choose Apply On (all products, a product category, a product or a variant) and set the minimum quantity if the price depends on volume.
  5. 5Choose the computation: Fixed Price, Discount, or Formula. For a formula, base it on Sales Price, Cost or another pricelist, with optional rounding and margins.
  6. 6Set start and end dates if the price is temporary.
  7. 7Assign the pricelist to customers on the contact form under the Sales and Purchase tab, or select it on the quotation.
  8. 8Create a quote and check that the unit price follows the rule. If it does not, review rule order and conditions.

How Odoo picks the price

For each order line Odoo looks at the pricelist rules in sequence, and applies the first rule that matches the product, quantity and date. More specific rules, such as a particular product with a minimum quantity, must sit above general rules such as all products.

If no rule matches, Odoo uses the product's own sales price. This is why it pays to keep a general fallback rule at the bottom of each pricelist.

Common patterns

By customer group: one pricelist for distributors, one for retail, assigned on the contact. By volume: several rules for the same product with different minimum quantities. By currency: one pricelist per currency, with fixed prices or a conversion formula.

For website sales, pricelists can be selected by country group, or by customer login. Test as a visitor and as a logged-in customer, since they can see different prices.

Checking prices in practice

If a customer sees the wrong price, check three things: which pricelist is on the contact, which pricelist is on the quotation (it can be changed after creation), and the rule order inside the pricelist. Changing the pricelist on a quotation may require updating lines to recompute prices.

For imports of many prices, export an existing pricelist, edit it in a spreadsheet and import it back, instead of typing rules by hand.

Try it here, free

Odoo Manufacturing Technical Model Names Reference

Open full tool

Searchable lookup of the Odoo models behind manufacturing, inventory, purchasing and sales, with the fields you query most.

Common pitfalls

  • !Forgetting to enable pricelists in settings.
  • !Putting a general rule above a specific one, so the specific rule never fires.
  • !Changing the pricelist on an existing quotation and not recomputing the lines.
  • !Mixing currencies without checking the conversion rule.
  • !Leaving expired rules in place with no end date.
  • !Assuming variant prices follow the template price when a rule applies to the template only.

How an ERP-grounded AI assistant handles this

Why did this customer get that price is a classic investigation across contact, pricelist, rule order and date. A grounded assistant like ERPray can read the pricelist tables and the quotation line, show the query, and name the rule that applied. It reads only, so changing prices stays a human decision, and it can run on-prem where pricing data should not leave.

Frequently asked questions

Can one Odoo product have several prices?

Yes. Use multiple pricelists or several rules in one pricelist, by customer group, quantity, currency or date.

How do I give a customer their own price?

Create a pricelist for the customer, add rules for their products, and set it on their contact form.

Where do I set a quantity-based price?

In a pricelist rule, set Min. Quantity. Add one rule per price break and order them from most specific to least.

Why is my pricelist price not applied?

Often the wrong pricelist is on the quotation, a general rule sits above the specific rule, or the date range does not match.

Related

How-to

Odoo External API: Authenticate and search_read with XML-RPC and JSON-RPC

Call the Odoo external API by authenticating against /xmlrpc/2/common to get a user id, then calling execute_kw on /xmlrpc/2/object with the database, uid, password or API key, model name, method and arguments. If authenticate returns False, the database name, login, or API key is wrong, or two-factor is enforced for that user.

How-to

Odoo Manufacturing API: Working with mrp.production and mrp.bom

Odoo exposes manufacturing through its normal external API: the models mrp.bom (bills of materials), mrp.production (manufacturing orders) and mrp.workorder, called via XML-RPC or JSON-RPC with execute_kw. Authenticate, search and read the BOM, create a manufacturing order, then call its action methods such as action_confirm to move it through states. There is no separate manufacturing API.

How-to

Odoo Studio Custom Fields: Export, x_studio Names and Upgrade Risk

Odoo Studio saves your changes as data in the database: custom fields named x_studio_*, edited views stored as inherited ir.ui.view records, and automation rules. You can export them as a module via Studio's Export button, but upgrades can break Studio views when the base view changes, and Studio is not a substitute for version-controlled code on complex logic.

How-to

How to Create a Generic Inquiry in Acumatica

Generic Inquiries (GI) are Acumatica's no-code query builder for joining tables, adding filters, and exposing the result as an inquiry screen, dashboard data source, or API endpoint. Open System > Customization > Generic Inquiry, add your base table, define joins and conditions, then run and save. No SQL or customization project is required.

Error fix

Fix Odoo AccessError: You Are Not Allowed to Access Records

Odoo raises AccessError when a user's security groups do not grant a CRUD right on a model through ir.model.access.csv, or when an ir.rule record rule filters the specific record out for that user or company. Fix it by adding the user to the group named in the error, editing the model's access rights, or reviewing the record rule's domain under Settings > Technical > Security.

How-to

How to Void a Check in Sage 100

Sage 100 voids checks through Accounts Payable > Main > Check and Payment Voiding. Select the bank code, choose the check number, and Sage reverses the Cash Disbursements Journal entry and reopens the invoice it paid. A check that already cleared in Bank Reconciliation or falls in a closed period needs an extra step before it can be voided cleanly.

AI for ERP

AI for Odoo Manufacturing That Reads Your Own Database, Not a Vendor's Cloud

Add grounded, natural-language AI to Odoo Manufacturing without sending MRP, BoM, or work order data to a public model. On-prem or private cloud, ORM-native.

Stuck on Odoo (Sales)?

Talk to engineers who work inside Odoo (Sales) every week, and who build private AI that answers these questions from your own ERP data.

Keep exploring

Free tools

ERP fixes and how-tos

AI on your ERP

Integrations

Software