Monolith or Microservices: How to Tell Which One You Actually Need
This decision gets treated as a technology choice when it's mostly an organizational one. The question that actually predicts whether microservices help or hurt you isn't about scale, it's about how many teams need to ship independently without stepping on each other.
Vendors Covered in this Article
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
The Monolith Case: Simpler Until You Have a Real Reason Not To
A single deployable unit is easier to test end to end, easier to debug (one set of logs, one process to reason about), and easier for a small team to hold in their heads. Most companies that eventually need microservices spend their first few years correctly on a monolith, and that's not a failure to plan ahead, it's the right call for that stage.
The tradeoff shows up as the codebase and the team both grow: changes start colliding, a bug in one area can bring down an unrelated feature, and deploys get riskier because everything ships together.
The Microservices Case: Independent Deploys for Independent Teams
Microservices earn their complexity when multiple teams need to ship on their own schedule without coordinating every release. That independence is what shows up as higher deployment frequency in practice, separate services deploying separately, rather than everyone waiting on one shared release train1.
If you're a single team of five engineers, you don't have the coordination problem microservices solve, and splitting the system won't create a benefit that isn't there yet, it'll just add network calls, deployment surface area, and debugging complexity.
The Tradeoff Nobody Puts on the Diagram
Microservices trade in-process function calls for network calls, which means new failure modes: partial failures, retries, timeouts, and the need for distributed tracing to debug anything that spans more than one service. A monolith doesn't have a network call between its modules, so an entire category of production incidents simply doesn't exist yet.
This is the cost that diagrams and conference talks tend to leave out. Every service boundary you add is a boundary you now have to operate, monitor, and version separately.
A Middle Path: Modular Monolith First
You don't have to choose all-or-nothing on day one. A modular monolith, clean internal boundaries between domains, enforced through code structure rather than network calls, gets you most of the organizational clarity of microservices without the operational cost. When a specific module genuinely needs to scale or deploy independently, it's a much smaller step to extract it from a well-bounded module than from a tangled one.
For example, a ten-person team keeps one deployable unit but organizes the code into billing, accounts, and notifications modules. Each module exposes a narrow interface, and other modules may call it only through that interface, enforced by code structure and review. Months later, notifications needs to scale on its own. Because its boundary was clean, extracting it into a separate service is a contained project rather than a rewrite. The team gets most of the clarity of separate services on day one without paying for network calls, tracing, and separate deploys before it needs them.
How to Actually Decide for Your Team
Ask three questions honestly: do multiple teams need to ship independently right now, is one specific part of the system under genuinely different scaling pressure than the rest, and can your team operate the added complexity, monitoring, tracing, service discovery, that microservices require. If the honest answer to all three is no, stay on the monolith until that changes.
Revisit the Decision When the Team Doubles
The right answer for a five-person engineering team is rarely the right answer for a thirty-person one, and the mistake isn't picking wrong at five people, it's never revisiting the choice as headcount grows and coordination pain quietly builds.
Treat the monolith-versus-services question as a decision you'll actively revisit at each major growth stage, not a one-time architecture choice made in year one and left alone. The team that reconsiders on purpose avoids both premature complexity and a monolith that's outgrown its welcome.
A useful trigger for that review is simply asking, at each planning cycle, whether the last quarter's biggest release delays traced back to teams waiting on each other inside the same codebase. If the answer starts becoming yes more often than no, that's the signal to revisit the boundary question in earnest, rather than acting on a vague sense that the codebase merely feels big and unwieldy to work in day to day, which is a much shakier basis for a costly architecture rewrite decision.
A quick review at each planning cycle can use these prompts:
- Do multiple teams need to ship independently right now, or does one team coordinate its own deploys?
- Is one part of the system under clearly different scaling pressure than the rest?
- Can your team operate the added monitoring, tracing, and service discovery that separate services require?
- Did last quarter's biggest release delays trace back to teams waiting on each other inside one codebase?
- Are internal module boundaries clean enough that extracting one later would be a small project?
What Good Looks Like
The right boundary decision matches your actual team structure: a monolith for one coordinated team, service boundaries only where independent deploy needs genuinely exist.
Building The Capability (5-Stage Skill Ladder)
How to Get Started
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
Track the architecture decision and its review date as a ClickUp task so the choice gets revisited on purpose, not forgotten.
Document your module boundaries and the reasoning behind them in Trainual so new engineers understand the structure without archaeology.
Frequently Asked Questions
What team size makes it sensible to consider microservices?
There's no fixed headcount, but the real trigger is when multiple teams are regularly blocked waiting on each other's changes to ship a release. A single team of any size rarely has that problem, since one team can coordinate its own deploys without a service boundary forcing the issue.
Can we split a monolith into microservices later without a full rewrite?
Yes, if the monolith has clean internal module boundaries to begin with. Extracting a well-bounded module into its own service is a much smaller project than extracting one that's tangled throughout the codebase, which is the main argument for a modular monolith as a first step.
Do microservices actually improve reliability?
Not automatically. They isolate failures to a smaller blast radius in theory, but they also introduce new failure modes around network calls between services. Reliability comes from how well you operate the added complexity, not from the architecture choice by itself.
Sources
Where we quote a benchmark, we show its source. Other figures in this guide are estimates or general guidance, so check them against your own numbers.
- Deployment frequency by DORA performance cluster (max days between deploys). DORA Accelerate State of DevOps 2024 (Google Cloud), cluster table via Octopus Deploy analysis, 2024.
Related Guides
Microservices vs. Monolith: What Actually Justifies the Split
Splitting a monolith fixes a deployment coupling problem, not a code organization problem. Here is how to tell which one you actually have.
How to Decide Where Your Next Service Boundary Actually Belongs
A decision guide for CTOs choosing whether to split a piece of a monolith into its own service, built around four concrete criteria, not team size.
When Splitting a Pipeline Into Services Is Worth the Cost
A tradeoff comparison for when decomposing a monolithic data pipeline into separate services actually pays off, and when it just adds coordination cost.
How to Tell If Your Monolith Actually Needs Splitting
A way to decide which parts of a monolith, if any, actually need a hard service boundary, instead of splitting everything or staying stuck out of habit.
Modular Monolith or Microservices: A Decision Guide
How to decide between a modular monolith and microservices based on your team size and deploy pain, not which architecture sounds more serious.
Where to Actually Draw Your Service Boundaries
A set of criteria for deciding where a service boundary belongs, instead of defaulting to microservices or a monolith because of what other teams are doing.