Integration For Business Operations 9 min read Updated May 6, 2026

Odoo B2B E-commerce: Pricelists, Catalogs, Credit Limits, and Customer Portal

Configure customer-specific pricing, segmented catalogs, credit limits, and approval workflows for a B2B e-commerce operation.

B2B e-commerce isn't B2C with bigger order sizes. The buying behavior is different: multiple stakeholders per buyer organization, negotiated pricing, payment on terms, repeat orders, and operational requirements (POs, credit limits, approval flows) that consumer e-commerce never touches. Odoo handles all of this — when configured correctly. When configured like a B2C webshop, it produces frustrating outcomes: B2B customers seeing retail prices, payment terms ignored, contracts re-negotiated for every order.

This guide walks through the B2B configuration in Odoo: pricing, catalogs, credit, approvals, and the customer portal. It's written for operations leads and technical leads jointly — the configuration straddles both roles, and the implementation only works when they agree on the policies.

What changes when retail goes B2B

The standard Odoo e-commerce configuration assumes:

  • Anyone can view the catalog and prices.
  • Each visitor places one order at a time.
  • Payment is captured at checkout.
  • Pricing is uniform.

B2B inverts most of these:

  • Customers must log in to see (their) prices and (their) catalog.
  • Multiple users from one customer organization place orders, often with different roles (purchaser, approver, viewer).
  • Payment is on terms (Net 30, Net 60), not at checkout.
  • Pricing is per customer or per segment, with negotiated discounts and bulk break tiers.

Odoo supports B2B as a configuration of the same e-commerce engine — not a separate product. The setup is in the policy decisions, not in installing different software.

Pricelists: the foundation of B2B pricing

A pricelist is a set of pricing rules. Each pricelist applies to certain products, certain customers, and (optionally) certain time windows. Configure at Sales ‣ Configuration ‣ Pricelists.

Three common patterns

  1. Discount off list price: "Distributor pricelist gives 30% off all products." The simplest pattern; right for tiered partner programs.
  2. Specific prices per product: "Customer X gets €99 on SKU-001 (regardless of list price)." Right for negotiated accounts.
  3. Quantity breaks: "€99 each up to 100 units, €89 each above 100, €79 each above 500." Right for volume pricing.

A single pricelist can combine all three — discount off list as the default, specific prices on key SKUs, quantity breaks on bulk SKUs.

Assigning pricelists

Pricelists can be assigned in two ways:

  • To a customer directly: at Contacts ‣ <Partner> ‣ Sales & Purchase, set Pricelist. The customer always uses this pricelist, regardless of channel.
  • To a customer segment via group: pricelist defaults via customer category (e.g., "Distributor," "Wholesale," "Reseller").
Tip — pricelist hierarchy. A pricelist can have a Parent Pricelist. If the parent has rules and the child only overrides specific products, the child inherits everything else. Useful for "distributor base + customer-specific exceptions."

Catalog visibility per customer

B2B catalogs are not always public. Different customers see different products — partner-only SKUs, white-label products, region-restricted items. Two mechanisms:

1. Public website restrictions

Set product visibility at Inventory ‣ Products ‣ <Product> ‣ eCommerce ‣ Visibility. Options:

  • All Visitors: anyone, logged in or not.
  • Signed In Customers: must log in to see.
  • Restricted: visible only to specified groups.

For a fully closed B2B store, set the entire eCommerce app to require login at Website ‣ Configuration ‣ Settings ‣ Privacy.

2. Per-customer catalog with custom modules

For more sophisticated needs ("customer X sees only their negotiated SKUs, customer Y sees a different subset"), the standard visibility is too coarse. Two approaches:

  • OCA website_sale_b2b modules: open-source extensions that add per-customer catalog filters.
  • Custom development: a small module that filters product visibility based on the logged-in user's tags or groups.
Note. The most common B2B mistake: showing all products to all customers "to keep things simple." Customers see SKUs they can't actually buy (because they're not in their negotiated catalog) and reach out to sales asking why prices look wrong. Hide what customers don't have access to.

Credit limits and payment terms

B2B sales typically aren't paid at checkout. The customer is invoiced, the invoice has payment terms (Net 30, Net 60, etc.), and the operation needs guardrails to prevent unsupervised over-extension.

Payment terms

