TL;DR:
- Most small teams should start with a monolith or modular monolith until organizational or scaling pressures justify microservices. Microservices are best suited for large organizations with clear domain boundaries, regulatory needs, or divergent scaling requirements, not for early-stage SaaS teams. Adopting microservices without operational maturity often leads to increased complexity, costs, and failed migrations.
For most teams under 50 engineers, start with a modular monolith and adopt microservices only when you hit a concrete, measurable organizational or scaling pressure. That is the short answer, and the rest of this article explains why the evidence points there so consistently.

The decision is not primarily technical. It is organizational. Team size, domain clarity, and operational maturity determine whether microservices pay off, not request volume or ambition. Only 9% of organizations report complete success with microservices, and over half of initial migrations fail to meet their stated objectives. Those numbers should recalibrate any default assumption that microservices are the "modern" choice.
TL;DR decision guide:
- Start with a monolith if your team is under 10 engineers, your domain is not yet fully understood, or you need to ship fast.
- Start with a modular monolith if your team is 10–50 engineers, you have some domain clarity, and you want to preserve the option to extract services later without paying the full microservices tax now.
- Move to microservices if you have 50+ engineers, clear bounded contexts, independent scaling requirements across services, regulatory isolation mandates, or deployment bottlenecks that a modular monolith cannot resolve.
Netflix is the canonical microservices success story, but Netflix had hundreds of engineers, a decade of operational learning, and a streaming workload with genuinely divergent scaling profiles across its services. Most SaaS products are not Netflix at the point the architecture decision gets made.
Table of Contents
- What exactly are a monolith, a modular monolith, and microservices?
- How do monolith vs microservices actually compare?
- Pros and cons of each approach
- When should you choose monolith vs microservices?
- What does microservices actually cost to operate?
- How to migrate from a monolith to microservices
- Why research backs the modular monolith as the pragmatic default
- Engineering and ops differences that actually affect delivery
- A practical decision checklist for your next planning meeting
- Real-world examples and what they actually teach
- Key Takeaways
- The modular monolith is underrated, and here is why that matters
- Your architecture decision deserves a full product audit, not a gut call
- Useful sources
- FAQ
What exactly are a monolith, a modular monolith, and microservices?
These three terms get used loosely, so a shared baseline matters before comparing them.
A monolith is a single deployable unit where all application logic, from user authentication to billing to reporting, runs in one process and shares one database. You deploy the whole thing or nothing.
A modular monolith is still a single deployable unit, but it enforces strict internal boundaries between modules. Each module owns its data (or at least its schema namespace), exposes a defined interface, and cannot reach directly into another module's internals. You still deploy once, but the architecture is designed so that individual modules could be extracted into services later without a full rewrite.
Microservices are multiple independently deployable services, each owning its own data store and communicating over a network (HTTP, gRPC, or a message bus). A change to the billing service can be deployed without touching the authentication service.
A useful mental model: picture three boxes. The monolith is one box with everything inside, wires crossing freely. The modular monolith is one box with labeled compartments and clean connectors between them. Microservices are separate boxes connected by cables you have to manage, monitor, and version.
The modular monolith is the middle path that most architecture guidance now recommends as the default starting point, because it preserves optionality without paying the distributed-system tax upfront.
How do monolith vs microservices actually compare?
The table below maps the two approaches (plus the modular monolith) across the dimensions that affect real product delivery and operating costs.

