Skip to content
Back to catalog
AppSalesNew

B2B Distributor Portal

Your wholesale customers order on their own, at their price, at any hour

A private storefront for your distributors, connected to your Odoo: each customer signs in, sees the catalogue with their discount and their stock, builds the order and sends it. The WhatsApp re-keying ends. It doesn't install into the ERP: it connects to it.

Compatibility
Odoo 19Odoo 18Odoo 17Odoo 16

How you get it

Every development works in all three Odoo environments. The only thing that changes is how we deliver it.

Nothing to install

Odoo Online (SaaS)

You do not need the ability to install modules. A Millora consultant comes in with temporary access that you authorize and implements it with Odoo Studio. When they are done, you revoke the access.

Install it today

Odoo.sh or your own server

You receive the module and the installation guide by email as soon as payment clears. Install it yourself, or we install it with you.

Installation · shell
# 1 · copia el módulo a tu addons_path
cp -r millora_portal_b2b /mnt/extra-addons/

# 2 · reinicia y actualiza la lista de apps
odoo-bin -u all -d tu_base --stop-after-init

# 3 · instala desde Apps
#     busca "B2B Distributor Portal"

What it solves

The problem

A wholesaler takes orders over WhatsApp, over the phone, by email and in spreadsheets. Somebody re-keys them into Odoo afterwards, one by one. That somebody makes mistakes — a code, a quantity, a price — and the mistake surfaces when the customer complains about what they did not order.

Meanwhile the sales rep spends the day answering two questions: "do you have this part?" and "what's my price?". Both answers are already in Odoo. What is missing is a way for the customer to look them up without somebody reading them out over the phone.

And handing over full Odoo is not an option: that is a licence per distributor, and a screen that was never designed for buying.

How it works

Each distributor signs in with their own user and sees the catalogue at their price: list price, less the discount on their record, plus tax. Two customers looking at the same product see different numbers, and neither has to ask.

From there:

  • They browse and search. By brand, commercial line and category; or they type and it searches name, code, category and description at once.
  • They see whether there is stock. Every product shows as available, low or out of stock, from the availability Odoo computes across warehouses.
  • They find what is new. New arrivals, latest shipments and pre-sale — the last with its own price and the container it is coming in.
  • They build the order. A normal cart, or paste a list of codes and quantities to load it in one go, which is how somebody who already knows what they want orders.
  • They save it or send it. A named draft can be picked up later; a previous order repeats with one click; and the whole history stays visible, with its detail.
  • They take the file. The order exports to Excel, and so do the price list and the pre-sale list.
  • They check what they owe. Their posted invoices, with outstanding balance and payment status, and the PDF to download.

There is also an exclusive section only flagged customers see, and an admin panel where the minimum order, whether stock is validated on sending, and which warehouse and threshold define "out of stock" all get configured.

It doesn't install into Odoo

It lives outside and connects through Odoo's standard services, so it works alike on Odoo Online, on Odoo.sh and on-premise. There is no module to install: portal users, brands and orders are models built with Studio, and so are the extra product fields.

It ships with expiring cache so the ERP is not punished on every click, plus an endpoint Odoo can call to flush it when prices or the catalogue change — so the portal learns about the change without waiting for the cache to expire.

It adapts without reprogramming

Name, logo, colours and typefaces come from configuration. So does the vocabulary: where one distributor says "distributor" and "order", another says "wholesale customer" and "purchase order".

And each section switches on or off per client: catalogue, cart, orders, invoices, frequents, pre-sale, exclusive and admin. Whoever does not run pre-sale never sees it.

It includes a demonstration mode on a fake catalogue, to show it in a meeting without touching live data.

What it does not do

It does not create the Odoo sales order. This is the most important clarification on this page. The portal's order lands in a model of its own — with its customer, its user, its total and its lines — not in a sales order. Turning it into one, or into an invoice, is a step defined with each client and usually handled by an automation inside Odoo. What disappears is the rep's re-keying; the seller's confirmation still exists, which in wholesale is how it should be.

It does not take payment. There is no payment gateway. The portal raises the order; collection carries on wherever it already happens.

Discounts are per customer, not per product. Each distributor has a general discount and a preferential one that applies to a category. That covers most wholesale cases, but if you need discounts by brand, by line or by product, that gets built. And tax is fixed at 16%.

Availability is computed by Odoo, not by the portal. It depends on a scheduled action that sums the configured warehouse's stock and flags "out of stock" below a threshold. The portal reads that result: if the action does not run, it shows the last good value.

It does not publish the whole catalogue. Only products that have an image, are not flagged as non-restockable or discontinued, and have already had a shipment arrive. That is deliberate — a wholesale catalogue with no photo does not sell — but it means what the distributor sees is a subset of Odoo's catalogue, and those fields decide who is in it.

Invoices download if Odoo already holds the PDF. The portal looks for the invoice's attachment; it does not render the report. If there is no attachment, it says so rather than handing over an empty file.

It is not a module you install and forget. It runs on its own server, at an annual cost separate from this development. Millora recommends where to host it and leaves it running; if you would rather use your own infrastructure, it installs there too.

And it deliberately has no list price. What is quoted is the implementation — the branding, the vocabulary, which sections are on, the Studio models, the discounts and the availability rule — and that depends on how each wholesaler's catalogue is set up today.

What changes

The distributor buys whenever they want, at the right price, without tying anybody up. The rep stops being a price lookup service and goes back to selling. And the order reaches Odoo written by the person who placed it — the only one who cannot be wrong about what they wanted.

What's included

  • Shows each distributor the catalogue with their own discount and tax already applied
  • Browses by brand, commercial line and category, with search across name, code, category and description
  • Flags every product as available, low or out of stock, from the availability Odoo computes across warehouses
  • Separates new items, latest arrivals and pre-sale, the last with its own price and container
  • Loads the cart by pasting a list of codes and quantities, as well as item by item
  • Saves named drafts, picks them up later and repeats a previous order with one click
  • Validates the minimum order and, when configured, stock before sending
  • Exports the order, the price list and the pre-sale list to Excel
  • Shows the customer's invoices with balance and payment status, and downloads the PDF
  • Reserves an exclusive section for customers flagged as such
  • Switches each section on or off per client: catalogue, cart, orders, invoices, frequents, pre-sale, exclusive and admin
  • Stores passwords hashed and rate-limits requests
  • Includes a demonstration mode on a fake catalogue, to present without touching live data

Requirements

  • An Odoo from 16 to 19, reachable from the internet and with its connection services enabled
  • The catalogue in Odoo with list prices, images and categories: the portal publishes it, it does not capture it
  • Every distributor registered as a customer in Odoo
  • Models built with Studio for portal users —with their discount and their customer—, brands, and orders with their lines
  • Studio fields on the product: brand, commercial line, purchase type, new, pre-sale and arrival
  • A scheduled action in Odoo that computes availability across warehouses and flags out-of-stock below a threshold
  • An integration user with read access to the catalogue and write access to the order models
  • A server for the portal to live on, separate from the ERP: Millora recommends one, at an annual cost, or it installs on yours