Configure at Accounting ‣ Configuration ‣ Payment Terms. Common patterns:

  • Net 30: 100% due 30 days from invoice date.
  • Net 60: 100% due 60 days. Used for larger or strategic accounts.
  • 2/10 Net 30: 2% discount if paid within 10 days, otherwise full amount due in 30 days.
  • 50% deposit, 50% net 30: 50% on order confirmation, 50% on Net 30. Common for custom orders.

Assign default payment terms per customer at Contacts ‣ <Partner> ‣ Sales & Purchase ‣ Payment Terms.

Credit limits

A credit limit is the maximum unpaid balance a customer can carry. Configure at Contacts ‣ <Partner> ‣ Sales & Purchase ‣ Credit Limit.

When a customer's outstanding balance + new order would exceed the credit limit, Odoo can:

  • Warn: show a notification but allow the order.
  • Block: prevent confirming the order without manager approval.

For unwatched B2B e-commerce, Block is the right default. It's the credit team's safety net.

The customer portal: B2B's hidden value

The Odoo portal is the customer-facing self-service interface. For a B2B operation, it's the most underused feature.

What the portal supports

  • View order history with status, tracking, and documents.
  • Reorder previously purchased items in one click.
  • View invoices, payment status, and download PDFs.
  • Pay invoices online (if your payment processor is configured).
  • Manage delivery addresses.
  • For multi-user accounts: manage portal users in their organization, assign roles, view team activity.

Configuration

The portal is enabled per customer. At Contacts ‣ <Partner>, click Grant Portal Access. The customer receives an invitation email with a link to set their password.

For B2B operations, batch-invite all active customers to the portal during go-live or annually. Most customers will use it actively once enrolled.

Tip. Configure the portal homepage with a custom dashboard showing the customer their open orders, pending invoices, and recently purchased products. The default landing page is generic; a customized one drives engagement.

Approval workflows for B2B sales

Some B2B orders need human review before shipping. Common scenarios:

  • Orders above a certain value (€10,000, €50,000, etc.).
  • Orders for customers with credit on hold.
  • Orders with non-standard payment terms.
  • Orders with custom-priced items where pricing should be verified.
  • First order from a new customer.

Two approaches

Automation rules. Use the patterns from the Automated Workflows guide to route orders for review when conditions match. Email the appropriate reviewer; assign the order to them; block confirmation until approved.

Odoo Studio approval framework. For more sophisticated multi-step approvals (e.g., "approval from sales manager AND credit manager AND operations"), Studio's approval framework provides a visual workflow with named states and explicit transitions.

Customer-facing approval

For B2B customers with their own internal approval flow ("any order > €5,000 needs my CFO's signature"), the portal supports it. Configure at Contacts ‣ <Partner> ‣ Portal & Settings ‣ Approval Workflow. The customer's purchaser places an order; the portal queues it for the customer's CFO to approve before sending to your team. This eliminates the back-and-forth that B2B sales otherwise requires.

Quote-to-cash flow for B2B

The standard B2B sales flow in Odoo:

  1. Quote: salesperson or customer (via portal) creates a quotation.
  2. Quote sent: PDF emailed; portal link included for online review.
  3. Customer approves: clicks Accept in the portal, or signs the PDF and sends back.
  4. Sales order confirmed: state moves to sale; inventory is reserved if available.
  5. Delivery: warehouse picks, packs, ships.
  6. Invoice: created from the sale order, sent to the customer with payment terms.
  7. Payment: customer pays via portal (online), bank transfer, or check.
  8. Reconciliation: payment matched to invoice; AR balance updated.

Each step has integration points: quote PDF can be customized in Studio; portal acceptance triggers automation; invoice can be auto-generated on delivery; payment matching is automated through bank statement imports.

Integration with existing B2B systems

For larger B2B operations, Odoo isn't always the only system. Common integrations:

EDI for established trading partners

Major retailers and distributors require EDI (X12 in the US, EDIFACT in EU). Odoo doesn't include EDI natively; integrate via:

  • Babelway / Crossfire / SPS Commerce: SaaS EDI providers that translate EDI to/from Odoo APIs.
  • OCA modules: open-source EDI modules for specific transaction sets (850 PO, 855 PO Ack, 856 ASN, 810 Invoice).

Punchout for procurement systems

