Skip to main content
iVentureTeam

mondialrelay_relay

A carrier's own map, loaded from their servers into an Odoo form. It is one of the very few widgets in core that pulls a third-party script, and it comes with a hand-written workaround for that carrier's bug.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 7, 20266 min read
Technical namemondialrelay_relay
Field typeschar
Viewsform
Moduledelivery_mondialrelay, a delivery carrier integration
Used in core1 occurrence, the delivery method dialog in delivery_mondialrelay
VersionsOdoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. It is part of a carrier integration and depends on that carrier's script
Alternativeschar, many2one, popover_widget

What the relay point picker does

Some carriers deliver to a pickup point rather than to an address, and the customer has to choose which one. That choice is a map, and the carrier publishes their own widget for it, because only they know where their points are and whether each one is open.

Rather than reimplementing that, Odoo embeds it. This widget loads the carrier's script from their servers, renders their picker into a container on the delivery method dialog, and configures it from the record: the brand, the service mode, which countries are allowed, and the customer's postcode and country so the map opens somewhere useful.

When the customer picks a point, the carrier's script hands back its details, and the widget stores a JSON summary of the address in the field. So what Odoo keeps is a snapshot of the chosen point rather than a link to a record.

What this means for your team

Pickup point delivery is cheaper than to-the-door and, in several markets, what customers prefer. Making the choice inside Odoo rather than on the carrier's site is what makes it usable for an internal sales or support user preparing an order on the customer's behalf.

The dependency is the flip side. The map is served from the carrier's infrastructure, so it needs the user's browser to reach the internet, and an outage or a change on their side shows up as a broken area inside your ERP. This widget is the clearest example in core of that trade, and it is worth naming explicitly in any project that relies on it.

The bigger planning point is that the module is gone in the next version. Whatever replaces it, a database that depends on this integration should not be upgraded without checking what is available first.

Supported options in Odoo 19

There is nothing to configure from the view. The registration provides a component and nothing else: no options, no supported types, no extractor. Everything the map needs is read from the record, and those fields are listed below. Read from mondialrelay_field.js, Odoo 19.0.

OptionTypeWhat it does
is_mondialrelayfield read by literal nameDecides whether the widget renders at all. On any other delivery method nothing is rendered and the carrier's script is not loaded.
mondialrelay_brandfield read by literal nameThe account identifier passed to the carrier's picker.
mondialrelay_allowed_countriesfield read by literal nameRestricts which countries the map offers points in.
shipping_zipfield read by literal nameOpens the map near the customer's postcode. Empty is tolerated.
shipping_country_codefield read by literal nameSets the map's country. Empty is tolerated.
mondialrelay_last_selected_idfield read by literal namePre-selects a previously chosen point when the dialog reopens.

Six values are read from the record by literal name. They configure the carrier's picker, and the widget also reads a flag deciding whether to render at all. None is declared as a dependency, so the delivery dialog has to load all of them.

Working examples

The core usage

<field name="mondialrelay_last_selected"
       widget="mondialrelay_relay"/>

No options. The widget renders nothing at all unless the chosen delivery method is that carrier.

What it writes

{
  "id": "FR-012345",
  "name": "Point Relais",
  "street": "...", "zip": "...",
  "city": "...", "country": "FR"
}

A JSON snapshot of the chosen point, stored as text on the record.

The values it configures the map with

is_mondialrelay          # render or not
mondialrelay_brand       # account identifier
mondialrelay_allowed_countries
shipping_zip, shipping_country_code
mondialrelay_last_selected_id  # pre-selects a point

All read from the record, none declared as a dependency.

A third-party script, and a workaround for its bug

Three things make this widget unusual in Odoo core, and all three are worth knowing before depending on it.

It loads a third-party script by URL at render time, guarded so the load happens once. That is rare in core, and it makes the widget's availability a function of the user's network rather than of the database.

It talks to that script through the jQuery plugin interface the carrier publishes, wrapping its container element and calling their initializer with a parameters object, then triggering a rebind so the map lays out correctly inside a dialog.

And it contains a workaround written against a bug on the carrier's side. When the picker reports no results, a comment explains that the carrier's script can crash with a cross-origin error, and the widget temporarily suppresses Odoo's third-party script error handler so that crash does not surface as an Odoo error dialog. It is candid about being a hack, and it is a good example of the kind of maintenance an embedded third-party widget brings with it.

