ERPNext multi-site bench vs single site

A shared multi-site bench lowers hosting overhead but ties every site to the same upgrade and failure domain. A single site per bench costs more to run but isolates customers, data and change windows.

On this page

Which ERPNext layout fits your organization

The core trade-off is shared operations against isolation. One bench means one codebase, one Frappe and ERPNext version, and one backup and upgrade routine, while separate benches give each entity its own change calendar and failure boundary. For related companies, subsidiaries or divisions run by one finance and operations team, with similar tolerance for upgrade timing, multi-site is the sensible default. A single bench can host several sites, the first site becomes the default, and DNS-based multitenancy (enabled with bench config dns_multitenant on) or port-based multitenancy lets you add sites without adding servers. Before you commit, confirm in the Frappe multitenancy guide how your chosen mode routes hostnames and how each site's backups are taken and restored.

Separate benches are justified when the boundary is set outside your team: regulatory separation, contractual data boundaries for client tenants, or entities that must upgrade on different calendars. The reason matters because every site on a bench moves with that bench's Frappe and ERPNext version, so an upgrade one client has not approved becomes a change for all of them. Frappe's supported versions page lists version 15 as supported until the end of 2027 and version 16 until the end of 2029, so a tenant that cannot accept version 16 timing needs its own bench or a deliberately slower schedule. Ask your legal and compliance leads which data boundaries are written into contracts before you draw the line between sites and benches.

Cost is the part most often misjudged. Self-hosting ERPNext is free software, so the expense sits in people and infrastructure: each separate bench needs its own server or container set, backups, monitoring, staging and upgrade testing, plus the staff time to run them. The ERPNext pricing page lists Frappe Cloud shared site hosting from 5 US dollars per month, shared servers from 20 US dollars per month and dedicated servers from 125 US dollars per month. Those are list prices for managed hosting and say nothing about your own run cost. When you request quotes from an implementation partner or price your own team's time, ask for the cost of one bench per entity, the effort of a shared-bench upgrade across all sites, and who owns restore testing for each site.

Multi-site bench and single site compared

This table compares hosting several ERPNext sites on one Frappe bench against giving each site its own bench or server, across isolation, upgrades, backups, custom apps and operating effort. Read each row as a question to answer for your own tenants, since the right layout depends on how much you need to separate them. The main takeaway is that shared benches cut server count and admin work, while separate benches cost more to run but limit how far a failure, upgrade or restore reaches.

FactorSeveral sites on one benchOne site per bench or server
Routing modelDNS-based multitenancy names each site after the hostname that resolves to it and shares one port, enabled with bench config dns_multitenant on. Port-based multitenancy gives each extra site its own port.Each site gets its own bench directory and its own web and worker processes, so routing is handled per server or per port without a shared site list.
Upgrade scopeA bench-wide upgrade moves every site on that bench together, so all tenants wait for the same code change and any blocking issue affects all of them.Each bench can be upgraded on its own schedule, so one tenant can stay on a tested version while another moves forward.
Backup and restore granularitySites are backed up and restored individually, but a restore or migration planning exercise must still account for the shared bench configuration and apps.Backup scope matches the bench or server, which makes restore simpler to explain to an auditor and to a single business owner.
Custom app sharingCustom apps installed on the bench are available to every site, which reduces duplication but means one site's app change can affect the others.Each site can carry its own set of custom apps, so a tenant-specific customization stays out of other sites. Duplicated apps must be maintained in each bench.
Failure domainA bench-level fault in shared services or code can affect every site hosted on it.A fault is generally confined to one bench or server, though shared infrastructure such as the database host still needs to be checked.
Server count and hardwareFewer servers, with capacity shared among sites. Load from one busy site can affect response times for the others.More servers or benches to provision, patch and monitor, with capacity sized per tenant.
Operator skillsTeam needs Frappe bench administration, multitenancy configuration and a disciplined upgrade calendar for all sites at once.Team still needs bench skills, and must repeat patching, backup checks and upgrades for each bench.
Server Scripts (version 15 and later)Server Scripts are disabled by default from version 15 and must be enabled with server_script_enabled. Confirm the setting and who may approve scripts before sharing a bench across tenants.The same default applies, but scripts stay within one tenant's bench, which simplifies review of who can run Python on the server.
Cost driversLower hosting and administration cost per site. Costs rise if shared capacity must be expanded or if upgrade testing covers many tenants at once. Ask any implementer to quote the testing and coordination effort separately.Higher server, monitoring and patching cost, recurring for each bench. Costs fall when tenants share a risk profile and can share one upgrade schedule.

How DNS and port-based multitenancy share one bench

