EXCOIN / SAAS PLATFORMS

Growing a SaaS platform without losing control

Growth reveals the boundaries between customers, data and operational responsibility. A sound platform can add tenants and change plans without turning every release into a full migration.

01 / ENGINEERINGCS · EN · ES
01 / 07

Define the tenant as a business and technical boundary

SaaS describes how a product is provided; multitenancy is one architectural way to share its components. Microsoft explicitly separates these terms in its architecture guidance. A tenant might be a company, team or another group whose users share data and settings. Before choosing database tables, decide who creates a tenant, who administers it, how a user joins and whether a user may work in several tenants. Without that definition, access rules become difficult to repair later.

Map the lifecycle: creation, invitation, plan change, suspension, export and closure. For every step, state who owns the data, when a change takes effect and what happens to access. Closing a tenant does not necessarily imply immediate deletion of every record; retention depends on the actual contract and legal context. The technical model should permit those decisions to be carried out and explained. A first version can be small, but the customer boundary must be explicit.

02 / 07

Test isolation on every path to data

A shared application and database may be a reasonable starting point if tenant context is enforced consistently. Separate databases or environments strengthen isolation boundaries but add deployment, migration and monitoring work. Microsoft describes the tradeoff between cost, performance and separation across several approaches. There is no single model for every customer. The choice follows data sensitivity, contractual needs, tenant size and the operations team's ability to maintain the resulting system.

Test more than an ordinary screen query. Tenant context can disappear inside an asynchronous job, export, cache, search index or administrative tool. Every path should carry identity, tenant and permissions through to the data. Try negative cases: a user changes an identifier in the URL, a queue worker reads the wrong batch, or a cache returns another company's answer. Logs should help explain an incident without unnecessarily copying sensitive data into a second place.

03 / 07

Product entitlements and billing are separate domains

The feature catalogue, product permissions and financial subscription can change at different moments. An external billing provider may handle invoices and payments; your application still decides what a tenant is entitled to use now. Model the internal entitlement, its source, effective time and a policy for late events. Do not grant permanent access merely because a success page opened in the customer's browser. The screen is an observation, not reliable evidence of the entire billing lifecycle.

Stripe documents separate events for subscription updates, invoices and payment failures. If such a provider is selected, the integration should verify events, handle repeated delivery safely and reconcile ambiguous outcomes. The application need not take on a payment processor's role without a clear reason. Business rules for trials, plan changes and ending access must be agreed with the product owner; they do not follow automatically from an API reference.

04 / 07

Measure data growth by tenant

A total user count hides important differences. One large tenant may generate most records, expensive reports or extreme peaks. Measure size, request volume, latency and cost by tenant where privacy rules permit. Set limits for expensive operations and explain the experience when a limit is reached. Scaling a database cannot replace fixing a query that loads every historical record for every customer. Observation should lead to a specific change rather than a generic promise of infinite scale.

Measure the actual bottleneck first. An index, batch processing or separate reporting flow may be more appropriate than splitting the entire product into services. When caching, identify which values are shared and which belong to one tenant. Track the creation and deletion of data too; without a lifecycle, volume grows indefinitely. Performance tests should include small and large tenants working at once, not only uniformly distributed synthetic requests.

05 / 07

Release without a shared outage

A single application version for all customers can simplify maintenance, but a change may affect everyone. The team needs gradual enablement, impact monitoring and a way back. Add a database field compatibly, migrate data and only then remove the old use. This allows deployment while an older job or client remains active. Use feature flags sparingly and give each one a removal date. A permanent collection of overlapping flags becomes another product that nobody can reason about.

Rolling back a container is insufficient when a release has changed data. Prepare for an incomplete migration, a failed export and clients on different versions. Before release, test cross-tenant access, role permissions, billing events and important integration contracts. The tooling matters less than knowing what version is running, who is affected and how to recognise a regression. Responsible releases also include customer communication when a workflow changes.

06 / 07

Observe the customer experience

A running process is not necessarily a working product. For each critical journey, measure errors, time to completion and operations waiting for human intervention. Separate one tenant's problem from a shared infrastructure fault. Support staff need a safe way to inspect a specific operation without broad access to every tenant's data. Access to a sensitive customer record should have a reason and a suitable permission boundary.

For incidents, assign who can turn off a new feature, who communicates and who checks data afterwards. A database backup alone is not a recovery plan. Verify that an application can be restored with a compatible schema, object storage and configuration, and consider the effect of restoring one tenant on everyone else. Set realistic limits for data loss and time to return according to business impact, not an infrastructure marketing claim.

07 / 07

Know when architecture needs to change

A larger redesign is justified by repeatable evidence: inability to isolate a sensitive customer, migrations that take too long, disproportionate cost in one workload or release risk that smaller changes cannot control. Record the measures and incidents behind the decision. Then identify the smallest useful boundary: perhaps a separate reporting process or storage for unusually large tenants. A complete rewrite without tested boundaries may simply move the problem.

A pilot should cover new-tenant setup, a plan change, a failed billing event, a large tenant's workload, export and data removal. This page does not claim that EXCOIN operates a particular number of SaaS tenants or holds a billing-provider partnership. Useful early outputs are a tenant and data map, an access model, a list of critical journeys and measurements that show where change is truly needed. Those observations can justify the next scaling step.

Sources

Discuss a project