The rendering guard is simpler but important: the container element only exists when the record says the chosen method is that carrier, so on any other delivery method the widget renders nothing and loads nothing.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The carrier integration module is absent from the development branch.
Odoo 19.0VerifiedVerified against the shipped source.
Odoo 18.0VerifiedSame approach and the same workaround.
Odoo 17.0VerifiedSame approach with older component conventions.
Odoo 16.0VerifiedSame approach with older component conventions.

Upgrade note. The widget has been present since Odoo 16 with the same approach, so nothing needs migrating within that range. The change to plan for is the next version, where the module is absent entirely.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and this may still change; we re-verify the page after release.

The module is gone. The carrier integration module is not present on the development branch, and neither is this widget. That is consistent with a wider reshaping of which carrier integrations ship in the core repository.

For a database using this integration, that is a question to answer before upgrading rather than a migration to perform: what replaces it, and whether the pickup point data you have stored still means anything to the replacement.

Common problems and fixes

SymptomCause and fix
No map appearsThe chosen delivery method is not that carrier, so the widget renders nothing by design. Select the carrier's delivery method first.
The map area stays blankThe carrier's script could not be loaded from the user's browser. Check outbound access to the carrier's domain from the user's network.
An error appears when the postcode is invalidA known crash in the carrier's own script when no results are returned. The widget suppresses Odoo's handler briefly for exactly this; enter a valid postcode.
The map opens in the wrong countryThe shipping country or postcode is empty on the record. Fill the delivery address before opening the dialog.
A previously chosen point is not preselectedThe field holding the last selection is empty or not loaded. Check that field on the record; the widget reads it by literal name.
Missing widget errorThe carrier integration module is not installed, or the database is on a version without it. Install the module if available; on the next version it is absent entirely.

Relay point picker vs the alternatives

WidgetBest forKey difference
mondialrelay_relayChoosing a carrier pickup point without leaving OdooEmbeds the carrier's own script and stores the chosen point as a JSON snapshot
charRecording a pickup point by handNo map, no validation, but no external dependency either
many2oneChoosing from points stored in your own databaseA real relation, at the cost of maintaining the point list
popover_widgetExplaining a delivery exception on a rowContextual notes rather than an embedded picker

There is no drop-in alternative, because the map belongs to the carrier. Where an integration is not available, the usual fallback is to capture the pickup point as a normal address on the delivery, which loses validation but keeps the process working. Any custom carrier integration that embeds a supplier's script should expect the same maintenance burden this widget documents.

Frequently asked questions

Where does the map come from?+
The carrier's own servers. The widget loads their script by URL at render time and renders their picker into a container on the dialog, which means it depends on the user's browser reaching that domain.
What is stored when I pick a point?+
A JSON snapshot of the point's address, written into the field. It is not a relation to a record, so the details are captured as they were at the time of choosing.
Why does the widget disable an error handler?+
A comment in the source explains that the carrier's script can crash with a cross-origin error when no results are returned, and the widget suppresses Odoo's third-party script handler briefly so that crash does not surface as an Odoo error.
Why does nothing render on other delivery methods?+
The container element is conditional on a field saying the chosen method is that carrier. On anything else the widget renders nothing and does not load the script.
Does it exist in Odoo 20?+
Not on the development branch. The whole carrier integration module is absent, so a database relying on it needs a plan before upgrading.

Shipping integrations that survive an upgrade

Carrier connectors, rate shopping and label printing are the part of a delivery setup most likely to change between Odoo versions. We plan and implement shipping integrations on versions 16 through 19, with an eye on what happens next.

Book a free consultation

How this page was produced

The script load, the render guard, the parameters passed to the carrier's picker, the JSON written on selection and the error handler workaround with its comment were read from mondialrelay_field.js on the Odoo 19.0 branch, with the usage taken from delivery_mondialrelay/wizard/choose_delivery_carrier_views.xml. Version coverage comes from comparing the file across the 16.0, 17.0 and 18.0 branches, and the module's absence was verified by listing the addons directory on the public development branch. Spotted an error? Tell us and we will correct the page.