Enterprise DevSecOps & Automated CompliancePlaybook3 min readUpdated September 2026

How to Decide Where Your Next Service Boundary Actually Belongs

The build vs. buy of choosing new service boundaries usually gets framed as microservices versus monolith, as if it were one decision made once. It's better treated as a repeated question: does this specific piece of functionality deserve its own boundary, asked module by module as the system grows. Here are the criteria that actually answer it.

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.

Criterion 1: does it scale differently from the rest of the system

A module whose load pattern is genuinely different from the rest of the application, say a video processing job that runs long and uses heavy compute against a codebase that otherwise handles quick web requests, benefits from its own boundary so it can be scaled and resourced independently. A module that scales roughly in step with everything else gains little from separation and pays the cost of a network hop for no real benefit.

This is the strongest, most concrete criterion of the four, because it's measurable rather than a matter of team preference.

Criterion 2: does it have a genuinely different deploy cadence

A module that needs to ship several times a day, independent of the rest of the system's release cycle, is a candidate for its own service specifically so its deploys don't have to wait on or risk everything else. A module that always ships alongside the rest of the application gains nothing from a separate deploy pipeline and just adds coordination overhead between services that are, in practice, always released together anyway.

DORA's own research treats deployment frequency as one of the clearest signals of delivery performance, and it's worth asking, module by module, whether a shared deploy cadence is actually holding a specific piece of the system back1.

Criterion 3: does splitting it reduce or increase the number of people who need to coordinate

A module owned cleanly by one team, with a narrow, stable interface to the rest of the system, is a good boundary candidate: splitting it lets that team move without coordinating every change with everyone else. A module whose logic is tangled across concerns owned by several teams is the opposite case; splitting it before untangling the ownership just moves the coordination problem across a network boundary instead of solving it.

If you can't name the one team that would own the new service cleanly, that's a sign the split is premature, not that it needs a bigger team to support it.

Criterion 4: can you actually operate another service

Every new service adds its own deploy pipeline, its own monitoring, its own on-call surface, and its own failure modes to reason about. A team without the operational maturity to run what they already have is not helped by adding another moving part, no matter how clean the logical boundary looks on a whiteboard.

Be honest about this one specifically. It's the criterion most often skipped because it's less interesting to discuss than the architecture itself, and it's also the one whose absence causes the most pain months after the split.

When the answer is: leave it in the monolith

A module that fails most of these four criteria is better served by a clean internal boundary, a well-defined module or package inside the existing codebase, than by a network boundary. An internal boundary gets most of the benefit (isolated ownership, a clear interface, the option to extract it later) without the operational cost of a separate service. Extraction is much easier to do later, once a criterion genuinely starts failing, than reversing a premature split is to undo.

Running the four criteria as a repeatable exercise, not a one-time debate

The most useful version of this decision isn't a single architecture meeting early in a project's life; it's a short, repeatable exercise applied whenever a module starts feeling like it might deserve its own boundary. Keep the four criteria as a standing checklist rather than relitigating the whole microservices-versus-monolith question from scratch every time someone proposes a split.

A module that fails all four criteria today might pass two of them in a year as the system and team grow. Revisiting the same module against the same criteria periodically is a far steadier way to make this decision than waiting for a single big rearchitecture conversation to settle it once and for all.

Ask these four questions about any module before splitting it out:

  • Does it scale differently from the rest of the system, with a load pattern that would benefit from independent resourcing?
  • Does it have a genuinely different deploy cadence, needing to ship far more often than the rest of the application?
  • Would splitting it reduce the number of people who must coordinate, given a single owning team and a narrow, stable interface?
  • Can your team actually operate another service, including its pipeline, monitoring, on-call surface, and failure modes?
Executive Capability Standard

What Good Looks Like

Good service-boundary decisions mean a new split is justified against scaling profile, deploy cadence, team ownership, and real operational capacity, not drawn from a general preference for microservices.

Building The Capability (5-Stage Skill Ladder)

1. Learn:Read your team's own deploy and incident history for the module in question before deciding, so the decision is grounded in your actual system rather than general architecture advice.
2. Do Manually:Run the four criteria against a candidate module in a short written document before starting any extraction work.
3. Delegate:Assign the extraction decision to the team that would own the resulting service, since they're the ones who'll live with the operational cost.
4. Automate:Track deploy frequency and incident rate per module over time, so a genuinely different profile shows up in data rather than being argued from memory.
5. Buy:Consider a service mesh or platform engineering tool once you're operating enough independently deployed services that manual coordination between them becomes its own job.

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.

Frequently Asked Questions

Is there a team-size threshold where microservices start making sense?

Team size matters less than whether the four criteria above are actually true for a specific module. A ten-person team with one module that has a genuinely different scaling and deploy profile can benefit from splitting it; a fifty-person team where every module ships together gains little from splitting for its own sake.

How do we know if we split too early?

Watch for signs like cross-service debugging taking longer than it used to, deploys of the two services needing to be coordinated anyway, or one team ending up as the de facto owner of both. Any of those suggests the split didn't match the criteria as well as it looked like it would on paper.

Can we un-split a service that shouldn't have been separated?

Yes, though it's more work than the original split, since traffic and data now flow through a network boundary that has to be collapsed back into a single deployable. It's still usually cheaper than continuing to pay the coordination cost of a boundary that never matched the underlying criteria.

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.

  1. 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