← Back to blog

Monolith vs Microservices: What Architects Need to Know

August 6, 2026
Monolith vs Microservices: What Architects Need to Know

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.

Engineering team discussing microservices designs

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?

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.

Hands analyzing modular monolith infographic

DimensionMonolithModular MonolithMicroservices
ScalabilityScale the whole app; no per-component scalingScale the whole app; internal boundaries ease future extractionScale individual services independently
Deployment independenceOne release train; all teams share a deploy cycleOne release train; module boundaries reduce couplingEach service deploys on its own cadence
Operational complexityLow; one process, one log streamLow-to-medium; still one processHigh; service mesh, distributed tracing, orchestration required
Team organizationWorks well for small, co-located teamsWorks well for teams organized around product areasRequires team-per-service ownership (Conway's Law applies)
Infrastructure costLow baselineLow baseline2–3x higher total infrastructure/tooling costs before specialized staff
Debugging/observabilitySingle log stream; straightforward stack tracesSingle log stream with module contextRequires distributed tracing (Jaeger, Zipkin), centralized logging (ELK, Datadog)
Fault isolationA bug can crash the whole processA bug can crash the whole processA failing service degrades gracefully if circuit breakers are in place
Time-to-marketFast for early-stage; slows as codebase growsFast, with better long-term maintainabilitySlow to set up; faster per-service once mature

Infographic comparing monolith and microservices architectures

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 up and 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.

StageTeam SizeRecommended ArchitectureKey Signals
Early-stage / pre-PMF1–10 engineersMonolithSpeed matters most; domain is still being discovered
Growing / post-PMF10–50 engineersModular monolithSome domain clarity; need maintainability without ops overhead
Scaling / multi-team50 engineersModular monolith or selective extractionDeployment bottlenecks or divergent scaling needs starting to appear
Large enterprise50+ engineersMicroservices (selective)Multiple autonomous teams; clear bounded contexts; regulatory isolation

Three specific use cases genuinely favor microservices over a modular monolith:

  1. 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.
  2. 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.
  3. 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 CategoryModular MonolithMicroservices (mid-market)
InfrastructureLow baseline2–3x monolith baseline
Observability toolingLow to moderate costHigh cost observability tooling
CI/CD maintenance1 pipeline1 pipeline per service
SRE headcountSmall or no dedicated SREsMultiple specialized SREs for large multi-service deployments
Developer onboarding timeShortLonger

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

  1. Do you have 50+ engineers? No → stay with a modular monolith.
  2. Do you have clear, stable bounded contexts? No → invest in domain modeling first.
  3. Do you have automated CI/CD and observability already in place? No → build those before extracting any service.
  4. Is there a measurable deployment bottleneck in the monolith? No → the monolith is not the problem; look elsewhere.
  5. Do you have divergent scaling requirements across modules? No → a modular monolith with horizontal scaling handles this.
  6. Do you have a regulatory or compliance isolation requirement? No → proceed with modular monolith.
  7. 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 PointRecommendationImmediate Next Step
Under 50 engineersModular monolithEnforce module boundaries with architecture tests
No stable bounded contextsModular monolithRun a domain-modeling workshop; map bounded contexts
No CI/CD or observabilityDefer extractionBuild the foundation; add automated tests per module
No deployment bottleneckStay putMonitor; revisit when bottlenecks appear
No divergent scaling needModular monolithAdd horizontal scaling to the monolith first
Regulatory isolation requiredSelective extractionExtract only the regulated domain; keep the rest monolithic
Budget/headcount gapDefer microservicesInvest 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.

PointDetails
Default to modular monolithPractitioner 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 rateOnly 9% of organizations report complete success; over half of migrations fail to meet objectives.
Infrastructure costs multiplyMicroservices typically run 2–3x higher total infrastructure and tooling costs before specialized staff.
Extract services for specific pressuresRegulatory isolation, divergent scaling, and deployment bottlenecks are the valid triggers; ambition is not.
SaaS LaunchPad audits architecture readinessA 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

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.


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.