Before you choose apps, plans or a partner, there is a more basic question: where will your Odoo run? Odoo gives you three options - Odoo Online, Odoo.sh and on-premise (your own server or cloud). They run the same software, but they differ a lot in what you are allowed to customise, who looks after the servers, how upgrades happen and what you end up paying. This guide compares them in plain language, shows how to install Odoo 20 on your own server, and ends with a simple way to decide.
Key takeaways
- Odoo Online is Odoo's software-as-a-service: nothing to install or maintain, but no custom code and no Odoo Apps Store modules, and upgrades are mandatory.
- Odoo.sh is Odoo's cloud platform for customised Odoo: your own modules from GitHub, staging and development branches, and Odoo runs the servers. It needs the Custom plan and is priced by workers, storage and staging environments on top of the licence.
- On-premise gives you full control - Odoo Community for free, or Enterprise with the Custom plan - and full responsibility for the server, security, backups and upgrades.
- On Odoo 20 your own server needs Python 3.12 or newer and PostgreSQL 16 or newer; Ubuntu 24.04 LTS meets both out of the box, Debian 12 does not.
- You can move between the three later, with a few rules: Odoo Online does not accept non-standard apps, and its intermediate versions must be upgraded to the next major version before leaving it.
The three ways to run Odoo
It helps to separate two things that are often mixed up: the edition (Odoo Community, free and open source, or Odoo Enterprise, the paid edition with more apps and features) and the hosting (where the database runs). Odoo Online and Odoo.sh always run Odoo Enterprise. On-premise can run either edition.
| Odoo Online | Odoo.sh | On-premise | |
|---|---|---|---|
| What it is | Software as a service, hosted by Odoo | Platform as a service for Odoo, hosted by Odoo | Odoo installed on a server you run |
| Edition | Enterprise | Enterprise | Community or Enterprise |
| Who runs the servers | Odoo | Odoo | You (or your IT partner) |
| Custom Python modules | No | Yes, from your GitHub repository | Yes |
| Odoo Apps Store modules | No | Yes | Yes |
| Studio (no-code customisation) | Yes, Custom plan | Yes | Enterprise only |
| Server and shell access | No | Shell and SSH, online editor | Full root access |
| Test copies | Duplicates in test mode (up to five, kept 15 days) | Staging and unlimited development branches | Whatever you set up |
| Backups | Daily, by Odoo; download from the database manager | By Odoo, stored on three servers in different locations | Your responsibility |
| Upgrades | Mandatory and scheduled by Odoo | Within the support window, done by you with Odoo's upgrade service | When you choose, or never |
| Licence needed | One App Free, Standard or Custom plan | Custom plan | Community: none. Enterprise: Custom plan |
| Hosting cost | Included in the licence | Workers + storage + staging, on top of the licence | Your server or cloud bill, plus your time |
| Best for | Standard processes, fast start, no IT team | Custom development without running servers | Full control, data residency, Community edition |
Odoo Online: Odoo as software-as-a-service
Odoo Online is the simplest way to run Odoo. You sign up at odoo.com, choose your apps and you have a working database in a few minutes. There is nothing to install: Odoo runs the servers, applies security fixes, takes a backup every day and upgrades the database for you.
Odoo describes Online databases as private databases accessed through a web browser that can be used for long-term production or as a test environment. The database manager lets you download a backup as a ZIP file, duplicate a database for testing (a duplicate in test mode switches off emails and payments, you can keep up to five and they expire after 15 days), rename it, connect your own domain name, see administrator activity logs, transfer ownership and change plan.
The limits of Odoo Online
- No custom code. In Odoo's own words, Odoo Online is "incompatible with custom modules or modules from the Odoo Apps Store". You can customise with configuration, Studio and automation rules, but not with Python modules.
- Mandatory upgrades. A major version upgrade is mandatory every two years, and Online databases on an intermediate version must move to the next one a few weeks after it is released. You get a notice in the database a few weeks before; if you do nothing, the upgrade runs automatically.
- No server access. No shell, no direct database access, no control over the timing of maintenance.
In return, Online databases get new features first: between major releases, Odoo Online runs intermediate "SaaS" versions that the other two hosting types do not receive.
Choose Odoo Online if your processes fit standard Odoo, possibly with Studio customisations, and you do not want to manage servers or upgrades.
Odoo.sh: the cloud platform for customised Odoo
Odoo.sh sits between the two other options. Odoo still runs and monitors the servers, but you work like a development team: your custom modules live in a GitHub repository connected to Odoo.sh, and every branch becomes an Odoo environment.
- Development branches (unlimited) build a fresh database with demo data and run your tests on every push.
- Staging branches run on a copy of your production data, so you can test a change or an upgrade on real data before releasing it.
- Production is the live database; merging into the production branch deploys your code.
- Included: continuous integration and testing, GitHub and Odoo Apps integration, shell and SSH access, an online editor, 24/7 monitoring, automatic DNS and email, live storage replication and backups on three servers in different locations.
How Odoo.sh is priced
Odoo.sh hosting is billed separately from the Odoo licence, and Odoo states that the hosting price does not include the Enterprise licence, which you need on the Custom plan. You size three things:
- Workers - the server processes that answer users and run scheduled jobs, from 1 to 16 on shared hosting.
- Storage - database and file storage, from 1 to 512 GB.
- Staging environments - from 0 to 20.
Above 16 workers or 512 GB you move to a dedicated server. Prices depend on billing period and currency, so use the calculator on Odoo.sh's pricing page for current figures.
For upgrades, a major version on Odoo.sh is supported for three years, after which you have another two years to complete the upgrade. Your custom modules must be ported to the target version first - Odoo's upgrade service upgrades the standard data, not your code.
Choose Odoo.sh if you need custom modules or Apps Store modules but do not want to run servers, and you want proper development, staging and production environments.
On-premise: Odoo on your own server
On-premise means you install Odoo yourself - on a physical server in your office, a virtual machine, or any cloud provider such as AWS, DigitalOcean, Hetzner or Azure. "On-premise" in Odoo's vocabulary simply means "not hosted by Odoo".
- Any edition. Odoo Community is free and open source (LGPL), with fewer apps and no Studio. Odoo Enterprise on your own server needs the Custom plan.
- Full control. Any module, any integration, direct database access, your choice of region and data residency, your own maintenance windows.
- No forced upgrades. Odoo says you can stay on the same version indefinitely, although it does not recommend it. With Enterprise, upgrades through Odoo's upgrade service are free; custom and third-party modules remain your responsibility.
- Full responsibility. Server sizing, operating system updates, security, SSL, monitoring and backups are yours - or your partner's.
Choose on-premise if you want Odoo Community, need full control or a specific location for your data, already run your own infrastructure, or want to avoid per-environment hosting fees.
Licences and cost: what you actually pay for
Every option has two parts - the licence and the hosting:
| Licence | Hosting | Other costs to plan for | |
|---|---|---|---|
| Odoo Online | One App Free, Standard (all apps) or Custom (all apps plus Studio, multi-company and external API) | Included | Implementation and training |
| Odoo.sh | Custom plan | Workers, storage and staging environments | Development, module maintenance, upgrades of custom code |
| On-premise Enterprise | Custom plan | Your server or cloud provider | System administration, backups, monitoring, upgrades |
| On-premise Community | None | Your server or cloud provider | As above, and you build or buy what Community lacks |
On Odoo's US price list in October 2026, Standard costs US$24.90 and Custom US$49.00 per user per month with yearly billing for the first 12 months. Only the Custom plan can be used on Odoo.sh or on-premise. Our article on Odoo Enterprise pricing per user in 2026 covers all plans, renewal prices and the new Light User in detail.
How to start on Odoo Online
- Go to odoo.com (affiliate link), choose your apps and start the free trial.
- Pick your country, language and the region of your database.
- Configure your company, import your data and invite your users.
- Before the trial ends, choose a plan. You can connect your own domain name from the database manager.
How to start on Odoo.sh
- Get an Odoo Enterprise subscription on the Custom plan.
- Sign in to odoo.sh with your GitHub account and create a project: name it, link or create the GitHub repository, and enter your subscription code.
- Choose the hosting location, the Odoo version, and size the workers and storage.
- Push your custom modules to a development branch, test them on a staging branch with a copy of production, then merge into production.
How to install Odoo 20 on your own server
These steps install Odoo 20 Community on Ubuntu 24.04 LTS. Odoo 20 needs Python 3.12 to 3.14 and PostgreSQL 16 or newer; Ubuntu 24.04 ships Python 3.12 and PostgreSQL 16, so it works out of the box. Debian 12 ships Python 3.11 and PostgreSQL 15, both too old for Odoo 20.
| Requirement | Odoo 20 | Odoo 19 |
|---|---|---|
| Python | 3.12 to 3.14 | 3.10 to 3.14 |
| PostgreSQL | 16 or newer | 13 or newer |
| Reference platform | Ubuntu 24.04 LTS packages | |
| PDF reports | wkhtmltopdf 0.12.6 with patched Qt | |
For a small company, a server with 2 to 4 CPU cores, 4 to 8 GB of RAM and SSD storage is a sensible start; size up with the number of users, the website traffic and how much you automate.
Option 1: Odoo's packages (quickest)
Odoo publishes nightly Debian packages. This installs Odoo as a service with its configuration file in /etc/odoo/odoo.conf:
# PostgreSQL first sudo apt update && sudo apt install -y postgresql # Odoo's signing key and repository for 20.0 wget -qO - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/20.0/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list # Install and start sudo apt update && sudo apt install -y odoo sudo systemctl status odoo
Odoo now answers on port 8069. Open http://your-server:8069 to create the first database, then put Odoo behind a reverse proxy with HTTPS (see below).
Option 2: from source (more control)
Installing from Git is what most partners use in production: you pin the exact code, add your own module folders and update with a simple git pull.
# System packages sudo apt install -y git python3-venv python3-dev build-essential postgresql \ libpq-dev libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev libjpeg-dev zlib1g-dev # A system user for Odoo and a matching PostgreSQL role sudo adduser --system --group --home /opt/odoo odoo sudo -u postgres createuser -d odoo # Odoo 20 source and a Python virtual environment sudo -u odoo git clone --depth 1 --branch 20.0 https://github.com/odoo/odoo.git /opt/odoo/odoo sudo -u odoo python3 -m venv /opt/odoo/venv sudo -u odoo /opt/odoo/venv/bin/pip install -r /opt/odoo/odoo/requirements.txt
Then a configuration file, /etc/odoo.conf:
[options] ; master password for the database manager - make it long admin_passwd = change-me-to-a-long-random-string db_user = odoo addons_path = /opt/odoo/odoo/addons,/opt/odoo/custom-addons ; behind nginx: listen locally only, trust the proxy headers http_interface = 127.0.0.1 proxy_mode = True ; multi-process mode for production workers = 4 max_cron_threads = 1 list_db = False logfile = /var/log/odoo/odoo.log
And a systemd service, /etc/systemd/system/odoo.service:
[Unit] Description=Odoo 20 After=network.target postgresql.service [Service] User=odoo Group=odoo ExecStart=/opt/odoo/venv/bin/python3 /opt/odoo/odoo/odoo-bin -c /etc/odoo.conf Restart=on-failure [Install] WantedBy=multi-user.target
sudo install -d -o odoo -g odoo /var/log/odoo /opt/odoo/custom-addons sudo systemctl daemon-reload && sudo systemctl enable --now odoo
For PDF reports, install the patched-Qt build of wkhtmltopdf 0.12.6 from the wkhtmltopdf project's packaging releases; the version in Ubuntu's own repository is built without the patched Qt and leaves out report headers and footers. For Odoo Enterprise on your own server, add the Enterprise add-ons from your subscription to addons_path (before the Community add-ons) and register the database with your subscription code.
Reverse proxy, HTTPS and the live-chat websocket
Put nginx in front of Odoo and get a free certificate from Let's Encrypt. In multi-process mode Odoo serves its real-time features (live chat, notifications, the "loading" indicator for signed-in users) on a separate port, 8072, at the path /websocket. A common mistake is to forget it - signed-in users then see Odoo trying to reconnect forever.
upstream odoo { server 127.0.0.1:8069; }
upstream odoochat { server 127.0.0.1:8072; }
server {
server_name erp.example.com;
client_max_body_size 100m;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
location /websocket {
proxy_pass http://odoochat;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / { proxy_pass http://odoo; }
}
sudo apt install -y nginx certbot python3-certbot-nginx sudo certbot --nginx -d erp.example.com --redirect
Production checklist
- Workers: Odoo's rule of thumb for the maximum is (CPU cores x 2) + 1; each worker also needs memory, so check RAM before raising it.
- Close port 8069 to the internet. With
http_interface = 127.0.0.1and a firewall allowing only SSH, HTTP and HTTPS (for exampleufw allow OpenSSH,ufw allow 'Nginx Full',ufw enable), every visitor goes through nginx and HTTPS. - Protect the database manager: a long
admin_passwdandlist_db = Falseonce your database exists. - Back up both parts: the PostgreSQL database (
pg_dump -Fc) and the filestore (attachments) - and copy them off the server. Test a restore now and then. - Stay patched: apply Odoo's updates (
apt upgradeorgit pullfollowed by a restart) and your operating system's security updates. - Monitor: disk space, memory, the Odoo log and the expiry of your SSL certificate.
Moving between Odoo Online, Odoo.sh and on-premise
Your first choice is not final. Odoo documents every direction:
| From | To | How |
|---|---|---|
| On-premise | Odoo Online | Only standard apps: duplicate the database, uninstall non-standard apps on the copy, download a dump with filestore and send it to Odoo support. The version must still be supported. |
| On-premise | Odoo.sh | Import the database into your Odoo.sh project. |
| Odoo Online | On-premise or Odoo.sh | Download a backup from the database manager and restore it. Intermediate (SaaS) versions are not supported outside Odoo Online, so upgrade to the next major version first. |
| Odoo.sh | Odoo Online | Uninstall non-standard apps in a staging build, then ask Odoo support to migrate the branch. The database is not reachable during the migration. |
| Odoo.sh | On-premise | Download a backup of production and restore it on your server. |
If your database also needs a version upgrade, read our notes on upgrading to Odoo 20 and the Odoo 20 release notes.
How to choose
| If this describes you | Start with |
|---|---|
| Standard processes, small or no IT team, you want to go live quickly | Odoo Online |
| You need custom modules or Apps Store modules, but not servers to look after | Odoo.sh |
| You want Odoo Community, full control, a specific data location, or you already run servers | On-premise |
| You start simple but expect custom development later | Odoo Online now, then Odoo.sh or on-premise when the first custom module is needed |
Two questions settle most cases. First: will you need custom Python code? If yes, rule out Odoo Online. Second: who will look after the server at 2 a.m.? If nobody, rule out on-premise - or have a partner do it for you.
Frequently asked questions
What is the difference between Odoo Online and Odoo.sh?
Both are hosted by Odoo. Odoo Online is software-as-a-service for standard Odoo: no custom code or Apps Store modules, and upgrades are scheduled by Odoo. Odoo.sh is a platform for customised Odoo: you deploy your own modules from GitHub and get development, staging and production environments, and you pay for hosting on top of the Custom plan.
Can I install custom modules on Odoo Online?
No. Odoo Online is incompatible with custom modules and with modules from the Odoo Apps Store. You can customise it with settings, Studio and automation rules. For custom Python code you need Odoo.sh or on-premise.
Is Odoo free to self-host?
Odoo Community is free and open source, and you can install it on your own server at no licence cost; you pay only for the server and its upkeep. Odoo Enterprise on your own server needs a subscription on the Custom plan.
Which plan do I need for Odoo.sh or on-premise Enterprise?
The Custom plan. The Standard plan includes all apps but only on Odoo Online; the Custom plan adds Studio, multi-company and external API access and can be hosted on Odoo Online, Odoo.sh or on-premise.
Can I move from Odoo Online to my own server later?
Yes. Download a backup from the Odoo Online database manager and restore it on-premise or on Odoo.sh. Intermediate versions that exist only on Odoo Online must first be upgraded to the next major version.
Are Odoo upgrades mandatory?
On Odoo Online, yes: a major upgrade every two years and intermediate versions a few weeks after the next is released, done automatically if you do not act. On Odoo.sh a version is supported for three years, followed by two years to complete the upgrade. On-premise you can stay on a version indefinitely, although Odoo does not recommend it.
What server do I need for Odoo 20?
A Linux server with Python 3.12 to 3.14 and PostgreSQL 16 or newer. Ubuntu 24.04 LTS provides both out of the box. For a small company, 2 to 4 CPU cores and 4 to 8 GB of RAM is a sensible start.
How many Odoo workers should I configure?
Odoo's rule of thumb for the maximum is (CPU cores x 2) + 1, limited by the memory available. A 2-core server can run up to 5 workers if it has the RAM; start lower and watch memory and response times.
See Odoo for yourself
Start a free Odoo trial and click through Sales, Inventory, Accounting and the website builder with your own data. When you want it set up around how your business works, that is where we come in.
Not sure which hosting fits your business?
We set up and run Odoo on all three - Odoo Online, Odoo.sh and our clients' own servers - and move databases between them. We will look at your processes and customisation needs and recommend the option that costs you least over the next few years.
Sources: Odoo documentation (Hosting, Odoo Online, Upgrade), Odoo.sh pricing page, Odoo pricing page, the Odoo 20 source code and Odoo's package repository, all read in October 2026. Prices and limits change - check Odoo's pages for current figures.