Guides

Multi-tenant SaaS architecture: designing systems that survive growth

A guide to multi-tenant SaaS architecture: choosing silo, pool or bridge, tenant isolation, data partitioning, noisy neighbours, per-tenant metering, ADRs and migration paths.

What is multi-tenant SaaS architecture?

Multi-tenant SaaS architecture is the design of a software product that serves many customers (tenants) from one operating platform, with each tenant isolated in data and experience even when infrastructure is shared. The core question is not whether to share, but which components to share, which to isolate, and by what mechanism. That choice drives cost, security, performance and delivery speed as the customer base grows.

At small scale the question is whether the product works. With growth it becomes: can the system serve the thousandth customer without slowing the first, and can someone who did not write it change it safely? This guide walks through the most important architectural decisions, based on the AWS Well-Architected SaaS Lens and the Azure Architecture Center's multitenancy guidance.

The three multi-tenant models: silo, pool and bridge

The AWS SaaS Lens groups SaaS architecture patterns into three categories. Silo is where tenants get dedicated resources, for example a fully independent infrastructure stack or a separate database per tenant. Importantly, a silo still relies on shared identity, onboarding and operations, which distinguishes SaaS from a managed-service model where each customer runs a separate version. Pool is where tenants share resources, the classic notion of multi-tenancy aimed at economies of scale and agility. Bridge acknowledges that systems are usually mixed: some parts silo, some pool. A service's data regulation profile and noisy-neighbour sensitivity might push it to silo, while the agility, access patterns and cost profile of another push it to pool.

The Azure Architecture Center describes the same spectrum: from a single-tenant deployment per customer (strong isolation but low cost efficiency because nothing is shared) to fully multitenant deployments, with horizontal partitioning in between, such as a shared application tier with a database per tenant. Azure also recommends the Deployment Stamps pattern, where a stamp can serve a group of tenants or a single tenant.

Silo vs pool vs bridge (synthesised from the AWS SaaS Lens and Azure Architecture Center)
CriterionSiloPoolBridge
ResourcesDedicated per tenantSharedMixed per service / tier
IsolationStrong, simpler to enforceEnforced in software and policyStrong where it matters
Noisy neighbourLargely absentA risk to governReduced for separated parts
Cost efficiencyLow; grows with tenant countHighestIn between
Per-tenant cost trackingSimplerHard; needs meteringModerate
OperationsMany environments; needs strong automationOne environment, one updateMost complex to manage
Good fitRegulated or very large tenantsMany small tenants, mainstream productMost SaaS products as they mature

Tenant isolation and data partitioning

Tenant isolation means one tenant cannot reach another tenant's data or resources, even when code has bugs. Azure's multitenancy checklist recommends mapping every request correctly to a tenant, carrying tenant context in the identity system or application-level authorization, designing for isolation and continuously testing the isolation model.

In a pooled model with shared tables, the biggest risk is a query that forgets to filter by tenant. One defence is to push the boundary into the database: PostgreSQL Row-Level Security, once enabled on a table, requires every normal access to be allowed by a policy, and denies by default if no policy exists. The PostgreSQL documentation also notes that the table owner is typically not subject to these policies, so the application should not connect as the owner.

Common data partitioning approaches

Azure advises keeping the architecture as simple as possible while still meeting requirements, and avoiding an architecture that grows ever more complex as you scale or exceeds your team's capacity. Account for tenants' specific needs for backup, data location and security, and for deleting data when a tenant leaves (see data governance basics).

  • Shared tables with a tenant_id column: low cost, one migration, needs tight query-level isolation.
  • Schema per tenant in one database: cleaner separation, but object counts grow quickly with many tenants.
  • Database per tenant: strong isolation, easy per-tenant backup and deletion, but more to manage.
  • Sharding by tenant: group tenants into shards or stamps to scale horizontally.

Noisy neighbours: when one tenant slows everyone

