B2B Pricing Suite — Tiered Pricing, MOQ, Quantity Steps & Volume Discount for Odoo eCommerce
Tiered pricing table, MOQ enforcement, quantity steps, volume discount, savings messages & guest price hiding for Odoo 17 eCommerce.
B2B Pricing Suite
Tiered Pricing, MOQ, Quantity Steps & Guest Price Hiding for Odoo eCommerce
Free lifetime updates & bug fixes · OPL-1 License
What's Included
Everything you need to transform your Odoo store into a B2B sales engine
| What You Get | Details |
|---|---|
| Tiered Pricing Table | Display all quantity breaks with per-unit savings on product pages |
| Best-Price Highlight | Automatically highlights the best-value tier in the pricing table |
| Date-Based Pricing | Set start/end dates on tiers; expired tiers auto-hidden with expiring-soon badges |
| Price Range on Shop | "From X to Y" range on the shop grid for tiered products |
| Savings Messages | Live-updating "Order N more to get $X each" upsell prompts |
| Minimum Order Quantity | Per-product MOQ enforcement on frontend + backend (cannot be bypassed) |
| Quantity Step | Force quantities in multiples (5, 10, 50) with clear error messages |
| Unit Price Display | Show price per kg, per item, per hour — any configurable label |
| Guest Price Hiding | Per-product toggle to require login before revealing prices |
| Multi-Website | Works correctly in multi-website environments |
| Multi-Currency | Proper decimal formatting per currency symbol |
| Multi-Language | Full EN / ES / FR translations included |
| 32 Unit Tests | Comprehensive test coverage for controllers, models, and hooks |
| Free Lifetime Updates | Bug fixes and feature improvements included at no extra cost |
Overview
Give your B2B customers the pricing transparency they need to buy more
The B2B Pricing Suite brings your backend pricelists to life on the frontend. Customers can see quantity breaks with per-unit savings, minimum order quantities are enforced, and dynamic messages encourage upsell — all powered by your existing Odoo pricelist items.
Server-side validation ensures MOQ and quantity step rules cannot be bypassed. Cart validation runs on the backend, giving you peace of mind that your pricing rules are enforced.
Hide prices from guests with a per-product toggle. Non-logged-in visitors see a login prompt instead of prices, "Add to Cart", or tiered tables — perfect for wholesale and B2B stores that require registration.
Batch-loaded for performance. Shop grids with 100+ products load pricing data in a single RPC call. CSS custom properties adapt to any Odoo theme automatically.
Key Features
Everything you need for B2B pricing on the website
Tiered Pricing Table
Show all quantity breaks with per-unit savings on the product page. Works with existing pricelists — no duplicate data entry.
Best-Price Highlight
The tiered table automatically highlights the row with the lowest per-unit price, so customers instantly spot the best value.
Price Range on Shop
Show "From $X to $Y" on the shop grid for tiered products. Helps customers identify bulk discounts without opening each product page.
Savings Messages
"Order 20 more to get $3.50 each" — live-updating messages that drive upsell and increase average order value.
Minimum Order Quantity
Enforce per-product minimums with frontend input clamping and server-side validation. Cannot be bypassed.
Quantity Step
Force quantities in multiples (5, 10, 50). Validated on both client and server with clear error messages.
Unit Price Display
Show price per kg, per item, per hour — any label you choose. Dynamically updates to reflect the selected tier.
Hide Prices from Guests
Per-product toggle to hide prices, "Add to Cart", and tiered tables from non-logged-in visitors with a login prompt.
Date-Based Pricing
Set start/end dates on pricelist tiers. Expired tiers auto-hide, with optional "expiring soon" countdown badges.
Theme-Compatible CSS
Uses CSS custom properties to adapt to any Odoo website theme automatically. No theme-specific overrides needed.
Multi-Website
Works correctly in multi-website environments with proper website resolution and pricelist scoping.
Multi-Language
Full translations included for English, Spanish, and French. All customer-facing strings are translatable.
See It In Action
Screenshots from the Odoo frontend
Tiered Pricing Table, Price Range & Date Columns
The product page displays a price range above the tiered pricing table. When date-based pricing is enabled, each tier shows its expiration date. Tiers expiring within 30 days get an amber expiring-soon badge with a red countdown — e.g. "22 Jul 2026 (1d)" — while far-out dates show as clean purple badges. This drives urgency and helps customers plan their orders.
Price Range on Shop Grid
Products with tiered pricing show a "€X - €Y" range directly on the shop grid. Products with hidden prices show "Log in for price" instead. When date-based pricing is active, tiers expiring within 30 days display expiring-soon badges with a countdown — giving customers urgency to buy.
Server-Side MOQ Enforcement
When a customer tries to checkout with a quantity below the minimum, the cart shows a clear validation warning — "Quantity adjustments needed: min 5 (currently 1)." MOQ and quantity step rules are enforced both on the frontend and the backend. Customers cannot bypass these rules to place an order that violates your B2B requirements.
Hide Prices from Guests — Product Page
When "Show Price to Customers" is unchecked on a product, non-logged-in visitors see a clean login prompt instead of prices, "Add to Cart" button, or the tiered pricing table. Logging in restores full visibility automatically.
Hide Prices from Guests — Shop Grid
On the shop grid, products with hidden prices display "Log in for price" instead of the actual price or price range. This gives non-logged-in visitors a clear call to action while keeping your B2B pricing private. Once logged in, the full price range and tiered pricing table become visible.
Why Buy the B2B Pricing Suite?
See what you get vs. Odoo out of the box
| Feature | Odoo Default | B2B Pricing Suite |
|---|---|---|
| Tiered pricing table on product page | Not visible to customers | Fully displayed with savings |
| Price range on shop grid | Single price only | "€X - €Y" range for tiered products + "Log in for price" |
| Dynamic upsell messages | Not available | Live "Order N more" prompts |
| Minimum order quantity | Not enforced on website | Frontend + backend validation |
| Quantity step enforcement | Not available | Per-product multiples enforced |
| Unit price display | Not available | Configurable per product |
| Best-price highlight in table | Not available | Auto-highlights best value tier |
| Hide prices from guests | Not available | Per-product login gate |
| Variant-level pricing | Backend only | Fully supported on website |
| Multi-currency | Default behavior | Proper decimal formatting per currency |
| Batch performance (100+ products) | N/A | Single RPC call for all products |
| Date-based pricing tiers | Not available | Auto-filter expired, expiring-soon badges |
| Configuration | N/A | Per-feature toggles in Settings |
Technical Specifications
Built with Odoo best practices
Dependencies:
- base
- web
- website
- website_sale
- product
- sale
Compatibility:
- Odoo 17.0 Community Edition
- Odoo 17.0 Enterprise Edition
- Bootstrap 5 compatible
- Works with all standard themes
Test Coverage:
- 32 unit tests (controllers + models + hooks)
- MOQ validation edge cases
- Multi-currency support
- Variant-level pricelist deduplication
- Public user price hiding
- Date-based tier filtering & expiring-soon detection
API Endpoints:
/shop/b2b-pricing-config— Get global module configuration/shop/b2b-pricing-data— Get pricing data for a product/shop/b2b-pricing-batch— Batch pricing for multiple products/shop/b2b-validate-cart— Validate cart against MOQ/step rules
File Structure:
ecommerce_b2b_pricing_suite/ ├── controllers/ │ ├── __init__.py │ └── main.py # 4 JSON-RPC endpoints ├── data/ │ └── default_config.xml # Default settings ├── i18n/ │ ├── es.po │ ├── fr.po │ └── ecommerce_b2b_pricing_suite.pot ├── models/ │ ├── __init__.py │ ├── product_template.py # MOQ, step, unit price fields │ ├── res_config_settings.py # Settings panel │ └── sale_order.py # Server-side validation ├── static/ │ ├── description/ │ │ ├── icon.png │ │ ├── index.html │ │ └── images/ │ │ ├── product_page.png │ │ ├── shop_page.png │ │ ├── shop_guest.png │ │ ├── cart_page.png │ │ ├── guest_hidden_price.png │ │ └── settings_page.png │ └── src/ │ ├── css/ │ │ └── pricing_suite.css │ └── js/ │ └── pricing_suite.js ├── tests/ │ ├── __init__.py │ ├── test_controllers.py # 21 tests │ └── test_models.py # 11 tests ├── views/ │ ├── product_view.xml │ ├── res_config_settings_view.xml │ └── website_templates.xml ├── __init__.py ├── __manifest__.py ├── hooks.py # Clean uninstall ├── LICENSE └── README.md
Perfect For
Ideal for these business types
- Wholesalers — Show bulk pricing tiers that increase with order volume
- Manufacturers — Display price per unit and enforce MOQ from suppliers
- Distributors — Customer-specific pricelists with tiered visibility
- Any B2B Store — Increase average order value with savings incentives
- Office Supplies — Enforce case-pack quantities with step enforcement
- Raw Materials — Show price per kg/ton with tiered volume discounts
- Subscription Products — Display per-unit pricing for multi-quantity orders
- Membership Stores — Hide prices from non-members with guest gating
Quick Configuration
Get started in minutes
- Go to Settings → B2B Pricing Suite and enable the module
- Toggle individual features on/off (tiered table, price range, savings messages, unit price)
- On each product, configure MOQ and unit price label in the B2B Pricing tab
- Tiered pricing is automatically read from your existing pricelist items
Settings Panel
Every feature individually toggleable
All features are individually toggleable in Settings → B2B Pricing Suite. The Pricing Visibility section controls the master toggle and guest price hiding. Customer Engagement toggles the tiered table, price range, savings messages, unit price display, and date visibility (Always Show Dates, Expiring Soon Only, or Disabled). Tiered pricing data is read directly from your existing Sales → Products → Pricelists items — no duplicate data entry.
What's New in v2.1.0
Recent improvements and additions
New Features
- Date-Based Pricing Tiers — Tiers with
date_start/date_endare automatically filtered; expired tiers hidden - Show Dates Setting — Three modes: Disabled, Always Show Dates, Only When Expiring Within 30 Days
- Expiring Soon Badge — Visual countdown for tiers about to expire (within 30 days)
- Valid Until Column — Optional date column in the tiered pricing table
Improvements
- 7 New Tests — Date filtering, expiring-soon detection, show_dates config (32 total)
- Multi-Website Support — No longer hardcodes website ID 1
- jQuery Removed — Migrated to native
fetch()API - SEO Structured Data — Schema.org AggregateOffer markup
Frequently Asked Questions
Common questions about the B2B Pricing Suite
Does this module work with existing Odoo pricelists?
Yes. The B2B Pricing Suite reads tiered pricing directly from your existing Odoo pricelist items. No duplicate data entry — configure pricing once in Sales → Products → Pricelists, and it automatically displays on your storefront.
Can I hide prices from non-logged-in visitors?
Yes. You can hide prices globally for all products or per-product using the "Show Price to Customers" toggle. Non-logged-in visitors see a "Log in for price" prompt instead of prices, the "Add to Cart" button, or the tiered pricing table.
Does it support multi-website and multi-currency?
Yes. The module works correctly in multi-website environments with proper website resolution and pricelist scoping. Multi-currency is fully supported with proper decimal formatting per currency.
Is the minimum order quantity enforced on the backend?
Yes. MOQ and quantity step rules are enforced both on the frontend (JavaScript) and the backend (sale.order.line constraints). Customers cannot bypass these rules to place orders that violate your B2B requirements.
Does it work with product variants?
Yes. The module supports both template-level and variant-level pricelist items. When a customer selects a variant, the pricing data automatically refreshes to show variant-specific tiers.
Is there a jQuery dependency?
No. The module uses pure vanilla JavaScript with the native fetch() API. Zero jQuery dependency means faster page loads and no conflicts with other modules.
The Perfect Companion
Need to replace "Add to Cart" with "Request a Quote"?
Pair the B2B Pricing Suite with our free Request for Quote module for a complete B2B e-commerce experience — tiered pricing on products you sell, quote-only for products you negotiate.
Support
For technical support or feature requests, contact [email protected]
B2B Pricing Suite v2.1.0 | Developed by Hexalian LLC
License: OPL-1. This software is provided "as is", without warranty of any kind.
Related Odoo modules (Odoo 17)
Before You Buy
- Confirm your Odoo version: v17, v18, v19.
- Review module scope carefully to validate your exact use case.
- Plan installation on staging first, then deploy to production.
- Need help evaluating fit? Email [email protected].
Secure checkout · No account required
Download link sent to your email after payment. Lost your link?
Powered by Stripe
- 100% source code included
- Lifetime access to download
- Odoo 17 & 18 & 19 supported
- Email delivery (72h link)
- Sold as-is under OPL1 — all sales final
Production-grade Odoo modules with full source code.