A single Frappe bench can host more than one ERPNext site, and the first site you create becomes the default. The real decision is how requests reach each site. DNS-based multitenancy names each site after the hostname that resolves to it, so all sites share one port and the bench routes by the incoming host name. You enable it with the dns_multitenant setting in the bench configuration. Port-based multitenancy runs each additional site on its own port, so the sites are separated by port number rather than by hostname. Both modes keep the sites on the same bench, which means they share one codebase, one set of installed apps and one upgrade path.

The choice shifts work onto your DNS, reverse proxy and certificate management. With DNS-based routing, every tenant needs a DNS record that resolves to the server, and your proxy must pass the original host header through to the bench. Each hostname also needs a certificate, so you should confirm whether you will issue one per name or use a wildcard, and who renews it. With port-based routing, the proxy and firewall must expose and map each port, and users must type a port into their browser, which many business users find awkward and some corporate networks block. Ask your team which of these operating burdens it is better placed to carry.

Before you go live, confirm the exact production setup against the Frappe multitenancy guide, including the bench configuration, the site creation commands and how the proxy should be configured. Test a site restore on a non-production copy, because backups are taken per site and you need to know that each tenant's data can be recovered independently of its neighbors.

What each layout puts in one failure domain

A multi-site bench shares most of its runtime, so a bad bench change or a broken shared service reaches every site at once. A single-site layout limits that blast radius but multiplies the number of benches, workers and upgrades you must run. Check each component below against your own tolerance for shared failure.

Bench code and Python environment

On a multi-site bench, the Frappe and ERPNext code, the apps directory and the Python virtual environment are shared by every site. One bench update or app version change moves all sites together, so a regression in one app version lands on every tenant at once. In a single-site layout each bench carries its own code and environment, so you can hold one customer on an older release while another moves forward. Ask which apps and versions each customer needs before you pick one shared bench.

MariaDB and Redis services

Both layouts can point at one MariaDB server and one Redis instance, but on a multi-site bench every site's data sits behind the same database process and the same cache. A server-level outage, a runaway query or a memory limit hit affects all sites in the same window. Separate benches let you split database and cache capacity by customer, at the cost of more processes to monitor and tune. Confirm the database version and Redis or Valkey version required for your Frappe release before you size either service.

Background workers and scheduler

Background jobs such as scheduled reports, email queues and document automation run from the bench's worker and scheduler processes. On a shared bench, one site with a long-running import or a heavy scheduled job can delay jobs for every other site in the queue. Separate benches give each customer its own queue and scheduler, which makes performance problems easier to isolate. Check how your deployment runs workers in Docker Compose or under bench production setup before you decide how many queues you need.

Per-site database and file storage

Each ERPNext site has its own database and its own sites/<site-name> folder for private and public files, backups and site configuration, even when several sites share one bench. This is the one layer that is per site in both layouts, so restoring a single site from backup is usually possible without touching the others. Plan restore tests for each site separately, and confirm that your backup tooling captures every site folder rather than only the bench directory.

Custom apps installed per bench

Custom apps are installed into the bench, so on a multi-site bench every site loads the same app versions, and an app installed for one customer is visible to the bench as a whole even if only one site enables it. Separate benches let each client run a different custom app set and a different app version, which matters when a customization is tied to one client's workflow. Review the app's compatibility with each Frappe major version before upgrading any shared bench that hosts it.

Reverse proxy and site routing

On a multi-site bench, DNS-based multitenancy lets one port serve several hostnames, with sites named after the hostnames that resolve to them and enabled through the dns_multitenant bench configuration. Port-based multitenancy gives each extra site its own port instead. In a single-site layout, each bench typically has its own proxy routing and certificates. Confirm how your reverse proxy, TLS certificates and DNS records map to each site before you commit to one routing model, because changing it later touches every customer's access path.

When multi-site or separate benches make sense

When several legal entities share a chart of accounts policy, a close calendar and a finance team, one bench hosting several sites usually keeps administration simple. Each company gets its own site and database, while one codebase, one set of installed apps and one upgrade window cover all of them. The trade-off is that every site moves to the same ERPNext and Frappe version at the same time, so one entity's testing delays everyone else.

  • Shared upgrades: Every site on the bench is migrated together, so a blocking issue in one company holds back the rest.
  • Shared maintenance window: Backups, restarts and bench updates affect all sites at once, which suits teams that already close books together.
  • Shared custom apps: Any custom app installed on the bench is available to every site, so you must confirm that each entity can accept the same customization.
  • Lower operating overhead: One server, one Redis and one set of workers serve all entities, which reduces the number of components your team patches.
  • Per-site data separation: Each company keeps its own database, which helps with access boundaries but does not replace a separate environment for audit scope.

Before committing, confirm that all entities can accept the same release cadence and that your finance team can test every site in one cycle. Ask for the upgrade and rollback steps in writing before the first production migration.

How a shared upgrade moves every site together

