Un tarif de transport dépend de la destination, du poids, du volume, du nombre de colis et des options souscrites. Odoo propose une grille unique par mode d'expédition — ce qui suffit pour un seul transporteur et une seule zone.
Dix-sept modules communautaires font entrer la réalité tarifaire du transport dans le modèle.
Résumé
Trois modules traitent la destination : des grilles par destination organisées en parent et enfants, des plages de codes postaux, et l'intégration de la ville comme critère. Deux traitent les options : un référentiel d'options de transport — obligatoires ou appliquées par défaut — avec leurs modèles, repris sur les transferts.
Quatre traitent les contraintes physiques : une quantité maximum par mode d'expédition, un poids maximum par type de colis avec interdiction de dépassement au niveau société, la saisie manuelle du poids selon le transporteur, et l'estimation du nombre de colis par le poids.
Le reste traite le prix : le calcul depuis une liste de prix, le forçage d'un prix fixe ou calculé pour écraser celui d'un service en ligne, la saisie manuelle du coût, le franco calculé hors taxes, la suppression des lignes de frais nuls, des frais par colis, et les comptes transporteur avec leur configuration par environnement serveur.
L'essentiel
- Des grilles tarifaires par destination, organisées en parent et enfants.
- Des plages de codes postaux comme critère de tarif.
- Des options de transport : assurance, livraison sur rendez-vous, hayon.
- Un poids maximum par type de colis, avec interdiction de dépassement.
- Le prix forcé pour écraser celui d'un service en ligne.
- Le franco calculé hors taxes — et non sur le total TTC.
- Les lignes de frais à zéro supprimées du document client.
- Les comptes transporteur sortis de la base par environnement serveur.
Ce que ces modules ajoutent à l'instance
| Famille | Modules | Nombre |
|---|---|---|
| Destination | delivery_multi_destination, delivery_carrier_multi_zip, delivery_carrier_city | 3 |
| Options | delivery_carrier_option, delivery_carrier_agency | 2 |
| Contraintes physiques | delivery_carrier_max_quantity, delivery_carrier_max_weight_constraint, delivery_carrier_manual_weight, delivery_estimated_package_quantity_by_weight | 4 |
| Prix | delivery_carrier_pricelist, delivery_price_method, delivery_carrier_manual_price, delivery_free_over_untaxed_price, delivery_free_fee_removal, delivery_package_fee | 6 |
| Comptes | delivery_carrier_account, carrier_account_environment | 2 |
Les menus ajoutés sont dans Inventaire ▸ Configuration ▸ Livraison : agences de transport et comptes transporteur.
Tarifer selon la destination
Un transporteur n'a pas un tarif : il en a un par zone. France métropolitaine, Corse, outre-mer, Union européenne, reste du monde — avec des grilles de poids différentes dans chaque cas. Odoo ne prévoit qu'une grille par mode d'expédition.
delivery_multi_destination organise les modes d'expédition en parent et enfants : le parent porte le nom commercial — « Transporteur X — Standard » —, et chaque enfant porte une grille de destination avec son type.
delivery_carrier_multi_zipdéclenche une grille par plages de codes postaux — de 20 000 à 20 999 pour la Corse, par exemple — avec une option de comportement.delivery_carrier_cityintègre la ville comme critère, en s'appuyant sur le référentiel d'adresses étendu.
Ces trois modules permettent de reproduire fidèlement une grille transporteur réelle, qui est le seul moyen de facturer un transport au juste prix — ni à perte, ni en perdant la vente.
Les référentiels de codes postaux et de villes sont traités dans adresses et localisation.
Les options et les contraintes physiques
Les options de transport
delivery_carrier_option crée un référentiel d'options — assurance, livraison sur rendez-vous, hayon, mise en cave — chacune pouvant être obligatoire ou appliquée par défaut pour un transporteur, et reprise sur les transferts. Des modèles d'option permettent de les réutiliser d'un transporteur à l'autre.
delivery_carrier_agency ajoute un référentiel d'agences de transport : le même transporteur a plusieurs agences, et c'est l'agence qui compte pour l'enlèvement.
Les contraintes
| Module | Ce qu'il contrôle |
|---|---|
delivery_carrier_max_quantity | Une quantité maximum par mode d'expédition |
delivery_carrier_max_weight_constraint | Un poids maximum par type de colis, avec une option société interdisant le dépassement |
delivery_carrier_manual_weight | La saisie manuelle du poids et du poids expédié, selon le transporteur |
delivery_estimated_package_quantity_by_weight | L'estimation du nombre de colis à partir du poids total |
Le poids maximum par type de colis n'est pas une coquetterie : au-delà de 30 kg, un colis devient manutentionnable à deux personnes, et la plupart des transporteurs le refusent ou le surfacturent. L'interdiction de dépassement évite la surprise au quai.
Le prix : calculé, forcé, offert
delivery_carrier_pricelistcalcule le prix du transport depuis une liste de prix — donc avec toute la souplesse des règles de tarif.delivery_price_methodforce un prix fixe ou calculé par règle, pour écraser celui que renvoie un service en ligne du transporteur.delivery_carrier_manual_pricepermet de saisir manuellement le coût de transport sur une commande.delivery_free_over_untaxed_pricefait calculer le franco de port sur le montant hors taxes plutôt que sur le total.delivery_free_fee_removalsupprime les lignes de frais à zéro des documents client.delivery_package_feeajoute des frais par colis livré sur la commande.
Le franco hors taxes est un détail qui change la promesse commerciale : annoncer « franco à partir de 500 € » et l'appliquer sur le TTC fait payer le transport à un client qui a commandé 480 € hors taxes. La correction est de quelques lignes, et elle évite une discussion par commande.
Le forçage du prix répond à une situation fréquente : le service en ligne du transporteur renvoie un tarif public, alors que vous avez un tarif négocié. Sans ce module, il faut corriger à la main chaque commande.
Deux modules enfin traitent les comptes transporteur : delivery_carrier_account crée un référentiel — numéro de compte, identifiants, type de livraison —, et carrier_account_environment permet de sortir ces identifiants de la base et de les placer dans un fichier d'environnement serveur.
Le second compte autant que le premier : une copie de production restaurée pour recette ne doit pas pouvoir expédier avec le compte réel.
Limites connues
- Plusieurs modules de ce dépôt sont très peu documentés : leur résumé se limite à leur catégorie. Les champs ajoutés, relevés sur instance, en donnent la portée réelle.
- Les grilles par destination demandent un paramétrage long : c'est la saisie fidèle d'un contrat transporteur.
- Les plages de codes postaux doivent être maintenues : elles bougent moins que les tarifs, mais elles bougent.
- Forcer le prix annule l'intérêt d'un service en ligne : à réserver aux transporteurs dont le tarif est négocié.
- Le poids maximum bloque des expéditions : prévoir qui peut passer outre.
- Les comptes transporteur sont des identifiants : leur place est dans un fichier d'environnement, pas dans la base.
Identité technique
Les dix-sept modules viennent du dépôt OCA delivery-carrier, branche 18.0 — 60 modules au total —, tous en licence AGPL-3. Ils dépendent de delivery ou de stock_delivery ; la configuration par environnement s'appuie sur le module server_environment.
Les familles voisines : regrouper et scinder les transferts pour le regroupement par transporteur, et emballages, poids et unités pour les poids.
Questions fréquentes
Peut-on avoir plusieurs grilles tarifaires pour un transporteur ?
Oui : delivery_multi_destination organise les modes d'expédition en parent et enfants, chaque enfant portant une grille par destination. delivery_carrier_multi_zip y ajoute le déclenchement par plages de codes postaux, et delivery_carrier_city le critère de ville.
Peut-on interdire les colis trop lourds ?
Oui, avec delivery_carrier_max_weight_constraint : un poids maximum par type de colis et une option société interdisant le dépassement. Au-delà de 30 kg, la plupart des transporteurs refusent ou surfacturent — mieux vaut bloquer avant le quai.
Comment appliquer un tarif négocié plutôt que le tarif public du transporteur ?
delivery_price_method permet de forcer un prix fixe ou calculé par règle, en écrasant celui que renvoie le service en ligne du transporteur. Sans lui, il faut corriger chaque commande à la main. À réserver aux transporteurs dont le tarif est effectivement négocié.
Le franco de port se calcule-t-il sur le HT ou le TTC ?
Sur le total, en standard. delivery_free_over_untaxed_price le fait calculer sur le montant hors taxes. Annoncer « franco à partir de 500 € » et l'appliquer au TTC fait payer le transport à un client qui a commandé 480 € HT — et provoque une discussion par commande.
Où placer les identifiants de compte transporteur ?
delivery_carrier_account crée le référentiel — numéro de compte, identifiants, type de livraison — et carrier_account_environment permet de les sortir de la base vers un fichier d'environnement serveur. C'est ce qui évite qu'une copie de production restaurée pour recette expédie avec le compte réel.
Se faire accompagner
La tarification transport est l'endroit où une PME perd silencieusement de la marge : un tarif public appliqué au lieu du négocié, un franco calculé sur le TTC, des colis surfacturés pour dépassement de poids. Chacun de ces écarts est faible et systématique.
Nous reprenons donc les contrats transporteur un par un et nous les saisissons fidèlement — grilles, zones, options, seuils — avant de parler d'intégration. Un tarif juste vaut mieux qu'une étiquette automatique sur un prix faux. Voir les prestations d'Atalios Consulting ou demander un rappel.
Pour aller plus loin
- Regrouper, scinder et suivre les transferts
- Emballages, poids et unités de mesure
- Transport et logistique avec Odoo
En résumé
Les grilles tarifaires réelles d'un transporteur — par zone, par code postal, par poids — avec leurs options et leurs seuils, et les corrections qui évitent les pertes silencieuses : tarif négocié imposé, franco calculé hors taxes, colis trop lourds refusés avant le quai. Parlons de vos coûts de transport.