Undersize your Odoo server and you get slow page loads, failed report generation, and frustrated users. Oversize it and you pay for resources you never touch. This guide gives you concrete numbers for every deployment size, from a solo freelancer testing Odoo on a $4 VPS to a 500-user enterprise running a multi-server cluster.
These numbers apply to Odoo 18 (the LTS stream through October 2027), Odoo 19, and Odoo 20 (the current major release, shipped 2026-09-24). CPU, RAM, and storage sizing is nearly identical across the three. The software baseline is where Odoo 20 differs: it needs Python 3.12 or later, PostgreSQL 16 or later, and the pgvector extension for embedding and AI features. If you are still running Odoo 16 or 17, the hardware numbers below still hold. Older versions use slightly less RAM but more CPU due to less efficient ORM queries.
In this guide
Minimum Requirements (Odoo 18/19/20)
The bare minimum to install and run Odoo on a single server with PostgreSQL. The hardware numbers are the same across v18, v19, and v20. Odoo 20 raises the Python and PostgreSQL baseline and adds the pgvector extension.
| Resource | Minimum | Notes |
|---|---|---|
| CPU | 2 vCPU | 1 vCPU technically works but Odoo + PostgreSQL will compete for CPU cycles |
| RAM | 2 GB | Odoo idles at ~500 MB, PostgreSQL needs ~300 MB. Leaves almost no headroom. |
| Storage | 20 GB SSD | OS (~5 GB) + Odoo (~2 GB) + PostgreSQL + logs. No room for filestore growth. |
| OS | Ubuntu 22.04/24.04 LTS | Debian 12 also works. RHEL/Rocky require extra dependency management. |
| PostgreSQL | 12+ (v18/19), 16+ (v20) | Odoo 20 requires PostgreSQL 16 or newer and the pgvector extension. Odoo 18/19 support 12-17; version 16 recommended. |
| Python | 3.10+ (v18/19), 3.12+ (v20) | Ubuntu 24.04 ships Python 3.12. On 22.04 add the deadsnakes PPA for 3.12 to run Odoo 20. |
| pgvector | Required for Odoo 20 | PostgreSQL extension used for embeddings and AI features. Install postgresql-16-pgvector, then CREATE EXTENSION vector in each database. |
Important: These minimums are for development and testing only. Running production Odoo on 2 GB RAM will result in out-of-memory kills during report generation, slow response times under any concurrent load, and PostgreSQL performance degradation as the database grows. Do not deploy production workloads on minimum specs.
Odoo 20 Baseline Changes
Odoo 20 shipped on 2026-09-24 as the current major release. CPU, RAM, and storage sizing is unchanged from v18 and v19 for a given user count. Three software baselines moved up:
| Component | Odoo 18 / 19 | Odoo 20 | Why it changed |
|---|---|---|---|
| Python | 3.10 / 3.11+ | 3.12+ | Dropped support for 3.10/3.11. Ubuntu 24.04 ships 3.12 by default; 22.04 needs the deadsnakes PPA. |
| PostgreSQL | 15+ supported (16 recommended) | 16+ required | Odoo 20 relies on features available in PostgreSQL 16 and the pgvector extension packaged for it. |
| pgvector | Not required | Required | New embedding and AI features store vector data in the database. Install postgresql-16-pgvector and enable per database. |
| wkhtmltopdf | 0.12.6 patched Qt | 0.12.6 patched Qt | Unchanged. Same binary works for v18, v19, and v20. |
| Node.js | Any current LTS | Any current LTS | Unchanged. Used only for SCSS/LESS asset compilation. |
If you are migrating a running v18 or v19 instance to v20 on the same server, the fastest path is: upgrade PostgreSQL to 16 if needed, install Python 3.12, install the postgresql-16-pgvector package, and enable the extension inside each Odoo database with CREATE EXTENSION IF NOT EXISTS vector;. For a step-by-step install, see our Odoo Ubuntu install guide.
Requirements by User Count
The most common way to size an Odoo server is by user count. “Users” here means concurrent active users - not total user accounts. If you have 100 user accounts but only 30 people are logged in and active at peak hours, size for 30. A good rule of thumb: concurrent users are typically 25-40% of total registered users.
Each Odoo worker process handles one request at a time and consumes 150-300 MB of RAM. The formula is simple: you need 1 worker per 4-6 concurrent users, plus 1-2 cron workers for background tasks. PostgreSQL needs its own share of RAM (at least 25% of total) and connections (at least 2x the number of workers).
| Users | CPU | RAM | Storage | Workers | Database |
|---|---|---|---|---|---|
| 1-5 | 2 vCPU | 4 GB | 40 GB NVMe | 2 | Same server |
| 5-25 | 4 vCPU | 8 GB | 80 GB NVMe | 4 | Same server |
| 25-100 | 8 vCPU | 16 GB | 160 GB NVMe | 8 | Same server or separate |
| 100-500 | 16 vCPU | 32 GB | 500 GB NVMe | 16 | Separate DB server required |
| 500+ | 32+ vCPU | 64+ GB | 1+ TB NVMe | 32+ | PostgreSQL cluster + load balancer |
All tiers assume Odoo Community or Enterprise with a typical mix of modules. If you run heavy modules like MRP or eCommerce, add 50-100% more RAM. See the module-specific section below.
The 100-user threshold is where single-server setups start struggling. At this point, PostgreSQL and Odoo compete for CPU and RAM on the same machine. Separating the database onto a dedicated server (or using a managed PostgreSQL service like AWS RDS or DigitalOcean Managed Databases) dramatically improves response times. The Odoo application server can then use all available RAM for workers, while PostgreSQL gets its own dedicated resources for query caching and connection handling.
Use our server calculator to get a personalized recommendation based on your exact user count and module selection, or check the server requirements tool for quick reference.
Requirements by Module
Not all Odoo modules hit the server the same way. A company using only CRM and Invoicing has very different server needs than one running Manufacturing, eCommerce, and Point of Sale at the same time. Here is how the major modules affect your resource budget:
Report generation (P&L, balance sheets, aged receivables) is CPU-intensive. A year-end close with 50,000+ journal entries can spike CPU to 100% for minutes. Plan for 2 extra vCPUs if accounting is a primary module.
BOM explosion and production scheduling load entire bill-of-materials trees into memory. A 5-level BOM with 500 components can use 2 GB of RAM during scheduling. Add 4-8 GB RAM for heavy MRP use.
Product catalog pages, image serving, and concurrent user sessions create heavy I/O and memory pressure. A catalog with 10,000+ products needs NVMe storage and 4+ GB extra RAM for caching. Plan for CDN offloading of static assets.
Each POS terminal maintains a persistent WebSocket connection to the server. CPU and RAM per terminal are low (about 50 MB RAM, minimal CPU), but you need stable sub-100ms latency and reliable WebSocket support. 20 terminals add roughly 1 GB RAM total.
Base inventory operations are lightweight. The load scales with the number of barcode scanners and warehouse workers making concurrent stock moves. 10 scanners operating simultaneously need about the same resources as 10 regular users.
If you are running multiple resource-heavy modules, add their extra requirements together. A company using Accounting + MRP + eCommerce should plan for 2 extra vCPUs (Accounting) + 4-8 GB extra RAM (MRP) + NVMe storage and CDN (eCommerce) on top of the base requirements for their user count.
PostgreSQL Sizing Guidelines
PostgreSQL does the heavy lifting for Odoo. Every page load, every search, every report hits the database. Get this wrong and your whole instance suffers no matter how much CPU and RAM you give the Odoo application server.
| Parameter | Small (1-25 users) | Medium (25-100) | Large (100-500) |
|---|---|---|---|
| shared_buffers | 1 GB | 4 GB | 8 GB |
| effective_cache_size | 3 GB | 12 GB | 24 GB |
| work_mem | 16 MB | 32 MB | 64 MB |
| max_connections | 100 | 200 | 500 |
| maintenance_work_mem | 256 MB | 1 GB | 2 GB |
| wal_buffers | 16 MB | 64 MB | 128 MB |
Connection pooling becomes critical beyond 50 users. Odoo opens one PostgreSQL connection per worker, and each connection uses 5-10 MB of RAM on the database server. Without a connection pooler, 16 workers with 2 connections each means 32 database connections at all times. Use PgBouncer in transaction pooling mode to multiplex connections - it can serve 100+ Odoo workers through 20-30 actual PostgreSQL connections, reducing database memory usage by 60-70%.
For a deeper dive into PostgreSQL configuration, see our PostgreSQL Tuning for Odoo guide, which covers indexing strategies, autovacuum tuning, and query optimization specific to Odoo workloads.
Storage Planning
Odoo storage has three components: the database, the filestore, and system overhead. Here is how each one grows over time:
| Company size | DB growth/year | Filestore growth/year | 3-year total |
|---|---|---|---|
| Small (1-10 users) | ~1 GB | 2-5 GB | 10-20 GB |
| Medium (10-100 users) | 5-10 GB | 10-30 GB | 50-120 GB |
| Large (100+ users) | 50-100 GB | 100-500 GB | 500 GB - 2 TB |
| eCommerce heavy | 10-20 GB | 50-200 GB (product images) | 200-700 GB |
The filestore is where Odoo stores file attachments, product images, report PDFs, and email attachments. By default, these are stored on the local filesystem in ~/.local/share/Odoo/filestore/. For larger deployments, moving the filestore to S3-compatible object storage (AWS S3, DigitalOcean Spaces, MinIO) saves disk space and makes backups simpler.
NVMe vs SATA SSD: Always choose NVMe when available. PostgreSQL is I/O-heavy, and NVMe drives provide 3-5x better random read performance than SATA SSDs. The performance difference is most noticeable on reports and searches that scan large tables. Every major VPS provider now offers NVMe as standard or as an affordable upgrade.
Always leave 20% free disk space. PostgreSQL needs free space for VACUUM operations (which reclaim dead tuples), WAL files, and temporary sort files. If your disk hits 95%+ utilization, PostgreSQL can refuse new writes and your Odoo instance will crash.
Network Requirements
Network bandwidth and latency tend to get ignored when sizing Odoo servers. Here is what you actually need:
Bandwidth per User
An active Odoo user generates approximately 50 Kbps of sustained traffic (averaged over a work session). Peak bandwidth during report downloads or large list views can spike to 500 Kbps - 2 Mbps per user. For 50 concurrent users, plan for at least 25 Mbps of available bandwidth with burst capacity to 100 Mbps. Most VPS providers include 1 Gbps ports, so bandwidth is rarely a bottleneck.
Latency
Odoo is a web application that makes many small requests. Each page load triggers 10-30 HTTP requests for data, assets, and RPC calls. Keep latency under 100ms between your users and the server. At 200ms+ latency, Odoo starts feeling sluggish - not because the server is slow, but because each of those 20+ requests adds a round trip. Choose a data center region close to your users.
CDN for Static Assets
Odoo serves JavaScript bundles, CSS, and images from the application server by default. For deployments with users spread across multiple regions, configure a CDN (Cloudflare, CloudFront, or Bunny.net) to cache and serve static assets from edge locations. This reduces server load by 30-50% and improves perceived page load speed for remote users. eCommerce deployments should treat CDN as mandatory, not optional.
Development vs Staging vs Production
Running three environments (development, staging, production) is standard practice. But you do not need to triple your server costs. Each environment has a different job and different resource needs:
| Environment | Size (vs Production) | Typical spec | Purpose |
|---|---|---|---|
| Development | 25% of production | 2 vCPU, 2-4 GB RAM | Code changes, module development, quick testing. Single developer use. |
| Staging | 50% of production | Half of production spec | Pre-deployment testing with production-like data. UAT with a few users. |
| Production | 100% | Full spec per user table | Live workload. All concurrent users, all modules, full dataset. |
Pro tip: Development environments can run on the cheapest VPS tier your provider offers. A Hetzner CX22 at ~4 EUR/month or a DigitalOcean $6/month droplet is more than enough for a single developer. Staging should mirror production in software configuration (same Odoo version, same modules, same PostgreSQL version) but can use a smaller instance size. For detailed staging setup, see our Odoo staging environment guide.
Cloud Provider Recommendations by Budget
Now that you know your server specs, here is where to run them. We tested seven providers head-to-head and wrote a detailed comparison. Here is the quick summary:
| Budget | Best pick | Spec you get | Good for |
|---|---|---|---|
| Under $10/mo | Hetzner | 2 vCPU, 4 GB RAM, 40 GB NVMe | 1-10 users, dev/staging |
| $10-30/mo | Hetzner or Vultr | 4 vCPU, 8 GB RAM, 80 GB NVMe | 10-30 users, small production |
| $30-100/mo | DigitalOcean or AWS | 4-8 vCPU, 16 GB RAM, 160 GB NVMe | 30-100 users, managed DB option |
| $100-500/mo | AWS or Hetzner dedicated | 16 vCPU, 32 GB RAM + separate DB | 100-500 users, enterprise |
| $500+/mo | AWS / GCP / bare metal | Multi-server, load balanced | 500+ users, HA required |
For region-specific recommendations, see our guides for Europe, India, and other regions. For VPS-specific sizing advice, check our best VPS for Odoo guide.
Not sure about your sizing? OEC.sh handles server provisioning automatically. Tell us your user count and modules, connect your cloud account (AWS, Hetzner, DigitalOcean, Vultr, GCP, Azure, or OVH), and we deploy an optimized Odoo instance with the right specs. PostgreSQL tuning, worker configuration, SSL, backups, and monitoring are all included. Start small and scale up when you need to. No migrations needed.
Frequently Asked Questions
What are the minimum server requirements for Odoo?
The absolute minimum to run Odoo 18, 19, or 20 is 2 vCPUs, 2 GB RAM, and 20 GB SSD storage. This is only suitable for development and testing with 1-2 users. For any production workload, you need at least 2 vCPUs, 4 GB RAM, and 40 GB NVMe. Odoo 20 adds a software baseline change: Python 3.12+, PostgreSQL 16+, and the pgvector extension. PostgreSQL and the Odoo application server share these resources on a single-server setup, so RAM is typically the first bottleneck.
What are the Odoo 20 server requirements?
Odoo 20 (September 2026) uses the same CPU and RAM sizing as v18 and v19 for a given user count. The software baseline moves up: Python 3.12 or later, PostgreSQL 16 or later, and the pgvector extension. wkhtmltopdf and Node.js are unchanged. If you are migrating from v18 or v19 on the same hardware, upgrade PostgreSQL to 16 if needed, install Python 3.12, add the postgresql-16-pgvector package, and run CREATE EXTENSION vector in each database.
How much RAM does Odoo need for 50 users?
For 50 concurrent users, plan for 16 GB RAM total. Each Odoo worker process consumes 150-300 MB depending on installed modules, and you need 6-8 workers for 50 users. PostgreSQL needs its own buffer cache (typically 25% of available RAM). If running both on the same server, 16 GB is the minimum for a responsive experience.
Does Odoo need a dedicated server?
Not necessarily. For up to 25 users, a single VPS with 4-8 GB RAM handles both Odoo and PostgreSQL comfortably. Beyond 100 users, separate the database onto its own server. Beyond 500 users, use a multi-server architecture with a load balancer, dedicated application servers, and a PostgreSQL cluster. Bare metal is only needed for very large deployments where virtualization overhead matters.
Can I run Odoo on a shared hosting plan?
No. Traditional shared hosting (cPanel, Plesk) does not support Odoo. You need a full Linux server with root access to install Python dependencies, configure PostgreSQL, and run long-lived application processes. The cheapest viable option is a 2 vCPU, 4 GB RAM VPS from providers like Hetzner (starting around €4/month) or DigitalOcean ($24/month).
What database does Odoo use?
Odoo exclusively uses PostgreSQL. It does not support MySQL, MariaDB, SQLite, or any other database engine. As of 2026, Odoo 18 and 19 support PostgreSQL 12 through 17, with PostgreSQL 16 recommended. Odoo 20 requires PostgreSQL 16 or newer and also needs the pgvector extension for embedding and AI features.
How much storage does Odoo need?
The Odoo application itself needs about 2 GB. The database grows at roughly 1 GB/year for small businesses, 5-10 GB/year for mid-size companies, and 50+ GB/year for large enterprises. The filestore (attachments, images, report PDFs) typically uses 2-5x more space than the database. Start with 40 GB NVMe for small deployments and 160 GB+ for mid-size. Always leave 20% free space for PostgreSQL VACUUM operations.
Deploy Odoo with the Right Server Size
Stop guessing. Connect your cloud account, pick your user count and modules, and OEC.sh provisions an optimized server automatically. Free plan available.