| Dimension | Monolith | Modular Monolith | Microservices |
|---|---|---|---|
| Scalability | Scale the whole app; no per-component scaling | Scale the whole app; internal boundaries ease future extraction | Scale individual services independently |
| Deployment independence | One release train; all teams share a deploy cycle | One release train; module boundaries reduce coupling | Each service deploys on its own cadence |
| Operational complexity | Low; one process, one log stream | Low-to-medium; still one process | High; service mesh, distributed tracing, orchestration required |
| Team organization | Works well for small, co-located teams | Works well for teams organized around product areas | Requires team-per-service ownership (Conway's Law applies) |
| Infrastructure cost | Low baseline | Low baseline | 2–3x higher total infrastructure/tooling costs before specialized staff |
| Debugging/observability | Single log stream; straightforward stack traces | Single log stream with module context | Requires distributed tracing (Jaeger, Zipkin), centralized logging (ELK, Datadog) |
| Fault isolation | A bug can crash the whole process | A bug can crash the whole process | A failing service degrades gracefully if circuit breakers are in place |
| Time-to-market | Fast for early-stage; slows as codebase grows | Fast, with better long-term maintainability | Slow to set up; faster per-service once mature |

Conway's Law is not a metaphor here. Your architecture will mirror your communication structure whether you plan it or not. A team of five sharing a Slack channel will naturally produce a monolith. A company with 12 squads each owning a product domain will naturally produce something that looks like microservices. Fighting that gravity is expensive.
Pro Tip: The most common mis-evaluation is treating microservices as a scalability solution. The distributed system tax, which includes network failures, versioning complexity, saga orchestration, and observability overhead, can consume a substantial share of engineering capacity once services proliferate. Solve scaling with a modular monolith first; extract services only when the monolith's scaling ceiling is actually visible.
Pros and cons of each approach
Monolith
Pros:
- Fastest path from idea to working software
- Simple local development; one
docker-compose upand you are running - Easy debugging with a single stack trace
- No network latency between components
- Low infrastructure cost
Cons:
- Scales as one unit; you cannot scale the checkout module without scaling everything
- Large codebases become hard to navigate without enforced boundaries
- A single bad deploy can take down the entire application
- Long-term, teams step on each other's code
Best for: early-stage products, small teams, and any situation where domain boundaries are still being discovered.
Modular monolith
Pros:
- Retains monolith's simplicity and deployment speed
- Enforced module boundaries prevent the "big ball of mud" failure mode
- Easier to extract services later when the time genuinely comes
- Practitioner estimates put it at roughly 80% of the benefits of microservices at about 20% of the cost.
Cons:
- Requires discipline to maintain module boundaries (linting rules, architecture tests with ArchUnit or Dependency Cruiser help)
- Still a single deploy; a critical bug still takes down everything
- Does not solve divergent scaling requirements
Best for: growing SaaS teams that want architectural optionality without the operational overhead of distributed systems.
Microservices
Pros:
- Independent deployability per service; teams ship without coordinating
- Fault isolation when circuit breakers and bulkheads are properly implemented
- Polyglot runtimes; the ML inference service can be Python while the billing service is Go
- Divergent scaling; scale the video transcoding service without touching user auth
Cons:
- High operational overhead from day one (service mesh, CI/CD per service, distributed tracing)
- Network calls replace in-process function calls, introducing latency and failure modes
- Data consistency across services requires sagas or eventual consistency patterns
- Debugging a distributed trace across 15 services is genuinely hard
Best for: large engineering organizations with clear domain ownership, mature DevOps culture, and explicit scaling or regulatory isolation requirements.
When should you choose monolith vs microservices?
The right architecture depends on where your team and product actually are, not where you hope to be in three years.
| Stage | Team Size | Recommended Architecture | Key Signals |
|---|---|---|---|
| Early-stage / pre-PMF | 1–10 engineers | Monolith | Speed matters most; domain is still being discovered |
| Growing / post-PMF | 10–50 engineers | Modular monolith | Some domain clarity; need maintainability without ops overhead |
| Scaling / multi-team | 50 engineers | Modular monolith or selective extraction | Deployment bottlenecks or divergent scaling needs starting to appear |
| Large enterprise | 50+ engineers | Microservices (selective) | Multiple autonomous teams; clear bounded contexts; regulatory isolation |
Three specific use cases genuinely favor microservices over a modular monolith:
- Regulatory isolation. If your fintech or healthtech product must keep PII or payment data in a separately auditable service, extraction is not optional. A compliance-driven architecture decision is one of the clearest signals to extract.
- Divergent scaling profiles. If your video processing module needs 50x the compute of your user management module, paying to scale the whole app is wasteful.
- Polyglot runtime requirements. When one part of your system genuinely needs a different language or runtime for performance reasons (ML inference, real-time event processing), a service boundary makes sense.
For SaaS products specifically, the default recommendation is a modular monolith with a multi-tenant architecture baked in from the start. Multi-tenancy enables cost sharing and scalability, but it requires careful tenant-aware logic and security controls regardless of whether you are running a monolith or microservices. Getting that right inside a modular monolith is significantly cheaper than managing it across 20 services.
Pro Tip: If you are building a SaaS product and debating single vs. multi-tenant architecture, resolve that question before you resolve the monolith vs. microservices question. The tenancy model shapes your data isolation requirements, which in turn shapes whether you need service-level isolation at all.
What does microservices actually cost to operate?
The infrastructure line item is only part of the story. The hidden costs are where most teams get surprised.
Direct costs:
- Service mesh (Istio, Linkerd): licensing or engineering time to operate
- Observability stack: observability tooling for mid-market organizations can run $50,000–$300,000 per year
- CI/CD pipelines: one pipeline per service, each requiring maintenance
- Container orchestration: Kubernetes cluster management, or a managed equivalent on AWS EKS, Google GKE, or Azure AKS
Hidden costs:
- SRE headcount: a 100-service deployment typically requires multiple specialized site reliability engineers, each commanding a salary premium
- Developer cognitive load: engineers must understand network contracts, versioning, and distributed failure modes in addition to their own service logic
- Incident response time: debugging a distributed trace across many services takes longer than reading a single stack trace
| Cost Category | Modular Monolith | Microservices (mid-market) |
|---|---|---|
| Infrastructure | Low baseline | 2–3x monolith baseline |
| Observability tooling | Low to moderate cost | High cost observability tooling |
| CI/CD maintenance | 1 pipeline | 1 pipeline per service |
| SRE headcount | Small or no dedicated SREs | Multiple specialized SREs for large multi-service deployments |
| Developer onboarding time | Short | Longer |
These numbers are not arguments against microservices. They are arguments for being honest about the budget and headcount required before committing. Many teams discover these costs six months into a migration, not before it starts.
How to migrate from a monolith to microservices
The strangler fig pattern is the standard approach for a reason: it lets you extract incrementally without a big-bang rewrite, and it keeps the monolith running while you validate each extraction.
Step-by-step migration process
- Map bounded contexts. Before touching code, identify the natural domain boundaries in your application. Billing, user management, notifications, and reporting are common candidates. Each bounded context is a potential service.
- Audit operational maturity. Do you have automated CI/CD, centralized logging, and distributed tracing in place? If not, build those first. Successful microservices adoption requires this foundation; skipping it leads to operational debt that compounds quickly.
- Cost the migration fully. Include SRE headcount, observability tooling, and the engineering time to define and maintain service contracts. A recommended 30-day pre-migration process covers mapping, prerequisites, full cost modeling, and defining measurable success criteria before any extraction begins.
- Extract one bounded context as an experiment. Pick the least-coupled, most independently deployable module. Extract it, deploy it, and measure the results against your success criteria before extracting anything else.
- Verify metrics, then iterate. Did deployment frequency increase? Did incident rate stay flat or improve? If yes, continue. If not, diagnose before extracting the next service.
Anti-patterns to avoid
- The distributed monolith. This is the most dangerous failure mode. It forms when services share a database or require coordinated deployments. Symptoms include frequent multi-service redeploys for a single feature change and tightly coupled synchronous call chains. You get all the operational complexity of microservices with none of the independence.
- Premature decomposition. Extracting services before domain boundaries are stable means you will redraw those boundaries repeatedly. Each redraw is expensive. Extract services only to address explicit pressures: team bottlenecks, divergent scaling, or regulatory isolation.
- Shared database without contracts. If two services read and write the same tables, they are not independent. Each service must own its data store, or at minimum expose its data only through a defined API.
First service extraction checklist
- Bounded context is clearly defined and stable
- Service has no shared database tables with other modules
- Automated CI/CD pipeline exists for the new service
- Distributed tracing is in place before go-live
- Rollback plan is documented and tested
- Success criteria are defined (deployment frequency, error rate, latency SLA)
- On-call runbook exists for the new service
Pro Tip: Treat the first extraction as a proof of concept, not a production commitment. If it takes more than 60 days to extract one bounded context cleanly, that is a signal your domain model or operational foundation needs more work before you proceed.
Why research backs the modular monolith as the pragmatic default
The data on microservices adoption is sobering. Only a small minority of organizations report complete success with microservices migrations, and many initial migrations fail to meet their objectives. Those are not numbers from skeptics; they come from practitioners who attempted the transition.
The failure pattern is consistent: teams adopt microservices before they have the organizational structure, operational tooling, or domain clarity to support them. The result is a distributed monolith that is harder to operate than the original system and no faster to deploy.
The architecture decision is primarily an organizational strategy. Monoliths serve speed and simplicity. Microservices serve large organizations that need team autonomy and divergent scaling. Choosing microservices for a 15-person team is not ambitious engineering; it is misaligned organizational design.
The organizational triggers that research identifies as genuine thresholds for microservices adoption:
- Team size above 50 engineers, where coordination overhead in a shared codebase starts to measurably slow delivery
- Multiple autonomous squads each owning a distinct product domain with independent release cadences
- Measurable deployment bottlenecks: teams blocking each other's releases in the monolith
- Divergent scaling requirements that make scaling the whole application economically irrational
- Regulatory isolation mandates that require data or processing to be auditable at the service level
If your organization does not meet at least two or three of these thresholds, the modular monolith is the better bet. It delivers the maintainability benefits of clear boundaries without the operational tax of distributed systems.
Pro Tip: Before committing to microservices, run a quick audit: count your engineers, map your bounded contexts, check whether you have automated CI/CD and observability already in place, and calculate the full annual cost including SRE headcount and tooling. If any of those checks fails, defer the migration and invest in the modular monolith instead.
Engineering and ops differences that actually affect delivery
The gap between running a monolith and running microservices is not just conceptual. It shows up in your daily engineering workflow.
Must-have capabilities for microservices
- Automated CI/CD per service: each service needs its own pipeline; a shared pipeline reintroduces the coupling you are trying to eliminate
- Distributed tracing: tools like Jaeger or Zipkin (or Datadog APM, Honeycomb) are non-negotiable; without them, debugging a failed request across five services is guesswork
- Centralized logging: an ELK stack, Datadog, or similar aggregation layer so you can correlate logs across services
- Service discovery: Consul, Kubernetes DNS, or a service mesh handles routing as services scale and move
- mTLS between services: mutual TLS prevents a compromised service from impersonating another; Istio or Linkerd handle this at the mesh layer
Testing differences
Monoliths rely on integration tests that spin up the whole application. Microservices require contract testing, where each service verifies it honors the contracts its consumers depend on. Pact is the standard tool for consumer-driven contract testing in this space. Without it, a breaking API change in one service silently breaks its consumers until a production incident surfaces it.
Security and multitenancy
Security surface area expands significantly with microservices. Each service-to-service call is a potential attack vector. Beyond mTLS, you need a centralized identity layer (OAuth 2.0, JWT validation at the gateway) and careful tenant-aware logic at every data access point.
For SaaS platforms, AWS describes Silo, Bridge, and Pool models for tenant isolation, each with different trade-offs between isolation strength and cost. A Silo model (separate infrastructure per tenant) gives the strongest isolation but the highest cost. A Pool model (shared infrastructure with logical separation) is cheapest but requires rigorous tenant-aware query logic at every data layer. The Bridge model sits between them.
In SaaS platforms, the multi-tenancy and tenant-isolation strategy often determines whether a modular monolith suffices or whether service extraction is needed for compliance or isolation requirements. Resolve the tenancy model before the service decomposition model.
A SaaS audit checklist for enterprise readiness will always include tenant isolation, observability, and security controls as first-tier items, regardless of the underlying architecture. These are not microservices problems; they are SaaS problems.
A practical decision checklist for your next planning meeting
Work through these questions in order. The first "no" answer tells you where to stop.
- Do you have 50+ engineers? No → stay with a modular monolith.
- Do you have clear, stable bounded contexts? No → invest in domain modeling first.
- Do you have automated CI/CD and observability already in place? No → build those before extracting any service.
- Is there a measurable deployment bottleneck in the monolith? No → the monolith is not the problem; look elsewhere.
- Do you have divergent scaling requirements across modules? No → a modular monolith with horizontal scaling handles this.
- Do you have a regulatory or compliance isolation requirement? No → proceed with modular monolith.
- Can you staff and budget for 2–5 SREs and $50,000–$300,000/year in observability tooling? No → defer microservices.
If you answered yes to all seven, microservices are likely the right next step. If you hit a "no" before question 7, the table below shows what to do instead.
| Decision Point | Recommendation | Immediate Next Step |
|---|---|---|
| Under 50 engineers | Modular monolith | Enforce module boundaries with architecture tests |
| No stable bounded contexts | Modular monolith | Run a domain-modeling workshop; map bounded contexts |
| No CI/CD or observability | Defer extraction | Build the foundation; add automated tests per module |
| No deployment bottleneck | Stay put | Monitor; revisit when bottlenecks appear |
| No divergent scaling need | Modular monolith | Add horizontal scaling to the monolith first |
| Regulatory isolation required | Selective extraction | Extract only the regulated domain; keep the rest monolithic |
| Budget/headcount gap | Defer microservices | Invest in modular monolith maintainability |
Real-world examples and what they actually teach
Netflix
Netflix is the most cited microservices success story, and it is worth understanding what made it work. Netflix migrated from a monolith to microservices starting around 2009, driven by a genuine need: a streaming platform with radically different scaling requirements across its recommendation engine, content delivery, user authentication, and billing systems. By the time the migration was complete, Netflix had hundreds of engineers, a dedicated platform team, and built much of the tooling (Hystrix for circuit breaking, Eureka for service discovery) that the industry now takes for granted.
The lesson is not "use microservices." The lesson is: Netflix had the team size, the operational investment, and the divergent scaling requirements that justify the cost. Most SaaS products at the point of the architecture decision have none of those three.
Shopify
Shopify runs one of the largest Rails monoliths in production. Rather than decompose into microservices, Shopify invested heavily in modular monolith patterns, enforcing strict boundaries between modules and using a component-based architecture within a single deployable unit. The result is a platform that serves millions of merchants without the operational overhead of a distributed system.
Shopify's approach demonstrates that a disciplined modular monolith, not a microservices rewrite, is often the right answer for a high-scale SaaS platform. The boundary enforcement is the hard part; the deployment model is secondary.
Enterprise reverse migrations
Several high-profile engineering teams have publicly documented moving back from microservices to monoliths or modular monoliths after discovering the operational cost exceeded the benefit. The common thread: the teams adopted microservices before they had the domain clarity or operational maturity to sustain them. The distributed monolith anti-pattern appeared, debugging became harder, and deployment frequency did not improve. The fix was consolidation, not more services.
The lesson: microservices are not a destination. They are a solution to specific, measurable problems. When those problems do not exist, the architecture creates more problems than it solves.
Key Takeaways
A modular monolith is the right default for most SaaS teams; adopt microservices only when you have 50+ engineers, stable bounded contexts, and the operational foundation to support distributed systems.
| Point | Details |
|---|---|
| Default to modular monolith | Practitioner estimates put it at roughly 80% of the benefits of microservices at about 20% of the cost for most teams. |
| Microservices have a high failure rate | Only 9% of organizations report complete success; over half of migrations fail to meet objectives. |
| Infrastructure costs multiply | Microservices typically run 2–3x higher total infrastructure and tooling costs before specialized staff. |
| Extract services for specific pressures | Regulatory isolation, divergent scaling, and deployment bottlenecks are the valid triggers; ambition is not. |
| SaaS LaunchPad audits architecture readiness | A 21-discipline product analysis covers scalability, tenant isolation, and migration planning before you commit. |
The modular monolith is underrated, and here is why that matters
The conventional wisdom in engineering circles still leans toward microservices as the "serious" architecture choice. Choosing a monolith, even a well-structured modular one, can feel like admitting you are not building something ambitious. That framing is wrong, and it costs teams real money.
The engineers who built and scaled Shopify's monolith are not less sophisticated than the engineers who built Netflix's microservices platform. They made a different organizational bet, and for their context, it was the right one. The sophistication is in the module boundaries, the domain modeling, and the discipline to maintain clean interfaces, not in the number of deployment units.
What concerns me about how this decision gets made in practice is the social pressure. Microservices appear in job postings, conference talks, and architecture diagrams as a signal of technical maturity. Teams adopt them to look serious, not because they have a deployment bottleneck or a regulatory isolation requirement. The result is predictable: a distributed monolith that is harder to debug than the original system, a doubled infrastructure bill, and a team spending 40% of its engineering capacity on distributed systems plumbing instead of product features.
The modular monolith is not a stepping stone you tolerate until you can afford microservices. For many SaaS products, it is the permanent right answer. The teams that recognize that early ship faster, spend less, and build more maintainable systems than the teams that chase the architecture they think they are supposed to want.
If you are genuinely at the threshold where microservices make sense, the checklist in this article will confirm it. If you are not, the same checklist will tell you that too, and that is the more valuable answer.
Your architecture decision deserves a full product audit, not a gut call
Architecture choices ripple through every layer of a SaaS product: scalability, security, tenant isolation, CI/CD maturity, and enterprise readiness all connect back to whether your system is structured to support them. Getting that decision right before you build or migrate saves months of rework.

SaaS LaunchPad runs a 21-discipline product engineering analysis that covers exactly these dimensions: platform architecture, scalability assessment, security and tenant isolation, performance analysis, and a phased execution roadmap. You get a Product Excellence Blueprint and a copy-paste-ready Master Transformation Prompt tailored to your platform, not a generic report. The analysis covers whether your current architecture supports your growth trajectory and where the gaps are before they become production incidents.
No subscription, no retainer. Purchase a single analysis credit, get the full blueprint, and use it in your next planning cycle. See the full 21-stage process or go straight to the pricing page to get started.
Useful sources
These are the primary references behind this article, selected for authority and practical depth.
-
Monolithic vs. Microservices Architecture (IBM) — Clear, authoritative overview from IBM covering the core tradeoffs. Good for sharing with non-technical stakeholders who need a neutral framing.
-
Multi-Tenant Architecture (Shopify Blog) — Shopify's own explanation of how multi-tenancy drives SaaS architecture decisions. Directly relevant to the single vs. multi-tenant question and how it intersects with service decomposition.
-
Architecting Multi-Tenant Solutions on AWS — AWS's official documentation on Silo, Bridge, and Pool tenancy models. The most authoritative reference for teams making tenant isolation decisions on AWS infrastructure.
-
Architect Multitenant Solutions on Azure (Microsoft Learn) — Microsoft's equivalent guide for Azure-hosted SaaS. Covers tenancy models, isolation patterns, and operational considerations with Azure-specific implementation guidance.
-
You Want Microservices, But Do You Really Need Them? (Docker) — Docker's own guidance clarifying that containers are architecture-agnostic. Useful for teams that conflate containerization with microservices adoption.
-
Conway's Law (Wikipedia) — The original formulation and its implications for software architecture. Short read; worth assigning to anyone on your team who has not encountered it.
FAQ
Is Netflix monolithic or microservices?
Netflix runs a microservices architecture, having migrated from a monolith starting around 2009. The migration was driven by genuine divergent scaling requirements across its streaming, recommendation, and billing systems, supported by hundreds of engineers and a dedicated platform team.
Why are companies moving back from microservices to monoliths?
Teams that adopted microservices before establishing stable domain boundaries, automated CI/CD, and observability often end up with a distributed monolith: all the operational complexity with none of the deployment independence. Consolidating back to a modular monolith recovers engineering capacity and simplifies debugging without sacrificing maintainability.
Is Docker monolithic or microservices?
Docker is architecture-agnostic. Containers work equally well for monoliths and microservices. Running your monolith in a Docker container does not make it microservices, and you do not need microservices to benefit from containerization.
What will replace microservices?
The modular monolith is the most credible near-term answer for most teams. Modular monoliths with well-enforced boundaries deliver most of the maintainability benefits of microservices at a fraction of the operational cost. For large organizations, selective service extraction from a modular monolith base is increasingly the pattern, rather than full decomposition from the start.
When does a SaaS product actually need microservices?
A SaaS product genuinely needs microservices when it has 50+ engineers with clear domain ownership, measurable deployment bottlenecks in the monolith, divergent scaling requirements across modules, or regulatory isolation mandates that require service-level data separation. SaaS LaunchPad's 21-discipline audit covers all of these dimensions and can tell you whether your platform has crossed those thresholds.