This sequence shows how one bench upgrade changes the code and database of every site it hosts, and where to stop before a failure reaches all tenants. Each step ends with a record that the next step depends on.

  1. Confirm the target version is supported

    Before any change, the platform owner checks Frappe's supported versions page to confirm the target release line is listed and still receives support. Frappe's policy states that customers must be on a listed version, and that warranty coverage from Frappe depends on a matching Frappe Cloud support plan. Record the target version, the support end date from that page, and whether your organization holds a plan that matches it. The output is a short written decision that names the target version and the reason for it.

  2. Inventory every site, app and custom app

    The platform owner lists each site on the bench, the apps installed on it, and the version of every custom app. Custom apps are the most common cause of upgrade failure, so note which ones depend on DocTypes, server scripts, or integrations that changed between versions. Confirm which sites rely on Server Scripts, which are disabled by default from version 15 and must be enabled with the server_script_enabled setting. The output is an inventory that maps each site to its apps and its owner.

  3. Test custom apps on a staging copy

    The developer restores a recent backup of each site onto a staging bench running the target version and runs the migration there. The team then checks custom DocTypes, print formats, scheduled jobs, and any authentication integrations such as LDAP or social login. Any failure is fixed in the custom app code and retested on a fresh copy. The output is a test log per site that records the migration result and each workflow that was checked. Do not move to production until every site on the inventory has a clean log.

  4. Back up every site before changing the bench

    The platform owner takes a full backup of every site on the bench, including the database and the uploaded files, and copies those backups to storage outside the bench server. A restore from each backup is tested on a separate machine, because an untested backup does not count as a recovery point. Keep the backup set for the whole upgrade window. The output is a list of backup files, their checksums or sizes, and a note confirming that a restore test succeeded for each site.

  5. Update the bench to the target version

    The platform owner moves the bench and its apps to the tested target version using the tested commands and the same version of every custom app. Once the code changes, every site on the bench runs the new code, even before any site has finished its migration. Depending on the commands used, migrations may also run across all sites automatically, so confirm that behavior in the staging log before production. The output is a bench reporting the target version, with the change recorded in version control.

  6. Migrate and check each site in turn

    The platform owner migrates sites one at a time, using the site name in each command, and reads the output after each migration. If a migration fails, the owner stops the sequence before the next site is touched, because the shared code is already new for all of them. Each migrated site is then checked for login, its key documents, background jobs, and error logs. The output is a sign-off for each site, with the migration log attached to the change record.

  7. Decide how failure is handled before starting

    Before the upgrade starts, the owner writes the rollback path: restore the previous bench code and each site's database from the verified backups. This path matters because one failed migration can hold up every tenant on the bench at the same time. A staged alternative puts each version group on its own bench, so a failed upgrade affects only the sites in that group. The trade-off is more servers and processes to patch and monitor. Ask your implementation partner to quote both options in writing. The output is an agreed rollback runbook and a recorded choice between a shared bench and separate benches.

Backups, restores and custom apps across sites

On a shared bench, backups and restores are handled per site, so restoring one tenant does not roll back the others, but you should confirm the exact backup and restore commands, and the flags that scope them to a single site, in the Frappe multitenancy guide and the current Frappe documentation before you write a runbook. Test the restore path on a copy of a real tenant, not only the backup job. Ask your team to record which sites share a database host, since a host-level failure affects every site on it, and to confirm how off-server copies are retained for each site. Single-site benches make this simpler because one restore touches one database and one file set, but they multiply the number of backup jobs, retention rules and restore drills you must run.

Custom apps are installed at the bench level and every site on that bench loads the same app code. A change to a custom app, a dependency upgrade or a failed bench migrate therefore affects every tenant at once, not only the one you were working on. Before you add a custom app to a shared bench, decide whether all tenants must accept its release cadence, and stage every change on a staging bench that mirrors the production apps list. Keep custom apps in version control so a rollback is a checkout, not a rebuild.

Server Scripts run Python on document events or as API endpoints. From version 15 they are disabled by default and must be enabled with the server_script_enabled setting, and Frappe Cloud public shared benches do not allow them. If your business logic depends on Server Scripts, confirm with Frappe whether the hosting tier you need permits them before you choose a shared or dedicated setup. Logic moved into a custom app is reviewed and deployed like code, which is usually easier to govern than scripts edited in the desk, but it also means a tenant-specific change needs its own app or a configuration option that all sites can accept.

Questions operators ask before choosing a layout

Does hosting several ERPNext sites on one bench save money?

It can reduce the number of servers you pay for, because several sites share one bench, one host and one maintenance routine. Self-hosting ERPNext is free according to the ERPNext pricing page, so your real costs are servers, storage, backups, monitoring and the staff who run them. The same page lists Frappe Cloud shared site hosting from 5 US dollars per month, and Frappe Cloud servers from 20 US dollars per month for shared instances and 125 US dollars per month for dedicated servers. Those are starting list prices, and they do not cover your upgrade testing, backup retention or support. Ask any implementation partner to quote hosting, upgrades, backups and support as separate lines, and confirm how heavy use by one tenant affects the others on the same host.

