Is Odoo unable to provide Autonomous B2B or B2C Billing Selection for portal customer?
A customer should be able to autonomously choose whether an order is invoiced as a private individual (B2C) or as their own company (B2B) by selecting the appropriate billing entity during checkout.
Current Behavior in Odoo 18
In the standard Odoo 18 website, a visitor cannot create an account with is_company=True, nor can they create an independent company billing address from /shop/address.
The website checkout only manages:
contacts (is_company=False),
child addresses belonging to an already established commercial entity.
Creating a new company partner (is_company=True) is only performed through create_company() in the back-office. Therefore, the website does not allow a customer to create a new company billing entity during the checkout flow (/shop/checkout → /shop/address).
Consequently, choosing between personal billing and company billing is currently an account-level decision (or a guest checkout decision), not a billing-address decision.
The checkout only allows the user to select postal addresses belonging to the commercial entity already associated with the current session.
Although the invoice uses the selected billing address as its partner_id, the actual debtor remains the corresponding commercial_partner_id inherited from the partner hierarchy.
As a result, changing the billing address on /shop/checkout only changes the name and address printed on the PDF invoice. It does not necessarily change the accounting debtor, provided the selected address still belongs to the same commercial_partner_id.
Relevant Odoo Fields
res.partner.commercial_partner_id
Identifies the legal/commercial entity used for:
VAT management
receivable accounting
reconciliation
commercial hierarchy (company / contacts / addresses)
sale.order
Separates:
partner_id → the customer placing the order
partner_invoice_id → the billing address
Only partner_invoice_id is propagated to the invoice.
account.move
Uses:
partner_id for displaying the invoice address,
commercial_partner_id (inherited from that address) for accounting purposes, including receivables and reconciliation.
Practical Examples
Case A — B2C Customer
Jean Dupont (contact, no parent)
commercial_partner_id = Jean Dupont
Sales Order
partner_id = Jean partner_invoice_id = Jean
Invoice
partner_id = Jean commercial_partner_id = Jean
Jean Dupont
Case B — B2B Contact, Invoice Address Under the Contact
ABC Ltd (is_company=True) └── Jean Dupont (contact)
Sales Order
partner_id = Jean partner_invoice_id = Jean's invoice child address
Invoice
partner_id = invoice address commercial_partner_id = ABC Ltd
ABC Ltd Jean Dupont
(or another layout depending on the address formatting)
Accounting
Receivable and reconciliation are posted against ABC Ltd.
Case C — B2B Contact, Invoice Issued Directly to the Company
Sales Order
partner_id = Jean
Invoice
partner_id = ABC Ltd commercial_partner_id = ABC Ltd
ABC Ltd
Accounting
Receivable and reconciliation are posted against ABC Ltd.
Case D — Guest Checkout Using company_name (without is_company=True)
Partner
Jean Dupont company_name = "ABC Ltd" is_company = False
commercial_partner_id = Jean Dupont
There is no ORM company partner representing "ABC Ltd".
ABC Ltd Jean Dupont
may be displayed.
Accounting
Receivable and reconciliation remain attached to Jean Dupont, not to ABC Ltd.
Summary
The native Odoo 18 checkout does not allow the customer to switch the legal billing entity during checkout.
The customer may choose which billing address to use, but not which commercial entity (commercial_partner_id) will become the legal debtor.
Supporting a true "Bill me as a private individual" vs "Bill me as my company" workflow therefore requires a customization capable of creating or selecting distinct commercial partners (is_company=True) and assigning the appropriate commercial_partner_id before the invoice is generated. How to handle this ?
------- EN FRANÇAIS ------
ODOO NE PERMET PAS LE CHOIX AUTONOME DE FACTURATION B2B ou B2C !??
Un client devrait pouvoir de facon autonome, sur son portal web, pouvoir être facturé en tant que particulier OU en tant que sa micro-entreprise (Adresse de facturation):
Actuellement (sur Odoo18): sur le site web natif, un visiteur ne peut pas créer un login is_company=True ni une adresse de facturation « entreprise autonome » via /shop/address. Le web gère des contacts (is_company=False) et des adresses enfants sous une entité commerciale déjà fixée par le compte ou le panier invité. La création d’une société distincte (is_company=True) passe par create_company() en back-office — le site web ne permet pas au client de créer une telle adresse de facturation sur la page /shop/checkout (-> /shop/address).
Quand Odoo génère une facture, il utilise commercial_partner_id pour déterminer l'entité commerciale "de référence". Ce champ remonte automatiquement à la racine de la hiérarchie ( parent _ id → parent id → ...). L'adresse de facturation choisie par le client ( partner_invoice_id ) ne fait que modifier l'adresse postale, pas l'entité commerciale. C'est pour ça que le nom affiché devient Jean Dupont, ABC SARL : Odoo concatène le nom de l'enfant ET le nom commercial du parent.
Le choix de facturation « personnel vs entreprise » est un choix de compte (ou de parcours invité), pas un choix d’adresse de facturation au checkout. Le checkout ne gère que des adresses postales dans l’arbre de l’entité commerciale déjà attachée à la session ; la facture prend l’adresse choisie comme partner_id, mais l’entité débitrice (commercial_partner_id) reste celle de cette adresse dans la hiérarchie partenaire.
Sur la page web shop/checkout, changer l’adresse de facturation modifie le nom/adresse PDF mais pas nécessairement l’entité débitrice — tant que la nouvelle adresse reste sous le même commercial_partner_id dans l’arbre partenaire.
Du point de vue des champs concernés:
res.partner.commercial_partner_id : identifie l’entité économique (société ou particulier) à laquelle rattacher TVA, crédit, lettrage et hiérarchie contacts/adresses.
sale.order : sépare le client (partner_id) de l’adresse facturée (partner_invoice_id) ; seul le second part en facture.
account.move : affiche l’adresse via partner_id, mais comptabilise et lettre via commercial_partner_id hérité de cette adresse.
Exemples concrets :
Cas A — Particulier B2C
Jean Dupont (contact, pas de parent)
commercial_partner_id = Jean Dupont
Commande : partner_id = Jean, partner_invoice_id = Jean
Facture : partner_id = Jean, commercial_partner_id = Jean
Nom PDF : "Jean Dupont"
Cas B — Contact B2B, facture sur le contact
ABC SARL (is_company=True)
└── Jean Dupont (contact)
Commande : partner_id = Jean, partner_invoice_id = adresse invoice enfant de Jean
Facture : partner_id = adresse invoice
commercial_partner_id = ABC SARL
Nom PDF : "ABC SARL, Jean Dupont" (ou variante selon adresse)
Lettrage : sur ABC SARL
Cas C — Contact B2B, facture sur la société
Commande : partner_id = Jean
Facture : partner_id = ABC SARL
commercial_partner_id = ABC SARL
Nom PDF : "ABC SARL"
Lettrage : sur ABC SARL
Cas D — Invité avec company_name (sans is_company=True)
Partenaire : Jean Dupont, company_name="ABC SARL", is_company=False
commercial_partner_id = Jean Dupont (pas ABC SARL en tant qu’entité ORM)
Nom PDF : peut afficher "ABC SARL, Jean Dupont"
Lettrage : sur Jean Dupont (particulier)
---------
Odoo 18 avec son tunnel d'achat natif ne permet pas au client de changer l'entité juridique de facturation pendant le processus de commande.
Le client peut choisir l'adresse de facturation à utiliser, mais pas l'entité commerciale (commercial_partner_id) qui deviendra le débiteur légal de la facture.
La prise en charge d'un véritable choix « Me facturer en tant que particulier » ou « Me facturer au nom de mon entreprise » nécessite donc une personnalisation capable de créer ou de sélectionner des partenaires commerciaux distincts (is_company=True) et d'affecter le commercial_partner_id approprié avant la génération de la facture.
Comment répondre à ce besoin ?