Where to Actually Draw Your Service Boundaries
Neither "microservices" nor "monolith" is a strategy by itself; both are answers to a question most teams never actually ask, which is where the natural seams in this specific system are. Boundaries drawn along team ownership and data ownership tend to hold up. Boundaries drawn because a conference talk made microservices sound inevitable tend not to.
The criteria below are meant to replace that instinct with something you can actually check against your own system, rather than against what a much larger company with a much larger team decided was right for them.
Should service boundaries follow data ownership or the org chart?
A service boundary works best when it lines up with a clear owner of a specific piece of data, because that's what determines whether the boundary reduces coordination or just adds a network call in the middle of what used to be a coordination problem. If two proposed services would both need to write to the same table under normal operation, that's a signal that they're not actually separable along that line yet, no matter how cleanly the org chart divides the two teams.
Count the coordination cost you're trading for
Splitting a monolith into services doesn't remove coordination between the two areas of functionality; it changes coordination from an in-process function call, caught immediately by the compiler or a local test, into a network call and a versioned contract, whose failures surface at runtime and are harder to catch before shipping. That's a fair trade when the two areas genuinely need to scale, deploy, or fail independently. It's a worse trade when they don't, and you've added the harder-to-debug kind of coupling in exchange for an org chart that looks cleaner.
Weigh independent deployability against operational overhead
The strongest argument for a service boundary is that the two sides need to deploy on genuinely different schedules or scale independently under different load patterns. Each additional service is also an additional thing to monitor, secure, version, and keep available on its own, and that overhead is real even when the boundary is otherwise a good one. A boundary is worth its overhead when independent deployability solves an actual, current problem, not a hypothetical future one.
A service boundary is usually worth drawing when these conditions hold:
- The two sides need to deploy on genuinely different schedules, and that need exists today rather than as a future hypothetical.
- They scale independently under different load patterns, so sharing one deployment wastes capacity or slows releases.
- The proposed service would own its data, with nothing else regularly writing to the same tables.
- Your team can staff the added monitoring, security, versioning and on-call load that each extra service brings.
Watch for the boundary that keeps needing to be crossed
If a large share of your feature work keeps requiring coordinated changes across the same two services, that's a sign the boundary is in the wrong place, regardless of how it looked on the original design diagram. A boundary that was correct at one point in the system's life can become wrong as the product evolves; treat it as a living decision to revisit, not a one-time architectural commitment set in stone at the start. Count how many of your last dozen non-trivial features touched more than one service on the same side of a given boundary; a high count there is worth more than any amount of debate about which approach is more modern.
You can turn the coordination signal into a quick review. List the last several non-trivial features, mark which ones needed coordinated changes across the same pair of services, and note how long each waited on the other team. For example, if most features touching the orders service also required changes in the inventory service, the boundary between them is probably in the wrong place, and merging the two or moving the shared data may cost less than continuing. A common mistake is defending the original diagram instead of the evidence. Treat a persistent crossing as a design bug, not a process problem.
Is a monolith with clean internal boundaries a legitimate answer?
A well-structured monolith, with clear internal module boundaries and disciplined ownership, gives you most of the organizational clarity of services without the network-call overhead, and it's often the right choice for a team too small to staff separate on-call rotations for a dozen independent services. Splitting into services before the team and the traffic actually justify it tends to slow a small team down rather than speed it up.
Revisit the decision on a schedule, not only after it hurts
Put a specific, recurring checkpoint on the calendar to revisit your service boundaries, rather than waiting for the coordination cost to become painful enough that someone finally raises it. A boundary review that happens once a year alongside broader architecture planning catches the slow drift between what the system needs now and what it needed when the boundary was first drawn, before that drift turns into the kind of chronic cross-team friction that's much harder to unwind once several more features have been built on top of it.
What Good Looks Like
A good service boundary lines up with clear data ownership, trades an in-process coordination cost for a network one only when independent deployability or scaling is a genuine current need, and gets revisited when feature work keeps requiring coordinated changes across the same boundary.
Building The Capability (5-Stage Skill Ladder)
How to Get Started
Frequently Asked Questions
How do we know if we're ready to split a service out?
Look for a genuine, current need for independent scaling or deployment cadence, and check that the data the proposed service would own is actually separable, meaning nothing else regularly needs to write to it directly. Wanting cleaner org boundaries alone isn't a strong enough reason on its own.
Is it ever worth reversing a microservices split back into a monolith?
Yes, and teams that do it usually describe it as a relief rather than a failure. If a split boundary keeps requiring coordinated cross-service changes and the operational overhead outweighs any independent-scaling benefit you're actually using, merging back is a legitimate correction, not an admission of defeat.
Does team size matter in this decision?
Significantly. A small team pays the full operational overhead of many independent services, monitoring, on-call, versioning, without necessarily having the traffic or org size that would justify the split. The same boundary can be the right call at a larger team size and the wrong one at a smaller one.
About the numbers
This guide doesn't quote a sourced benchmark. Figures in it are estimates or general guidance, so check them against your own numbers.
Related Guides
Rolling Out Agentic Workflows Without Breaking Production
A practical rollout checklist for shipping an AI agent to production, from a shadow-mode test run through the guardrails that catch it if it misbehaves.
Build vs. Buy for Verifying Every Device That Connects In
What zero-trust device and identity verification actually requires, what a platform gives you over a homegrown check, and how to decide between them.
Why Your Agent Loop Feels Slow, and How to Fix It
A diagnostic guide to finding where latency actually comes from in an agentic system, and which fixes help each cause instead of masking it.
Monolith or Microservices: How to Tell Which One You Actually Need
How to decide between a monolith and microservices based on your team size and deploy needs, not on which one sounds more modern.
Finding Your Agent Stack's Breaking Point Before Customers Do
A worked example of benchmarking an agent system's throughput, so you know where it actually breaks under load instead of guessing until it does.
How to Know If Your Agent Is Actually Working
Building an evaluation framework for an AI agent, from the first small test set through catching quality regressions before customers do.