Choose SaaS architecture patterns by turning product requirements into explicit decisions: how tenants are separated, where business capabilities begin and end, how data is owned, how workflows integrate, and when independent deployment is justified. This guide is for founders, CTOs, and product teams planning a B2B SaaS product or restructuring one that has become difficult to change.
The outcome is an architecture decision record that a delivery team can use to implement, test, operate, and revisit the product structure. This guide addresses product boundaries and multi-tenancy. For the separate hosting and execution choice, see our guide to monolith versus serverless for SaaS.
Before You Start
Bring the decisions that shape the product, not simply a preferred technology stack. A useful architecture review starts with:
- named user roles, including tenant administrators and platform administrators;
- the tenant model: who buys, who uses, and whether one customer organization contains teams, locations, or legal entities;
- the workflows that create business value and the data each workflow creates or changes;
- contractual or customer requirements affecting access, retention, auditability, or hosting;
- external systems that must exchange data with the product;
- data sensitivity and the consequence of an incorrect cross-tenant result;
- the people responsible for releases, monitoring, support, and future changes; and
- roadmap assumptions that could change the product boundary, such as enterprise integrations, AI features, or regional deployment needs.
Do not wait for perfect forecasts. Separate known constraints from assumptions, identify choices that will be costly to reverse, and make the trade-offs visible before implementation begins.
Step 1: Map SaaS Architecture Patterns Around Domains
Start by mapping a tenant journey from account creation through regular use, administration, and offboarding. Group actions and data into domains: coherent business areas with their own language and rules. A product may use domains for identity, account administration, billing, workflow execution, reporting, and notifications.
For example, a procurement product might define an organization domain for tenant membership and roles; a sourcing domain for requests and approvals; a supplier domain for supplier records; and a reporting domain for read-oriented summaries. This map does not choose deployment units. It gives the team a shared vocabulary for deciding what should change together and what access each area should allow.
Separate shared capabilities from tenant configuration
Identify what is platform-wide and what each tenant configures. Authentication, file processing, and notification delivery may be shared capabilities. Approval thresholds, enabled modules, branding, retention choices, and custom fields may be tenant configuration. Model configuration as validated, versioned data rather than scattering tenant-specific conditions through business logic.
Document each domain with its purpose, owned data, exposed operations, and emitted events. If a domain cannot be described without depending directly on another domain’s tables, clarify the boundary before implementation. Teams building operational software can use the same mapping discipline described in our custom internal tools development guide; SaaS teams should add tenant context to every workflow they map.
Step 2: Choose Tenant Isolation and Data Access Rules
Choose a tenant isolation model before designing tables, APIs, or background jobs. Tenant isolation is the set of controls intended to prevent one tenant’s users and processes from viewing, changing, or receiving another tenant’s data. Review the boundary across identity, authorization, queries, caches, search indexes, exports, logs, queues, and support tooling rather than treating it as only a database decision.
Use three labels when comparing options:
- Pooled tenancy: tenants use shared application and data infrastructure, with tenant identity and access controls applied throughout the product.
- Siloed tenancy: a tenant receives dedicated application resources, data resources, or both.
- Hybrid tenancy: shared capabilities remain common while selected data stores, integrations, or workloads are separated.
Compare these options against contractual commitments, operational capacity, customization needs, and recovery requirements. Record the rationale, scope, and operational owner for every dedicated-resource exception.
Require tenant context at every entry point
Pass verified tenant context through signed-in requests, API tokens, queue messages, scheduled jobs, imports, and administrator actions. Derive permissions from verified identity and membership rather than from a tenant identifier supplied by a browser or integration. Require tenant scope in interfaces that handle tenant-owned records.
Test negative cases deliberately: a tenant A user requests a known tenant B identifier; a worker receives an event without tenant context; or a support action attempts an export without recorded authorization. Define roles separately for tenant users, tenant administrators, platform administrators, and support personnel. Treat administrative interfaces as part of the architecture, not as an exception to it.
Step 3: Build a Modular Application Boundary First
Use a modular monolith as a deliberate starting point when independent deployment does not yet solve a specific problem. In this guide, a modular monolith means one deployable application with explicit internal modules, interfaces, and ownership rules. It should not mean an unstructured codebase in one repository.
Give each module ownership of its domain rules and write model. Other modules should request work through an agreed interface rather than writing directly to its tables. For example, a reporting module can consume an approved representation of workflow data instead of embedding workflow rules in dashboard queries.
Apply controls that fit the codebase: module-level packages, restricted imports, interface contracts, dependency tests, and a documented rule against cross-module writes. The implementation mechanism can vary; the essential decision is that internal data is not automatically a public integration surface.
- Commands request a state change.
- Queries return an approved view of information.
- Events state that a meaningful action has already occurred.
- Authorization checks remain with the domain that owns the decision.
- Failure behavior is documented so callers do not need to inspect module internals.
Place boundaries around business behavior and likely change patterns, not around database-table names. This also helps teams sequence valuable product slices without building unrelated platform components first.
Step 4: Extract Services Only When Independence Is Justified
Extract a separately deployed service only when that independence addresses a defined need. Possible triggers include a distinct security boundary, a workload requiring different operational treatment, an independently released capability, a failure mode requiring isolation, or a specialized technology requirement.
Document generation, for example, may be a candidate when long-running processing needs separate resource limits and its failures should not block transactional work. An integration gateway may be a candidate when it manages credentials, rate limits, and mappings for several external systems. Splitting related nouns into network services without an operational reason can add coordination work without advancing a product requirement.
Test operational ownership before extraction
Before extraction, name the owner for deployment controls, observability, authentication, versioned contracts, and failure handling. Decide how the team will investigate slow responses, unavailable dependencies, and incorrect messages. Decide how data changes will be coordinated without direct database access. If those answers remain unclear, retain the modular boundary and schedule a review trigger instead.
For teams without permanent technical leadership, our fractional VP Engineering services guide outlines leadership questions that can be resolved before a major structural change.
Step 5: Design Integration and Asynchronous Workflow Patterns
Choose synchronous calls when a user needs an immediate response and a dependency is essential to the action. Use asynchronous processing when work can complete after the request, needs retries, or should not hold up a core workflow. Make this choice for each workflow rather than making every interaction event-driven or every integration synchronous.
Consider an account lifecycle workflow. An administrator creates an organization. The organization module records the account and emits an account-created event. Billing provisions its customer record, notifications send an invitation, and analytics records the event. The creation screen can complete after the core account is valid, while downstream work records its own state, retries, and operator-visible failures.
Design asynchronous consumers to be idempotent: repeated delivery should lead to the same intended state instead of duplicate side effects. Include a stable event identifier, tenant context, event version, timestamp, and only the information a consumer needs. Define retry behavior, a review path for messages that cannot complete, and a reconciliation process for comparing source records with downstream state.
Use adapters to translate external payloads into internal commands or events. This keeps vendor-specific schemas outside the core domain and makes the effect of an external field change easier to contain.
Step 6: Make Cross-Cutting Concerns Explicit
Assign owners to identity, authorization, configuration, secrets, audit logging, monitoring, deployment, backup and recovery procedures, and incident response. Shared responsibilities need named owners, review points, and evidence that the team can use during operation.
Design tenant-aware observability from the start. Decide how logs, metrics, traces, alerts, and support views will help investigate a tenant-specific issue without exposing unrelated tenant data. Specify permitted identifiers, redaction rules, operational-data retention, and the support-access workflow.
Extend the boundary for AI-enabled features
For machine-learning or generative-AI features, include inputs, knowledge sources, model outputs, evaluation, and operator controls in the architecture review. AWS provides its Machine Learning Lens as a review resource for machine-learning workloads.[1] Google Cloud’s MLOps guidance can inform planning for validation, pipelines, deployment controls, monitoring, and continuing improvement.[2]
Apply authorization and tenant filtering before information reaches a model or retrieval system. OWASP’s Top 10 for Large Language Model Applications identifies risks including prompt injection, sensitive information disclosure, supply-chain vulnerabilities, excessive agency, and insecure output handling.[3] Use NIST’s AI Risk Management Framework to structure governance, measurement, and lifecycle risk review.[4] Microsoft identifies fairness, reliability and safety, privacy and security, inclusiveness, transparency, and accountability as responsible AI considerations.[5]
Step 7: Record the Evolution Path and Trade-Offs
Write an architecture decision record for each consequential choice. Keep it short enough for planning discussions and specific enough to guide implementation. Include the decision, context, options considered, selected approach, consequences, rejected alternatives, owner, review date, and signals that trigger reconsideration.
Use concrete trigger statements rather than a vague plan to scale later. For example: extract document processing when its resource needs compromise the main application’s release or reliability requirements; or review pooled data storage before accepting a requirement for dedicated tenant resources. A trigger is a reason to reopen a decision, not a prediction.
Link each record to product milestones, module contracts, threat models, runbooks, and migration plans. This preserves decision context while allowing later teams to test whether the original assumptions still hold.
Verification Checklist
- Every tenant-owned request, job, event, cache key, and export carries verified tenant context.
- Roles are defined separately for tenant users, tenant administrators, platform administrators, and support functions.
- Each domain has a named owner, a data boundary, and an approved interface.
- Cross-module database writes and undocumented table access are prohibited or reviewed.
- Each integration documents synchronous or asynchronous behavior, retries, idempotency, versioning, and operator recovery.
- Monitoring and audit trails support tenant-specific investigation without exposing unrelated tenant information.
- Every independently deployed service has an operational owner and a recorded reason for separation.
- Architecture assumptions and evolution triggers are documented and scheduled for review.
Common Mistakes
- Copying a large-company microservice topology. Design for the current product and operating model.
- Treating isolation as a database-only concern. Review APIs, workers, storage, logs, support tools, and integrations.
- Allowing cross-module database access for convenience. Require a reviewed interface instead.
- Calling external services in critical workflows without a failure plan. Make dependency behavior and recovery visible.
- Extracting services without operational ownership. Independent deployment requires explicit responsibilities.
- Leaving AI features outside the security model. Review inputs, retrieved material, outputs, and automated actions.
Next Action
Use this guide to prepare an architecture decision record before committing to a SaaS build or major rework. Exitech can help translate user workflows, tenant requirements, integrations, and operational constraints into a practical architecture and delivery plan. Start with the decisions that protect your product’s ability to change.

Leave a Reply