According to the Azure Architecture Center, the noisy neighbour problem occurs when one tenant's performance is degraded by another tenant's activity. It can also happen when each tenant uses only a small share but the combined load of many tenants with similar patterns produces a peak beyond capacity. Sharing a resource inherently carries this risk; it cannot be eliminated, only reduced and controlled.

  • Monitor resource use per tenant, not just system-wide; include the tenant ID in telemetry.
  • Apply resource governance: quotas, API limits, and the Throttling or Rate Limiting patterns.
  • Alert on usage spikes and scale automatically where possible.
  • Move heavy or sensitive tenants to their own stamp (silo) in a bridge model.
  • Test to confirm that data does not leak between tenants and that noisy-neighbour effects are acceptable.

Scaling and observability

Azure recommends designing for the growth you expect without over-engineering for unrealistic growth, defining SLOs based on tenant requirements, and testing that the solution scales as tenant numbers rise. With shared compute, scaling benefits every tenant, but when capacity is insufficient all tenants suffer; dedicated resources scale independently but cost more.

For observability, monitor both overall health and each tenant, and configure and test alerts for when a tenant has problems or exceeds limits. Separate the control plane (onboarding, configuration, billing) from the data plane (serving requests), and automate the tenant life cycle rather than doing it by hand. Azure lists antipatterns to avoid: running separate versions per tenant, hard-coding tenant-specific configuration and relying on manual deployments. Infrastructure cost at scale also needs regular review (see cloud cost optimization).

Per-tenant metering and billing

Azure gives two reasons to measure each tenant's consumption: knowing the real cost to serve each tenant to track profitability, and determining what to charge under consumption-based pricing. The difficulty is that most shared services do not break usage down by tenant, for example one relational database holding every tenant's data.

Principles from Azure's guidance:

  • Decide the goal first: an approximate cost to serve (enough for flat pricing) or precise measurement (needed for usage-based pricing).
  • Do not use application monitoring tools as the billing data source, because they typically sample; build a dedicated, accurate logging pipeline.
  • Real-time measurement is rarely needed: log the data and aggregate asynchronously.
  • Avoid more precision than you need; it adds complexity and brittle processes.
  • Pricing models (per user, consumption, flat rate) feed back into architecture: flat rate is easy to sell but can become unprofitable with heavy tenants; consumption pricing needs accurate metering and auditable records.

Record architecture decisions with ADRs

Many SaaS systems struggle not because of traffic but because nobody remembers why they were built that way. An Architecture Decision Record (ADR) is a short document that captures one architecture decision. Michael Nygard proposed the format in 2011 with Title, Context, Decision, Status and Consequences; ADRs are numbered sequentially, numbers are never reused, and when a decision changes the old ADR is kept and marked superseded. Martin Fowler stresses keeping ADRs brief, typically about a page, and notes that writing them clarifies a group's thinking.

A suggested ADR template for a tenancy decision (kept in the repository, for example docs/adr/0007-tenancy-model.md):

  • Title: ADR 0007 – Pool model for the standard plan, silo for customers with specific requirements.
  • Status: Proposed / Accepted / Superseded by ADR-xxxx.
  • Context: current and expected tenant count, data regulation requirements, load patterns, team capability, budget constraints.
  • Decision: “We will…”, in active voice, naming the isolation mechanism (for example Row-Level Security) and the criteria for moving a tenant to silo.
  • Consequences: what becomes easier, what becomes harder, accepted risks and the follow-up decisions required.

Illustrative example: one definition per metric

Another ADR might settle that every core business metric (such as active tenants) is defined in exactly one place and referenced everywhere else, so three reports never show three different numbers. This is an illustrative example of the kind of decision worth recording.

Migration paths

