Insights · Service design debt
Service Design Debt: What It’s Actually Costing Your Software
Tightly coupled software does not merely make a system harder to change. It changes the economics of every new feature, company, and workspace.
The problem
A useful name for the work your software keeps creating.
Service Design Debt is the accumulated cost of software whose responsibilities have become entangled. It shows up when the part of the product that identifies a person also knows how billing works, when a location model carries pricing rules, or when a workspace decides which orders are allowed. None of those decisions look reckless in isolation. They are usually made to deliver a feature quickly. The problem emerges when the next feature has to preserve all of those assumptions.
The phrase matters because it distinguishes this condition from ordinary code cleanup. A confusing function can be rewritten. Service Design Debt is a boundary problem: the system has assigned one concern authority over another concern it does not actually own. The result is not just harder code. It is a product that charges a custom implementation fee in engineering time every time the business changes.
Teams often notice the symptom before they can name the structure. A new account requires an engineer to alter a rule that should have been a setting. A new workspace needs a special branch in order flow. A pricing adjustment has to touch identity code. A request that sounds local moves through several parts of the application because no one part can make the change safely on its own.
How it compounds
The cost of the next change rises instead of falling.
A healthy platform makes a repeated business action less expensive over time. Once the product can add a company, create a workspace, or install a capability through configuration, the next instance reuses a known path. Service Design Debt reverses that curve. Each prior exception becomes a condition that a new exception must accommodate. The team is no longer extending a system; it is negotiating with a history of hidden dependencies.
This is why the debt appears in onboarding as much as in feature planning. The effort to add the next company or workspace grows because the business boundary is not represented cleanly in the software. Support has to remember which account behaves differently. Product has to narrow requests around what the system can tolerate. Engineering spends planning time discovering where a seemingly simple change will leak into unrelated behavior. The implementation cost is only one part of the bill.
The hidden cost is optionality. When a product cannot add a new operating model without changing core logic, leaders become careful about promises they should be able to make with confidence. That caution may be reasonable in the moment, but it is not a market constraint. It is an architecture constraint.
The pattern is especially costly when the system has to serve more than one way of working. A team may initially add a flag for a special approval path, a separate field for a regional process, or a one-off status for a new service line. With no clear owner for those decisions, the exceptions collect in the same central flows. The next expansion has to interpret every prior flag correctly. A useful platform model does the opposite: it makes the scope, policy, and service responsible for their own decisions so a new variation can be added without rereading the history of every old variation.
The architectural cause
Coupling gives the wrong part of the system authority.
Coupling is unavoidable; a running product has connected parts. The question is whether those connections have clear contracts. In a tightly coupled system, a module reads another module’s records directly, reaches into another module’s lifecycle, or carries rules that should belong somewhere else. A change can appear to work while quietly expanding the number of places that must change next time.
The sovereign alternative starts with explicit ownership. The four layers are Users, Companies, Workspaces, and Modules. Users own identity and access context. Companies own the business boundary. Workspaces provide named scope inside a Company. Modules own the service behavior they provide. The layers compose, but they do not become one shared bucket of state and rules.
That distinction makes it possible to ask a direct question about every new requirement: which concern owns this decision? If a pricing rule belongs to a pricing module, identity should not need to know it. If an order belongs to an orders module, a workspace can define its scope without becoming the place that implements order behavior. The answer is not a diagram for its own sake. It is the boundary that keeps a local change local.
What changes in practice
Make the repeated path configuration, not a rewrite.
Reducing Service Design Debt does not require freezing the legacy product while a replacement is built. It requires identifying the next boundary worth making explicit. A team can put a new service behind a defined API, give it ownership of its data and lifecycle, and let it work beside the existing system. The first module does not erase every dependency. It proves that the next one does not have to inherit them.
The discipline is simple to state and demanding to apply. Do not let a module reach into another module’s internals because the shortcut is available. Do not encode a new company’s operating model as a permanent branch when the product needs a configuration model. Do not make a workspace responsible for behavior that belongs to a business service. Each decision protects the cost of the next decision.
Service Design Debt is therefore not an abstract warning about technical quality. It is a way to see whether the software is becoming a reusable service platform or a collection of increasingly expensive exceptions. The difference is visible in the next change: does the team configure an existing boundary, or rebuild an old one?
That makes service design a leadership concern as well as an engineering concern. The decisions that look like delivery tradeoffs eventually become decisions about product range, operational flexibility, and how much attention every new commitment will consume. Naming the debt gives a team permission to address the boundary before the exception becomes the architecture.
Inspect the boundaries before you rebuild them.
The open framework documents the model and provides a working reference portal to examine in code.