How much effort does one upgrade across shared sites take?

Every site on a bench runs the same Frappe and ERPNext code, so an upgrade moves all of them together. That keeps the codebase in one version, but it also means one change window, one test cycle and one rollback plan for every tenant. Frappe's supported versions page says version 15 is planned to be supported until the end of 2027 and version 16 until the end of 2029, so align your upgrade calendar with those dates. Before the window opens, check that each tenant's custom apps and customizations work on the target version, because one incompatible app can hold back every site on the bench. Measure the effort on a staging copy of every site rather than relying on a generic estimate.

Can we restore one tenant without affecting the others?

Usually yes, because each site normally keeps its own database and file storage, so a restore can target one site. The risk sits in the shared parts: the codebase, bench-level configuration, background workers and any app installed on the bench. A restore that brings back an older app version can break a site that has already moved on, so the restore procedure must match the versions in use. Test a single-tenant restore on staging before you need it, time it, and agree in advance who approves it while other tenants are live on the same server. Ask your partner to show the exact commands and backup scope for the Frappe version you run, and confirm that point-in-time recovery meets your data loss tolerance.

Do separate benches need separate physical servers?

No, but a shared host means shared capacity. Several benches can run on one server, and they then compete for CPU, memory, disk and database capacity unless you size and separate those resources deliberately. Separate servers give the strongest separation for resources, access control and maintenance windows. Containerized deployments with the official frappe_docker images separate services more clearly, but they do not remove the need to size the host. Consider separate servers when a tenant has a regulatory data boundary, runs heavy batch jobs, follows a different release cadence, or has a contract that requires dedicated infrastructure. Confirm with your infrastructure team how databases, Redis and backups will be split before you decide.

What skills does a team need to run multi-site ERPNext?

The team needs Linux administration, Python for bench and app work, and working knowledge of MariaDB, Redis, Nginx and Node.js. Frappe Framework v16 requires MariaDB 11.8, Redis or Valkey 6 or later, Python 3.14 and Node.js 24, according to the Frappe installation documentation, so someone must maintain those runtimes as they change. Server Scripts are disabled by default from version 15 and must be enabled with the server_script_enabled setting, so whoever writes custom logic needs to understand that setting and the review it requires. Multi-site adds tenant administration, DNS or port routing and disciplined backup checks. If those skills are not in-house, a fixed-scope implementation or a retainer can cover them, with the responsibilities written down before work starts.

Can we move a site to another bench later?

Often yes, but treat it as a migration project rather than a configuration change. Moving a site generally means restoring its database and files on the target bench, installing the same apps at compatible versions, and pointing the hostname or port at the new location. The hard parts are version drift between benches, custom apps that exist on only one bench, and data entered during the move. Plan a freeze window, a verified backup, a test restore on the target and a rollback path. Confirm the exact procedure for your Frappe and ERPNext versions in the official documentation and in a staging rehearsal, and ask any partner to put the steps and acceptance checks into the written scope.

How DeployOpen scopes and runs ERPNext layouts

DeployOpen plans, implements, hardens, backs up, upgrades and documents self-hosted open-source platforms inside your own infrastructure, so the site layout is chosen against your isolation, upgrade and recovery requirements before any build starts. We run the same written process whether the answer is one bench with several sites or separate benches per business unit.

How we scope

  • Written scope lists which companies, sites and custom apps must share or separate a bench.
  • We record the hostname or port plan, DNS responsibilities and who owns each site's data.
  • Engagements are fixed-scope, so deliverables and timelines are agreed in writing before work starts.
  • Quotes follow from that written scope, so ask for each site and bench named as a line item.

How we build

  • We install the bench in your cloud account, data center or air-gapped network, not a vendor-hosted environment.
  • We configure DNS-based or port-based multitenancy only where the written scope calls for it.
  • Custom apps are built, version-pinned and tested against the ERPNext and Frappe versions in scope.
  • Backup and restore are tested per site, so a single-site recovery is proven before go-live.

How we hand over

  • Documentation covers the bench layout, site list, update sequence and rollback steps for your team.
  • Runbooks state which upgrades move every site together and which need a separate change window.
  • Access, secrets and backup schedules are transferred to your named owners at handover.
  • Your team walks through a restore and a version update on a non-production copy before sign-off.

How we support

  • Ongoing support, upgrades and continuous testing are available as retainers after handover.
  • Retainers can cover version upgrades on the Frappe and ERPNext lines you have approved.
  • Ask us to confirm which support windows apply to your chosen versions before each upgrade plan.
  • Support scope is written, so you know who patches, who tests and who approves each change.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.