Skip to main content
Shop Product Price Visibility — A build-to-order Odoo module that controls exactly who sees product prices on your website sh — 1/1Illustrative preview

A build-to-order Odoo module that controls exactly who sees product prices on your website shop and eCommerce

storefront — by login state, customer group, region, or product. ECOSIRE scopes, builds, installs, and supports it for Odoo 17.0, 18.0, and 19.0.

What is Shop Product Price Visibility?

A build-to-order Odoo module that controls exactly who sees product prices on your website shop and eCommerce storefront — by login state, customer group, region, or product. ECOSIRE scopes, builds, installs, and supports it for Odoo 17.0, 18.0, and 19.0. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Per-visitor price-visibility resolver evaluating website, logged-in res.partner, commercial parent, res.groups membership, country/geolocation, and resolved pricelist
Visibility policy fields on product.template and product.public.category with inheritance so a category rule cascades to its products unless overridden
Four visibility modes per rule: show price, mask/blur value, replace with a call-to-action, or gate behind login
QWeb template overrides via xpath on website_sale.products_item, website_sale.product, and mini-cart that conditionally render the price node without breaking add-to-cart, wishlist, or comparison
Optional 'Request a Quotation' button that replaces add-to-cart on hidden-price products and creates a draft crm.lead or sale.order
Server-side enforcement in the /shop controllers and JSON-RPC read paths so hidden prices are never leaked via crafted requests, not just hidden in the template
ir.model.access.csv grants plus ir.rule record rules scoping policy editing to the owning website/company in multi-website and multi-company installs
compute method with @api.depends on partner, pricelist, and policy so visibility recomputes correctly when the session or pricelist changes
Guest-vs-authenticated differentiation, including 'show login prompt in place of price' with a configurable message
Automated action / scheduled toggle to reveal or hide prices during defined windows (e.g. campaign or trade-show periods)
Structured-data (JSON-LD Offer) handling so hidden-price products do not emit a misleading price in schema.org markup
Backend configuration UI: policy list/form views, a Settings panel, and bulk assignment from the product list
Clean __manifest__.py declaring website_sale and sale dependencies, data files, and version, packaged per Odoo edition
Verified across Odoo 17.0, 18.0, and 19.0 on Community and Enterprise, with graceful handling of Enterprise-only pricelist surfaces

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

Most B2B, wholesale, and trade sellers running Odoo eCommerce eventually hit the same wall: prices are either public to everyone or the entire storefront sits behind a portal login. Odoo core gives you no middle ground. You cannot easily say "show retail prices to guests, show negotiated prices to logged-in trade accounts, and show a Request-a-Quote button to everyone else." The native website_sale templates render list_price and pricelist-adjusted prices unconditionally in the shop grid, the product detail page, and search results — so hiding a price usually means someone hand-overrides QWeb and breaks the add-to-cart flow, structured data, and the pricelist engine in the process.

We build a purpose-made module that adds a first-class price-visibility layer on top of website_sale without forking it. The core is a small set of ORM models and configuration fields: a visibility policy stored against product.template and product.public.category, evaluated per request against the current website, the logged-in res.partner (and their commercial parent), assigned res.groups, geolocation/country, and the resolved pricelist. A compute method decorated with @api.depends on the partner, pricelist, and policy resolves — for each visitor — whether the price is shown, masked, replaced with a call-to-action, or gated behind login. We override the relevant templates through inheritance (xpath on website_sale.products_item, website_sale.product, and the cart/mini-cart) so the price node is conditionally rendered while add-to-cart, wishlist, and comparison behavior stay intact. Where a product is priced-hidden, we optionally swap the buy button for a configurable "Request a Quotation" action that feeds crm.lead or sale.order in draft.

Because visibility touches money and access, we wire it correctly at the data layer: ir.model.access.csv grants for the new configuration models, ir.rule record rules so a website manager only edits policies for their own website in multi-company/multi-website installs, and server-side enforcement so a hidden price is never leaked through the JSON-RPC//shop controllers or the product_template public read — hiding on the template alone is not enough, since a crafted request can otherwise pull the value. Admin-facing configuration lives in clean backend views (form/list) plus a settings panel, and every policy change is captured for auditability. The module ships with an automated action option to flip visibility on schedule (for example, reveal prices only during a trade-show window) and is packaged with a correct __manifest__.py declaring dependencies (website_sale, sale), data files, and version, tested against Odoo 17.0, 18.0, and 19.0 on both Community and Enterprise (Enterprise-only surfaces like advanced pricelist UI are handled gracefully when absent).

Delivery is build-to-order: it starts with a short scoping call to map your exact rules — which visitor segments, which products or categories, what the fallback should be, and how quotation requests should flow — after which we return a fixed quotation and a delivery plan. Typical delivery is one working week from confirmed scope. We build on a staging copy of your database, run UAT with you, and hand over installable source, documentation, and a git repository. Pricing starts from $999 (indicative, single-company base scope); additional websites, multi-company record-rule complexity, deep customer-group/geolocation segmentation, and quotation-workflow integration increase the quoted scope.

What you get

  • Installable, commented source code for your Odoo version (17.0, 18.0, or 19.0) as a self-contained module
  • Installation and configuration on your environment, including dependency and data-file setup
  • Technical documentation: models, fields, record rules, template overrides, and configuration reference
  • End-user guide plus a live training session for your website/catalog administrators
  • UAT on a staging copy of your database with a documented rollback plan before go-live
  • Post-go-live support window for defect fixes and configuration questions
  • Git repository handover with full commit history and tagged release
  • Manifest, security (ir.model.access.csv + ir.rule), and view files ready for your CI/deployment pipeline

