Stop carrier weight and dimension surcharges before the parcel leaves — multi carrier shipping base for Odoo Community: refuses a shipment over the weight or size limit, incomplete address, missing customs declaration or unchosen pickup point. Parcels, packaging, tracking, shipping log. Free.
Overview
Multi-carrier base — the entry product of a family
This module talks to no carrier. It makes no network calls. It lays down what every carrier needs, once, and leaves it to the operator modules — paid, one per carrier — to talk to anyone at all.
That is what makes it installable, readable and testable without any merchant account, and that is what must remain true.
What it covers
A shipment attached to the delivery order: carrier, service, weight and dimensions consolidated from the packages, insured value, incoterm, tracking number and URL, and actual cost billed alongside the estimated cost.
Packages: the module does not duplicate any Odoo field. Dimensions, tare and maximum weight come from the native package type; the declared weight follows Odoo's convention — weighed weight if it exists, otherwise contents + tare. The base module only adds length + girth, which Odoo calculates nowhere.
One extension point per carrier: five named methods with a documented contract, which each carrier module will implement — rate, label, track, cancel, and search for pickup points.
Pickup points: storage, selection on the order, carried over to the delivery slip and printed on it.
The dispatch log: every attempt, successful or not, leaves a dated line with its operator, a summary of the request and the response.
The queue: Odoo holds the queue, an external process consumes it and comes back to record its result.
What it refuses
This is where the module earns its keep. It refuses to prepare a shipment when the weight exceeds the service's declared limit, when a dimension exceeds the maximum, when length + girth exceeds the limit, when the address is missing a field required for the destination country, when a shipment outside the EU is missing its customs declaration, or when a pickup point is required but not selected.
Every refusal names what is missing and the value at issue. Never “invalid shipment”, but: “Package PACK0003: height of 82.0 cm against a maximum of 60.0 cm on the ‘Home delivery’ service.”
Caps are not in the code
No carrier figure is hard-coded. Weight and dimension limits are configurable fields per service, with a “Limits source” field to record where the figure comes from and when it was checked. The base does not need to know a carrier's limits: it only needs to know how to enforce them.
What it does not do
It calls no carrier, looks up no pickup point, buys no label and calculates no rate. Installed on its own, its five extension methods raise an explicit error stating which carrier module to install.
Specifications
| Price | Free |
|---|---|
| License | LGPL-3 |
| Odoo series | 19.0: published on the Odoo Apps Store; 20.0: published on the Odoo Apps Store |
| Version | 1.0.0 |
| Edition | Odoo Community / on-premise |
| Technical name | dyo_transporteurs_base |
| Domain | Purchase, inventory and logistics |
Price excluding VAT as displayed on the Odoo Apps Store; purchase and installation are done on the Store or through your Omnifloo instance.