Odoo's built-in apps don't always cover a business process, so teams add custom modules. This guide shows how to install one on your own server or on Odoo.sh, what you can and can't do on Odoo Online, and how to fix the errors people hit most often. Need a module built first? See our custom Odoo module development page.
version key in its __manifest__.py (for example 17.0.1.0.0).depends in the manifest, and any Python packages the module needs.
Copy the module folder into your custom addons folder, for example /opt/odoo/custom-addons/.
The module folder must contain __init__.py and __manifest__.py. If the folder
doesn't exist yet, create it first.
sudo mkdir -p /opt/odoo/custom-addons
scp -r my_module user@your-server:/tmp/
sudo mv /tmp/my_module /opt/odoo/custom-addons/
sudo chown -R odoo:odoo /opt/odoo/custom-addons/
Replace odoo:odoo with the user and group your Odoo service runs as.
Open odoo.conf (often /etc/odoo.conf) and add your folder to
addons_path, separated by a comma from the existing paths.
[options]
addons_path = /opt/odoo/odoo/addons,/opt/odoo/custom-addons
sudo systemctl restart odoo
Use the service name your server uses if it is not odoo.
Go to Settings → Activate the developer mode. You can also add
?debug=1 to the URL, for example https://your-odoo.com/odoo?debug=1.
Go to Apps → Update Apps List and confirm.
In the Apps menu, remove the default Apps filter from the search bar, search for your module by name, and click Activate (called Install in older versions).
Open the new menus or features the module adds, and check the Odoo log for errors.
sudo tail -f /var/log/odoo/odoo-server.log
Your log path may differ. It is set by logfile in odoo.conf.
You can also install a module without the web interface. Use -i to install and
-u to upgrade it later. --stop-after-init makes Odoo exit when it is done.
# install
odoo-bin -c /etc/odoo.conf -d your_db -i module_name --stop-after-init
# upgrade after you change the module
odoo-bin -c /etc/odoo.conf -d your_db -u module_name --stop-after-init
Use odoo instead of odoo-bin if you installed Odoo from a package.
Put the module folder in your project's repository, on a staging branch first.
git checkout staging
git add my_module/
git commit -m "Add my_module"
git push origin staging
Odoo.sh builds the branch automatically.
Open the staging build, update the apps list and install the module, as in steps 5 to 7 above.
When testing is done, merge the branch into your production branch.
Odoo Online (the standard cloud plan) doesn't allow custom Python modules, so the steps above don't work there.
| Problem | Likely cause and fix |
|---|---|
| Module doesn't show in Apps | Wrong addons path, Odoo not restarted, apps list not updated, or the Apps filter is still on |
| "Module not found" or missing dependency | Install the modules listed in depends first |
| Python import error in the log | Install the missing Python package with pip (in the same environment Odoo uses), then restart |
| Module installs but nothing changes | Clear your browser cache, or upgrade the module (-u module_name) |
| Error after an Odoo upgrade | The module was built for an older version and needs migrating. See our Odoo migration service |
| Permission denied | Fix the folder ownership (Step 2 above) |
Can I install a custom module on Odoo Online?
No. Odoo Online (the standard cloud plan) does not allow custom Python modules. You can use Studio for no-code changes. If you need custom code, move to Odoo.sh or your own server.
Where do I put custom modules in Odoo?
Put them in a separate custom addons folder, for example /opt/odoo/custom-addons/, and add that folder to addons_path in odoo.conf. Do not put custom modules inside Odoo's own addons folder.
Why doesn't my module show in the Apps list?
The most common causes are a wrong addons_path, Odoo not restarted, the apps list not updated, or the Apps filter still active in the search bar. Also check that the module folder contains __init__.py and __manifest__.py.
How do I update a custom module after changing it?
Restart Odoo, then upgrade the module from the Apps menu, or run Odoo from the command line with -u module_name. On Odoo.sh, push your change to the branch and upgrade the module on that build.
Will my custom module work after an Odoo upgrade?
Not always. A module built for an older Odoo version usually needs to be migrated and tested before it works on a newer one. Check the version in __manifest__.py and test on a staging copy first.