Install a module from the marketplace
What the marketplace actually does when you install - it commits the module into your repository - and the four checks it runs before writing anything.
Verified on August 13, 2026
The marketplace does not install anything into your Odoo. It commits the module's source into your repository, and from there the module travels the same road as code you wrote yourself.
That one sentence prevents most of the confusion. A module you take from the marketplace becomes part of your branch, is built into your image, and is deployed like everything else — which is exactly what makes it reproducible, restorable and reviewable.
Browsing, and owning
The catalogue lists what is published. Taking a module gives your team an entitlement, and the entitlement is what unlocks the rest.

The import wizard does not open from the catalogue — it opens from Purchased, one action per entitlement. The server checks the entitlement before anything else, so a module you do not own cannot reach step one.
The whole area is gated by marketplace.install.
Four steps, and none of them writes
Use in environment opens a wizard: environment, then version, then a preview, then the import itself.

The first two lists are computed by the server rather than filtered in the browser:
- Environments — only those that can actually receive this module.
- Versions — only those compatible with the environment you picked.
If either list is empty, that is the answer, and it is more useful than an error would have been.
What is checked before anything is written
Four conditions, each refused with its own reason:
| Condition | Why it exists |
|---|---|
| You hold an entitlement | You can only import what your team owns. |
| The environment is active | A stopped environment cannot be built onto. |
| The environment has a repository | There is nowhere to commit to otherwise. |
| The version's Odoo version equals the environment's | Not "compatible with" — equal. A 19.0 module does not go into a 18.0 environment. |
That last one is stricter than most people expect, and it is why the version list can come back empty for a module you certainly own.
The preview is the last screen before the write
Preview import performs a dry run and echoes back exactly what would happen: the branch it would commit to, the path the module would occupy, and the Odoo version it was matched against.

Read the branch. The wizard uses the environment's branch, so importing into a staging environment commits to the staging branch — which is usually what you want, and is occasionally a surprise.
If the module is already there, the preview says so and offers the choices that make sense for that case rather than failing.
The default path is marketplace/<technical_name>. You can change it, but keeping marketplace modules
under one directory is what lets you tell, six months later, which code you wrote and which you took.
After the import: the ordinary road
Confirming writes a commit onto the branch. Then, without you asking:
- The import records the commit it created.
- A build is requested automatically for that commit.
- The module appears in the environment's Modules tab — as Deployment required, because it is in your branch and not yet in the running image.
From there it is the loop the other guides describe: deploy the build to put the module in the image, then install it in Odoo. The guide on deploying from Git covers the first, and the modules guide covers the second.
Nothing about a marketplace module is special afterwards. It is code in your repository.
When it refuses, and one thing that is not ready
The refusals worth recognising:
- The target path already exists — the import stops rather than overwriting code that is already there. Choose another path, or handle the existing copy first.
- No repository linked — connect one to the environment first.
- Git credentials — the platform needs write access to commit; a revoked token shows up here.
And one honest limitation: the wizard offers an import mode, and only direct commit is available. The pull-request option is shown disabled rather than removed, because it is the intended second mode — but until the pipeline carries it, choosing it would have committed directly anyway, which is worse than not offering it.