Customers using procurement platforms (SAP Ariba, Coupa, Oracle Fusion) often require punchout — their procurement system links into your storefront, the customer browses your catalog, the cart is returned to their procurement system for approval. Odoo doesn't include punchout natively; OCA modules and commercial extensions provide it.

3PL fulfillment

If you don't ship from your own warehouse, integrate with the 3PL's WMS via API or EDI. The pattern is similar to the e-commerce integration covered in the E-commerce Integration guide — Odoo holds the order; the 3PL fulfills; status flows back.

Common B2B pitfalls

1. Treating B2B customers like B2C customers

One pricelist, public catalog, payment at checkout. B2B customers either don't use the system or push their needs onto your sales team. The configurations are different on purpose; configure for the audience.

2. Catalog visibility too generous

Customers see SKUs they can't buy. They reach out to ask why pricing looks wrong; sales team explains the catalog is incomplete. Hide what's not available to the customer.

3. Credit limits not enforced

Limits configured but set to warn, not block. Customers exceed limits, AR ages, collections work increases. Block by default; require explicit manager approval to over-extend.

4. Portal not promoted to customers

The portal exists but customers don't know it; they keep emailing the sales team for order status, reorders, invoices. Email-invite all customers; show portal links in every order confirmation.

5. Approval rules that block customer experience

Every order requires manager approval. Even a €100 reorder waits 24 hours. Customers stop using the system for routine orders. Tier approval thresholds — small repeat orders flow through; large or unusual orders get reviewed.

Reference notes

Sources verified against Odoo 19.0 documentation and standards bodies. Use these to confirm anything before applying it to your environment.

Frequently Asked Questions

Can Odoo handle B2B and B2C on the same platform?

Yes. Configure two website channels (B2B and B2C) under Website ‣ Configuration ‣ Websites, each with its own catalog rules, login requirements, and pricelists. Customers logging in via the B2B site see B2B prices; the B2C site is open and shows public prices. Same Odoo backend, two distinct front-ends.

How do I handle quotes that need to be negotiated before becoming orders?

The standard quote-to-order flow handles this. Salesperson creates a quotation; customer reviews via the portal; either accepts or requests changes. The salesperson can edit the quote based on negotiation, send a revised version, and the customer accepts the revision. State doesn't move to sale until the customer accepts. Negotiation history is captured in the chatter (mail.message) attached to the quote.

Can multiple users from one B2B customer organization place orders?

Yes. The customer's main contact (the company partner) can have multiple contact persons — child partners. Each contact can have portal access, with optional role configuration. Some customers configure roles like "Purchaser" (creates orders) and "Approver" (reviews and approves). The portal handles the multi-user model natively for Odoo Enterprise.

Does Odoo handle quote validity periods and expiration?

Yes. Each quote has a Validity Date field. After expiration, the quote is automatically marked as expired (via a scheduled action). Customers can request renewal via the portal; the salesperson re-issues with updated pricing. For pricing that's volatile (commodities, seasonal items), short validity periods (7–14 days) are standard.

Can B2B customers pay invoices online via the portal?

Yes — if you've configured a payment processor (Stripe, Adyen, PayPal). The invoice in the portal includes a Pay Now button that takes the customer through the payment processor. Once the payment succeeds, Odoo records the payment, posts the journal entry, and reconciles the invoice. Net 30 customers can still pay early; legacy bank transfer remains an option.

How do I model franchise or distributor relationships in Odoo?

Most operators model each franchisee or distributor as a separate company in a multi-company Odoo setup. The franchisor is one company, each franchisee is another. Inter-company transactions handle inventory transfers and invoicing between them. Pricelists and catalogs can be shared across companies or kept separate. This is non-trivial — typically a 3–6 month implementation project, not a configuration tweak.

Can I send orders to my supplier automatically based on B2B sales?

Yes — through Odoo's MTO (Make to Order) routes. Configure the route to trigger a purchase order to your supplier when the customer order is confirmed. The PO can be sent automatically (via email) and the supplier ships directly to the customer (drop-ship) or to your warehouse. This is the standard pattern for B2B distributors that don't hold inventory.

Florinel Chis — commerce engineer leading Odoo and Magento implementations for retail and e-commerce. About Magendoo. Verified against Odoo 19.0
22+ Years in Commerce Engineering
50+ Enterprise Magento Projects
EU Based in Europe, Serving Europe
OSS Open Source Contributor
Get a Proposal • 24h response Call