A practical lesson on why business capability is usually the strongest first heuristic for service decomposition and how to turn a capability idea into a reviewable boundary candidate.
Business capability is usually the strongest first heuristic for service decomposition because it starts from what the organization must do rather than from how the code or database currently happens to be arranged. Teams often make better boundary decisions when they start with billing, identity, catalog, checkout, or fulfillment than when they start with controllers, schemas, tables, or UI screens. Capability-first thinking creates better questions about responsibility, outcomes, and ownership.
This matters because service boundaries are expensive. They affect runtime behavior, team coordination, and data ownership. A capability-centered boundary is more likely to produce something a team can explain, own, and operate without endless translation from technical structure back into business purpose.
flowchart TD
A["Potential boundary"] --> B{"Centered on a real business capability?"}
B -- Yes --> C["Check ownership, data, and workflow pressure"]
B -- No --> D["Likely technical split without enough meaning"]
Capability is a strong heuristic because it aligns several things at once:
It is easier to evaluate whether billing or checkout should be separate than whether invoice_table or customer_controller should be separate. The former talks about responsibility. The latter talks about implementation residue.
Technical layers still matter inside a boundary. A service may have controllers, repositories, workflows, and event handlers. But those are internal implementation concerns. They rarely make good top-level service boundaries on their own.
A layer-based split often creates services that mostly forward calls, expose storage details, or fragment one workflow across several thin APIs. Capability-based boundaries are more likely to produce contracts shaped around business actions instead of internal plumbing.
A capability label is not enough. Teams should make the candidate explicit:
The example below is a useful first-pass capability card.
1capability: checkout
2purpose: Confirm intent to purchase and prepare an order for downstream financial and fulfillment work
3owns:
4 - checkout_session
5 - purchase_confirmation
6does_not_own:
7 - final payment settlement
8 - shipment execution
9team: commerce-checkout
What to notice:
does_not_own is often where weak boundaries become visibleCapability-first design is strongest when it is the beginning of a review, not the end of one.
A team proposes a customer service because customer-related data appears in onboarding, billing, support, loyalty, and identity. Is capability-based decomposition pointing toward one service here?
Usually no. The stronger answer is that customer is a broad business noun, not automatically one coherent capability. The review should separate the actual responsibilities before treating the label as a boundary.