Who this is for

B2B / Wholesale seller on Odoo eCommerce

Runs a public catalog for brand discovery but wants prices shown only to approved trade accounts, with everyone else seeing a quote request. Needs segment-based visibility without locking the whole shop behind login.

Website / eCommerce manager

Owns the storefront and needs a backend UI to set price-visibility rules per product or category, differentiate guests from logged-in customers, and schedule reveal windows — without editing QWeb or risking the add-to-cart flow.

Odoo partner or in-house developer

Wants a clean, upgrade-safe module that extends website_sale via inheritance, enforces visibility server-side, ships proper ir.rule security, and arrives with source, docs, and a git repo they can maintain.

Multi-website / multi-company operator

Serves different regions or brands from one Odoo instance and needs price visibility scoped per website and per company via record rules, with region/geolocation-aware rules.

How Shop Product Price Visibility Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
Visitor segmentation (guest / group / region)Full: partner, res.groups, website, country, pricelistPossible but you design and build it allUsually login-vs-guest only, limited group logicNone — price is public or whole shop behind login
Server-side enforcement (no leak via RPC)Enforced in controllers + read pathsOnly if the developer remembers toOften template-only; value still servedN/A — price always served
Add-to-cart / pricelist integrityPreserved; price node overridden in isolationDepends on implementation qualitySometimes breaks cart or comparisonIntact but no visibility control
Multi-website / multi-company scopingir.rule record rules per website/companyExtra effort to design correctlyFrequently single-website assumptionsNot applicable
Quote-request fallback on hidden priceOptional draft crm.lead / sale.order buttonBuildable on requestRarely includedNone
Odoo 17/18/19 + Community/EnterpriseBuilt and tested for your exact versionWhatever you target and testVaries; may lag new releasesVersion-native but no feature
Fit to your exact rulesScoped to your segments and fallback logicFully bespoke, at full build cost/timeGeneric; adapt your process to itNo configuration for this
Delivery model & supportBuild-to-order 2–4 wks, source + git + support windowYour team owns time, risk, and upkeepInstant install, self-serve support onlyIncluded but feature absent

Frequently Asked Questions about Shop Product Price Visibility

How long does delivery take?

This is a build-to-order module, not an off-the-shelf download. Typical delivery is one working week from confirmed scope. The exact timeline is fixed in your quotation and depends on how many visitor segments, websites, and quotation-workflow integrations are involved. Simple single-website rules land toward the shorter end; multi-company, geolocation, and CRM-integrated flows toward the longer end.

How does pricing and scoping work?

Pricing starts from $999 as an indicative single-company base scope. We hold a short scoping call to map your exact rules, then send a fixed written quotation before any build begins — no surprises. Additional websites, multi-company record-rule complexity, deep customer-group or geolocation segmentation, and quotation-workflow integration increase the quoted scope.

What about support and updates after go-live?

Every build includes a post-go-live support window for defect fixes and configuration questions. Because you receive the full source and git repository, your team can maintain it, or we can provide ongoing support and version upgrades (for example moving from Odoo 17.0 to 18.0 or 19.0) under a separate agreement.

Does this work on Odoo Community or only Enterprise?

Both. The module targets Odoo 17.0, 18.0, and 19.0 on Community and Enterprise. Core visibility logic sits on website_sale and sale, which exist in Community. Enterprise-only surfaces such as advanced pricelist UI are handled gracefully when present and don't break when absent.

Won't hiding the price break add-to-cart or the pricelist engine?

No. We override only the price node through QWeb inheritance (xpath), leaving add-to-cart, wishlist, comparison, and the pricelist engine intact. On hidden-price products we can optionally swap the buy button for a 'Request a Quotation' action. Visibility is also enforced server-side, so the flow stays consistent and the hidden value is never leaked through the shop controllers.

Can prices be shown to some customers and hidden from others?

Yes — that's the core purpose. Rules evaluate the logged-in res.partner, their commercial parent, assigned res.groups, the current website, country/geolocation, and the resolved pricelist. So you can show retail prices to guests, negotiated prices to logged-in trade accounts, and a quote request to everyone else, all from one policy set.

How is this different from just editing the website theme?

A theme edit hides the price only in the template — the value is still served to the browser and readable via the JSON-RPC read paths and structured data. We enforce visibility at the data and controller layer, add proper security (ir.model.access.csv + ir.rule), and package it as an upgrade-safe module rather than a fragile template hack.

Request a quote

Shop Product Price Visibility

A build-to-order Odoo module that controls exactly who sees product prices on your website shop and eCommerce storefront — by login state, customer group, region, or product. ECOSIRE scopes, builds, installs, and supports it for Odoo 17.0, 18.0, and 19.0.

  • Per-visitor price-visibility resolver evaluating website, logged-in res.partner, commercial parent, res.groups membership, country/geolocation, and resolved pricelist
  • Visibility policy fields on product.template and product.public.category with inheritance so a category rule cascades to its products unless overridden
  • Four visibility modes per rule: show price, mask/blur value, replace with a call-to-action, or gate behind login
  • QWeb template overrides via xpath on website_sale.products_item, website_sale.product, and mini-cart that conditionally render the price node without breaking add-to-cart, wishlist, or comparison

Request a Quotation

Tell us about your Shop Product Price Visibility requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.