Skip to main content

SaaS Business Management

The ECOSIRE SaaS Business Management module turns Odoo into a control plane for an Odoo hosting business. Provision and manage customer instances on your own servers, bill them on subscription plans, record usage metrics, and monitor instance health -- all from the Odoo backend. It covers provisioning over SSH and Docker (or Kubernetes), custom domains with SSL, backup and restore, migration between versions and servers, a customer self-service portal, and a REST API.

Compatibility: Odoo 17, 18 and 19 (Community or Enterprise) Price: $499 (one-time) Current shipped version: 17.0 → 17.0.0.0.10, 18.0 → 18.0.0.0.10, 19.0 → 19.0.0.0.10

After installation the app appears as SaaS Business Management in the main menu. Everything in this guide is reached from there:

MenuContains
DashboardKPI cards and charts for the whole platform
InstancesCreate Instance, All Instances, Templates/Images
ContractsSubscriptions, Billing
ReportingAnalytics, Reports
ConfigurationSettings, Plans, Servers

The record you provision for a customer is called an Instance. There is no menu called Tenants.

Key Features​

  • Multi-instance management with one isolated database per instance
  • Automated provisioning over SSH and Docker, with Kubernetes support
  • Subscription plans with monthly and yearly pricing
  • Usage records for CPU, memory, storage, bandwidth, API calls, active users, transactions and custom metrics
  • Instance lifecycle states: Draft, Deploying, Running, Suspended, Cancelled
  • Per-server capacity limits with available-slot tracking
  • Dashboard with 6 KPI cards and 4 Chart.js charts
  • Backup and restore, with configurable retention and scheduling
  • Custom domains with SSL certificate status tracking and auto-renewal
  • Migration wizard for version and server moves, with rollback on failure
  • Customer self-service portal under /my/saas
  • REST API under /saas/api/v1/
  • Stripe and PayPal payment integrations

Prerequisites​

  • Odoo 17, 18 or 19 (Community or Enterprise edition)
  • PostgreSQL with permission to create and manage additional databases
  • At least one host server you can reach over SSH, with Docker installed
  • Python packages on the Odoo host: paramiko, docker, requests, cryptography, psycopg2, redis, celery
  • Sufficient disk space for instance data and backups

Installation​

  1. Download the module ZIP from your ECOSIRE Dashboard
  2. Extract to your Odoo addons directory:
    unzip ecosire-saas-business-management-*.zip -d /opt/odoo/addons/
  3. Restart the Odoo service:
    sudo systemctl restart odoo
  4. Navigate to Apps, click Update Apps List
  5. Search for "SaaS Business Management" and click Install

Configuration​

Configure in this order. Provisioning will not offer you a server until at least one server record is active, connected and has a free slot.

Step 1: Add a Server​

  1. Navigate to SaaS Business Management then Configuration then Servers
  2. Click New and fill in:
    • Server Name
    • Server Type -- Docker, Kubernetes, Virtual Machine, Bare Metal, or Simulated (Demo/Sandbox)
    • Host Address and SSH Port (default 22)
    • SSH User, and either SSH Password or SSH Private Key Path
    • Max Instances -- the capacity cap for this server (default 10)
    • Region (optional)
  3. Click Test Connection. The Connection Status field moves to Connected or Connection Failed, and Last Connection Test is stamped.
  4. Confirm Available Slots is above zero.
note

Simulated (Demo/Sandbox) servers skip SSH and Docker entirely -- instances are created as records and marked running immediately. Use them for demos and sandboxes, never for real hosting.

warning

A server is only offered in the instance-creation wizard when it is active, connected and has available slots. A server whose connection test failed, or which is full, will not appear in the dropdown.

Step 2: Define Plans​

  1. Navigate to SaaS Business Management then Configuration then Plans
  2. Click New and configure:
    • Plan Name and Description
    • Monthly Price (required) and Yearly Price
    • Max Users and Max Instances
    • Included Modules -- the Odoo modules recorded against this plan
    • Sequence -- display order on the pricing page
    • Active -- clear this to retire a plan without deleting it
  3. Click Save

Step 3: Global Settings​

Navigate to SaaS Business Management then Configuration then Settings. The available settings are:

GroupSettings
DefaultsDefault Odoo Version, Default Server, Max Instances per Server (50), Trial Duration in days (14)
BackupsEnable Auto Backup, Backup Frequency (daily, weekly, monthly), Backup Retention in days (30)
MonitoringEnable Monitoring, Alert Email, CPU Threshold % (80), Memory Threshold % (85)
LifecycleAuto Suspend Inactive Instances, Inactive Threshold in days (30)
NotificationsNotification Email, Webhook URL, API Key
DockerDocker Registry URL, Docker Network Name (saas_network)
KubernetesEnable Kubernetes Support, Default Kubernetes Namespace (odoo-saas), Odoo Docker Image (odoo:19)
SSLEnable SSL by Default, SSL Certificate Path, SSL Key Path

