A made-to-order Odoo module that governs which products and categories appear on each of your websites, with user- and group-based restrictions layered on top. ECOSIRE builds, installs, and supports it against your exact multi-website setup. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $249.00 USD; request a quote for a scoped proposal.
App manifest
Built around your workflow
A made-to-order Odoo module that governs which products and categories appear on each of your websites, with user- and group-based restrictions layered on top. ECOSIRE builds, installs, and supports it against your exact multi-website setup.
No DIY setup — a working app, built, installed and supported by ECOSIRE.
Start with a one-time build price. We scope it with you at kickoff.
ECOSIRE builds, configures and installs it on your Odoo.
You go live in about 2–4 weeks, with a post-launch support window.
Running several storefronts from one Odoo database sounds tidy until you try to keep each one showing the right catalog. Out of the box, a product is published or unpublished globally, and the website_id field on product.template only pins a record to a single site rather than letting you curate distinct assortments across many. Teams end up cloning products, toggling is_published by hand, or writing throwaway overrides on the website.published.mixin that break the next time the catalog changes. Add B2B requirements — where a signed-in dealer should see wholesale lines that a public visitor never should — and Odoo's native website eCommerce runs out of road. There is no first-class notion of "this SKU is visible on Site A, hidden on Site B, and restricted to these customer groups everywhere."
We build a dedicated visibility layer that treats per-website assortment and audience restriction as real, queryable data instead of a pile of manual flags. The module adds a many-to-many relation between product.template / product.public.category and website, plus an optional link to res.groups and/or a partner tag for user-based restriction. A stored computed field on the product — for example visible_website_ids, driven by @api.depends on the assortment and category rules — resolves effective visibility so the storefront controller can filter the /shop queryset in a single indexed pass rather than post-filtering in Python. Because the logic lives in the ORM, it applies consistently to the website search, category navigation, product suggestions, and the sitemap, not just the grid the shopper first lands on.
Enforcement is done the Odoo-correct way. We extend the _search_get_detail / website controller path and add ir.rule record rules keyed on the current website.get_current_website() and request.env.user, so a hidden or restricted product cannot be reached even by guessing its slug URL — the record rule denies the read, returning a clean 404 rather than a leaking 403. Category trees are pruned per site so empty branches never render, and ir.model.access.csv covers the new configuration models for the manager group. Admins get a clear management surface: list and form views (XML plus OWL widgets where a matrix helps) showing the website-by-product visibility grid, batch actions to publish or restrict an entire category to a site, and optional base.automation rules so newly created products inherit a default assortment. Everything is read/written over the standard XML-RPC and JSON-RPC API, so a PIM or middleware can drive assortments programmatically.
Because this is built to order, we start from your real database — how many websites, whether you are on Community or Enterprise (this works on both; we note where Enterprise-only website features change the approach), your pricelist and B2B rules, and any existing customizations that touch the shop. We deliver on a staging clone first, run UAT against your actual catalog, and only then schedule the production cutover with a rollback path. Typical delivery is 2–4 weeks from confirmed scope, targeting Odoo 17.0, 18.0, or 19.0. Pricing starts from $249 (indicative, single-company base scope); additional websites, deeper B2B/pricelist-driven visibility rules, multi-company record-rule design, and PIM/API integration increase the quoted scope.
Runs three or four Odoo websites from one database and needs each storefront to show a curated assortment without cloning products or manually toggling publish flags every time the catalog shifts.
Needs signed-in dealers and wholesale groups to see restricted product lines that public visitors never can, enforced at the record level so a guessed URL cannot leak a restricted SKU.
Owns the Odoo instance and wants visibility logic in the ORM with proper record rules and access control, driveable over XML-RPC/JSON-RPC from a PIM, rather than brittle manual overrides they have to maintain.
Manages many regional or franchise sites and needs per-site catalogs plus a bulk grid to assign categories to sites quickly, with new products inheriting a sane default assortment.
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Per-website assortment | First-class many-to-many product/category-to-website model, curated per site | Possible but you design and maintain the data model yourself | Often a fixed visibility flag with limited multi-site nuance | |
| User / group restriction | Built-in `res.groups` and partner-tag restrictions for B2B audiences | Buildable per project, no reusable pattern | Sometimes offered, rarely both site- and user-scoped together | |
| Direct-URL security | `ir.rule` record rules deny read and return a clean 404 | Depends on whether the developer adds record rules | Frequently filters the grid but leaks via slug URL | |
| Fit to your setup | Scoped to your websites, edition, and B2B rules; UAT on your catalog | Fully bespoke but slower and costlier to reach parity | Generic; you adapt your process to the app | |
| Performance | Stored compute + single indexed shop query | Depends on the developer's approach | Varies; some post-filter in Python | |
| API / PIM integration | Full XML-RPC / JSON-RPC read-write, optional auto-assortment rule | Whatever you choose to expose | Backend-UI oriented, limited API surface | |
| Support & handover | Docs, training, support window, git repo with tagged release | Tied to the developer who built it | Vendor ticket queue; source often obfuscated | |
| Version coverage | Built and tested for your Odoo 17/18/19, Community or Enterprise | Whatever you target and maintain | Depends on the vendor's supported versions |
This is built to order, so typical delivery is 2–4 weeks from confirmed scope. The timeline depends on how many websites you run, your B2B/pricelist rules, and whether existing customizations touch the shop controller. We confirm the exact schedule in writing after the scoping call, and we always build and UAT on a staging clone before the production cutover.
It works on both Community and Enterprise for Odoo 17.0, 18.0, and 19.0. The core visibility model, record rules, and controller extensions are Community-compatible. Where an Enterprise-only website feature changes the approach (for example certain website builder or multi-company tools), we note it during scoping and adapt the design to your edition.
Pricing starts from $249 as an indicative single-company, single-website base scope. Additional websites, deeper B2B/group restrictions, multi-company record-rule design, and PIM/API integration increase the quoted scope. After a short scoping call we send a fixed written quote for your exact requirements — the from-price is a starting point, not the final number.
Filtering the `/shop` grid alone is not enough — someone could still open a product by guessing its slug. We enforce visibility with `ir.rule` record rules keyed on the current website and user, so a restricted product fails the read and returns a clean 404 rather than leaking through a direct link or the JSON-RPC storefront calls.
Every build includes a post-go-live support window for defect fixes and configuration questions. Because the module targets a specific Odoo major version, we also quote version-upgrade work separately when you move to a newer Odoo release. You receive the full git repository with a tagged release, so your own team or ours can maintain it going forward.
Yes. All configuration models are readable and writable over the standard XML-RPC and JSON-RPC API, so a PIM, ETL job, or middleware can assign products and categories to websites and groups programmatically. We can also add an optional `base.automation` rule so newly created products inherit a default per-site assortment on creation.
No — that is exactly why we resolve visibility in a stored computed field and filter the shop queryset in a single indexed pass, rather than loading everything and filtering row-by-row in Python. Enforcement rides on Odoo's own search and record-rule machinery, which is already optimized, so the shop, search, and category navigation stay fast even with large catalogs.
A made-to-order Odoo module that governs which products and categories appear on each of your websites, with user- and group-based restrictions layered on top. ECOSIRE builds, installs, and supports it against your exact multi-website setup.