If you're an Odoo Partner hosting clients on your own servers, you already know the drill. A new client signs the contract, and then your team spends the next 4–8 hours on setup: creating DNS records, generating SSL certificates, configuring Nginx, spinning up a Docker container, installing modules, and scheduling backups. Every time. For every client.
At 10 clients that's manageable. At 30 it becomes a bottleneck. At 50 it becomes the reason you can't grow.
This guide covers what Odoo client provisioning actually involves, where the manual work piles up, and how to automate the entire process.
What is Odoo client provisioning?
Odoo client provisioning is the process of creating a complete, ready-to-use Odoo environment for a new customer. A fully provisioned environment has six components:
- DNS record — Points the client's subdomain (e.g. client.yourdomain.com) to your server IP
- SSL certificate — Secures the connection via HTTPS (Let's Encrypt or Cloudflare)
- Reverse proxy — Routes traffic to the correct Odoo instance (typically Nginx Proxy Manager)
- Odoo instance — Either an isolated Docker container or a DBFilter database on a shared instance
- Module installation — Installs the apps included in the client's subscription plan
- Backup schedule — Configures automated database backups to S3 or compatible storage
Done manually, an experienced DevOps engineer takes 2–4 hours per client. Done by a non-technical team member following a checklist, it takes 6–8 hours — and mistakes happen.
Where manual provisioning breaks down
Most Odoo Partners start with manual provisioning. It works fine at low volume. The problems appear as you scale:
DNS propagation delays
Creating a DNS record manually and waiting for propagation adds unpredictable delays — anywhere from a few minutes to 48 hours, depending on your provider and TTL settings.
SSL certificate errors
Generating Let's Encrypt certificates manually, especially with wildcard domains, requires CLI access and fails silently if misconfigured. A missed renewal brings down a client's instance.
Docker configuration drift
As you add clients, container configurations diverge. One client has a custom Nginx config, another has different resource limits, a third uses a different Odoo version. Debugging becomes harder over time.
No audit trail
Manual provisioning leaves no record of who configured what and when. When something breaks, tracing the issue is time-consuming.
Can't delegate
Manual provisioning requires someone with DevOps knowledge. It can't be handed to an account manager or automated from a sales workflow.
The 6 components — automated
1. DNS record creation (Cloudflare API)
Instead of logging into Cloudflare manually, an automated system calls the Cloudflare API to create an A record pointing to your server — in seconds:
POST https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records { "type": "A", "name": "clientname.yourdomain.com", "content": "YOUR_SERVER_IP", "proxied": true } |
With Cloudflare's proxy enabled, SSL is handled automatically at the edge — no Let's Encrypt required for the base domain.
2. SSL certificate
When Cloudflare proxying is enabled, SSL terminates at Cloudflare automatically. For custom client domains, the SSL certificate is generated via Let's Encrypt through Nginx Proxy Manager's built-in ACME client — triggered automatically when the proxy host is created.
3. Nginx Proxy Manager configuration
Nginx Proxy Manager has an API that allows programmatic creation of proxy hosts. An automated system creates the proxy host entry — mapping the client's domain to the correct internal port or container — without anyone touching the server.
4. Odoo instance deployment (Docker / Portainer)
For Docker-based deployments, Portainer's API allows you to deploy a new container from a template. The container gets its own dedicated resources, its own volume for filestore, its own database, and the correct Odoo version for that client.
For DBFilter deployments, a new database is created on the shared Odoo instance and the db_filter configuration routes traffic to the correct database based on the subdomain.
5. Module installation
Once the instance is running, the required modules are installed based on the client's subscription plan. The plan defines which Odoo apps are included — and the system installs them automatically via Odoo's JSON-RPC API.
6. Backup scheduling
An S3-compatible backup is configured automatically — daily full backups with a configurable retention policy. The client can also trigger on-demand backups from their self-service portal.
Trigger: invoice confirmation
The cleanest way to trigger provisioning is from Odoo's own sales workflow. When a subscription invoice is confirmed, an automation rule fires the provisioning sequence in the correct order.
This means:
- No manual handoff between sales and DevOps
- No delay between payment and client access
- Full audit trail inside Odoo (chatter, logs)
- Failures trigger alerts, not silent breakdowns
- Client receives login credentials automatically by email
Docker vs DBFilter: which should you automate?
Both modes are automatable. The choice depends on your clients:
| | Docker mode | DBFilter mode |
Isolation | Full container isolation | Shared Odoo instance |
Custom modules | ✅ Per-client | ⚠️ Shared codebase |
Resource control | ✅ Per-container limits | ❌ Shared resources |
Setup complexity | Higher | Lower |
Server load | Higher (one process/client) | Lower (one Odoo instance) |
Best for | Clients needing customization | Standard Odoo deployments |
Most Partners start with DBFilter for simplicity and move high-value clients to Docker when they need custom modules or dedicated resources.
Provisioning time: manual vs automated
Task | Manual | Automated |
Create DNS record | 5–10 min | < 5 seconds |
Generate SSL certificate | 10–20 min | Automatic |
Configure Nginx proxy | 15–30 min | < 10 seconds |
Deploy Docker container | 30–60 min | 1–2 minutes |
Install modules | 15–30 min | 3–5 minutes |
Configure backups | 20–40 min | < 10 seconds |
Send client credentials | 5–10 min | Automatic |
Total | 100–200 minutes | < 10 minutes |
At 20 new clients per year, manual provisioning costs 40–60 engineer-hours. Automated provisioning costs less than 4 hours total — a 15x reduction in DevOps time. |
What about errors and failures?
Manual provisioning fails silently. A typo in an Nginx config, a missed DNS record, a failed SSL renewal — these surface as client complaints, not system alerts.
Automated provisioning fails loudly. Each step is verified before the next begins. If DNS creation fails, provisioning stops and an alert fires. Nothing reaches the client until everything is confirmed working.
How Sadeem implements this
Sadeem SaaS Management is an Odoo module that implements the full provisioning workflow described above — built natively inside Odoo so it fits your existing sales and billing process.
When a subscription invoice is confirmed in Odoo:
- Cloudflare DNS record is created automatically
- Nginx Proxy Manager proxy host is configured
- Docker container is deployed via Portainer (or DBFilter database is created)
- Subscription module package is installed
- S3 backup schedule is configured
- Client receives login credentials by email
Era Group, an Odoo Gold Partner in Saudi Arabia, reduced their client onboarding time from a full business day to under 10 minutes after switching to Sadeem. Raqmia Technologies in Qatar manages 80+ active client subscriptions from a single Odoo dashboard. |
One license. Unlimited clients. No monthly fees. |
Summary
Odoo client provisioning involves six steps: DNS, SSL, reverse proxy, Odoo instance, module installation, and backup configuration. Done manually, each step takes 15–60 minutes and requires DevOps expertise.
Done automatically — triggered by invoice confirmation — the entire sequence completes in under 10 minutes without manual intervention. The technical components are Cloudflare API for DNS, Nginx Proxy Manager for proxy configuration, Portainer for Docker orchestration, and Odoo's JSON-RPC API for module installation.
At low client volume, manual provisioning is manageable. At scale, it becomes the ceiling on your growth.