Public endpoints this module exposes​

The module serves 5 externally reachable endpoints. Each path is relative to your Odoo base URL (web.base.url), so a full address looks like https://erp.example.com/saas/api/v1/analytics.

EndpointMethodAuthPurpose
/saas/api/v1/analyticsGETPublic (unauthenticated)Get analytics data via API
/saas/api/v1/instancesGETPublic (unauthenticated)Get SaaS instances via API
/saas/api/v1/instances/<int:instance_id>GETPublic (unauthenticated)Get specific SaaS instance via API
/saas/api/v1/webhooksPOSTPublic (unauthenticated)Handle incoming webhooks
/saas/pricingPOSTPublic (unauthenticated)Externally reachable endpoint exposed by the module.

These paths answer without an Odoo user session — that is what makes them reachable from outside your database. Register each one where the platform expects it (a webhook callback URL, an OAuth redirect URI, or an endpoint your integration calls) exactly as written above; a path the platform does not have on file is never delivered.

Provisioning a New Instance​

  1. Go to SaaS Business Management then Instances then Create Instance
  2. Fill in the wizard:
    • Customer (required) -- the contact the instance belongs to
    • Plan (required)
    • Subdomain (required) -- for example mycompany for mycompany.yourdomain.com
    • Server -- only provisionable servers are listed
    • Odoo Version -- 16, 17, 18 or 19
    • Custom Domain (optional)
    • Trial Instance -- tick to create the instance as a trial
    • Notes
  3. Click one of:
    • Create Instance -- creates the instance record in Draft
    • Create & Deploy -- creates it and starts deployment immediately
  4. Deployment creates the database, applies the configuration and moves the instance through Deploying to Running
  5. Follow progress on the instance record itself -- the Status field and the chatter carry each tracked change

The instance Name is assigned automatically by a sequence; you do not type it. Existing instances are listed under Instances then All Instances, which opens filtered to running instances by default.

Dashboard​

SaaS Business Management then Dashboard shows:

  • 6 KPI cards -- Total Instances, Monthly Revenue, Active Subscriptions, Server Utilization, New Today, Suspended
  • 4 Chart.js charts -- instance trend, revenue trend, server status and subscription status
  • A Quick Actions card and a Refresh button for on-demand reload

Instance Lifecycle​

An instance carries one of these states:

StateDescription
DraftCreated but not yet deployed
DeployingProvisioning in progress
RunningDeployed and operational
SuspendedTemporarily disabled (payment overdue or manual suspension)
CancelledTerminated

Trial status is a separate Trial flag on the instance rather than a state, so a trial instance is Running like any other. An Expiration Date governs when it lapses, and the default trial length comes from Trial Duration (Days) in Settings.

Subscriptions have their own states: Draft, Active, Suspended, Cancelled and Expired.

Customer Portal​

Customers sign in to your Odoo and manage their own instances under /my/saas:

PathPurpose
/my/saasPortal home
/my/saas/instancesTheir instances, and per-instance actions
/my/saas/subscriptionsSubscriptions
/my/saas/billingBilling records
/my/saas/usageUsage metrics
/my/saas/plansAvailable plans, and self-service subscribe
/my/saas/api-keysCreate and revoke API keys; the create form itself is posted to /my/saas/api-keys/create
/my/saas/supportSupport requests

REST API​

Instances can be managed programmatically under /saas/api/v1/instances, supporting GET, POST, PUT and DELETE. API keys are issued from the customer portal.

Backups and Migration​

  • Backup and restore run from the backup wizard on an instance: choose the operation and backup type, optionally include logs and compress the archive, and watch progress on the wizard.
  • Migration runs from the migration wizard: pick a migration type, source and target Odoo version, the instances or servers in scope, and a maintenance window. Backup before migration, validation, customer notification and rollback on failure are all switchable, with a maximum downtime setting.

Troubleshooting​

IssueSolution
No server appears in the creation wizardThe server must be Active, its Connection Status must be Connected, and Available Slots must be above zero. Open Configuration then Servers and run Test Connection.
"Selected server cannot host new instances"The server is inactive, unreachable or full. Choose another server or raise its Max Instances.
Provisioning failedCheck PostgreSQL permissions, disk space on the host, and that Docker is running and reachable over SSH.
Instance not accessibleVerify DNS for the subdomain or custom domain, and the Odoo proxy configuration.
Billing not processingConfirm the instance has a plan assigned and an active subscription.
Backup failuresCheck backup storage permissions and available disk space.
Migration stuckReview the migration wizard's status message and confirm the target version is valid for the instance.

Support​