Few teams pick the right model on day one, and changing the tenancy model is expensive because each tenant's data must move while they keep using the product. Azure notes that if you allow migration between deployments, you must plan how to move customers from a multitenant deployment to their own, and always know which tenants are where. Common paths:

  • Single-tenant installs to SaaS: unify identity, onboarding and operations first, then consolidate infrastructure.
  • Pool to bridge: move large or special-requirement tenants to their own stamp or database; requires per-tenant data migration tooling and a tenant-to-location catalogue.
  • Monolith to separate services: gradually extract parts with different isolation or scaling needs and choose silo or pool per service.
  • Give every migration step an ADR, an isolation test plan and a rollback plan.

Build or use existing platforms?

Before building an entire multi-tenant platform yourself, consider which parts to buy or consume as services (identity, billing, monitoring). See the build vs buy software decision framework. If your team works in .NET, see also building an AI backend with C# and .NET.

How EYC can help

EYC builds Early Years Circle, a connected platform for early childhood education, and applies the principles in this guide when designing software. EYC's Software and SaaS practice can work with you to review your architecture, choose a tenancy model, set up an ADR practice and plan migrations; scope and commitments are defined under contract. Contact EYC to discuss.

Frequently asked questions

What is multi-tenancy?

Multi-tenancy is a model in which one software system serves many customers (tenants) on the same platform. Each tenant's data and configuration are isolated, even when infrastructure is shared to lower cost.

Should a SaaS architecture use silo, pool or bridge?

Pool suits many small tenants and cost efficiency; silo suits customers with strict isolation needs or very large workloads; bridge combines both per service. Many mature SaaS systems use bridge.

How do I stop one tenant reading another tenant's data?

Carry tenant context in the identity system, enforce the boundary at the data layer (for example PostgreSQL Row-Level Security or a database per tenant) and test the isolation model continuously.

What is a noisy neighbour and how do I handle it?

It is when one tenant's activity degrades another tenant's performance on shared resources. Mitigate with per-tenant monitoring, quotas and rate limits, autoscaling, and moving heavy tenants to dedicated resources.

What is an ADR (Architecture Decision Record)?

An Architecture Decision Record is a short document capturing one architecture decision with its context, decision, status and consequences, popularised by Michael Nygard in 2011. It helps future team members understand why the system is built the way it is.

Can I move from pool to silo later?

Yes, but it is costly because each tenant's data must move while they stay active. Plan a tenant catalogue, per-tenant data migration tooling and record the decision in an ADR.

Share article:
Key point

SaaS systems survive growth not through one right technology choice but through deliberate decisions about sharing and isolation, measured per tenant and recorded so that newcomers understand them. Start simple, enforce isolation at the data layer, monitor per tenant and write an ADR for every decision that is hard to reverse.

Sources

  1. Silo, Pool, and Bridge Models – SaaS Lens — AWS Well-Architected
  2. Silo isolation – SaaS Lens — AWS Well-Architected
  3. The bridge model – SaaS Lens — AWS Well-Architected
  4. Tenancy models for a multitenant solution — Microsoft Learn – Azure Architecture Center
  5. Architectural approaches for storage and data in multitenant solutions — Microsoft Learn – Azure Architecture Center
  6. Architectural approaches for compute in multitenant solutions — Microsoft Learn – Azure Architecture Center
  7. Architectural approaches for a multitenant solution (Deployment Stamps) — Microsoft Learn – Azure Architecture Center
  8. Noisy Neighbor antipattern — Microsoft Learn – Azure Architecture Center
  9. Multitenancy checklist on Azure — Microsoft Learn – Azure Architecture Center
  10. Measure the consumption of each tenant — Microsoft Learn – Azure Architecture Center
  11. Architectural approaches for cost management and allocation in a multitenant solution — Microsoft Learn – Azure Architecture Center
  12. Pricing models for a multitenant solution — Microsoft Learn – Azure Architecture Center
  13. Row Security Policies — PostgreSQL documentation
  14. Documenting Architecture Decisions (Michael Nygard, 2011) — Cognitect
  15. Architecture Decision Record — martinfowler.com

Related solutions

Continue reading