Key Takeaways
The architecture at product-market fit is not the architecture at scale: The system optimized for a small team and an evolving domain stops being the right fit somewhere between the tenth and the fiftieth engineer, and the cost of not noticing is two to three times the headcount needed to deliver the same roadmap.
The two failure modes are premature distribution and the accidental monolith: Spinning up fifteen microservices for five engineers and five thousand users creates a distributed monolith. Letting a single codebase grow untouched past fifty engineers creates an untouchable one. Both problems have the same root cause: architecture treated as a one-time decision rather than an evolving constraint.
The 2026 default is a modular monolith, not microservices: A single deployable artifact with strict internal boundaries, enforced by tooling rather than discipline, gives most of the organizational benefits of distributed systems without the operational cost. The boundary that matters is the domain boundary, not the deployment boundary.
Service extraction follows signals, not trends: A specific module with a fundamentally different scaling profile, a different deployment cadence and owning team, a regulatory or technical isolation need, or a different runtime is a real signal. "We might want to scale this independently someday" and "microservices are the modern way" are not signals. They are anxieties.
The architecture that gets a product to market is almost never the architecture that gets it to scale. Most founding teams know this in theory, and almost all of them get caught out by it in practice. The version that ships at product-market fit was optimized for one set of constraints: a small team, an evolving domain, the need to learn faster than competitors. By the time the company is hiring its tenth engineer or its twentieth, the constraints have changed. The architecture is still optimized for the previous problem. Scaling a high-growth product is, more than anything else, the work of noticing that the constraints have moved and rebuilding the system to match. The teams that do this well end up shipping more, spending less per unit of working software, and recovering from incidents faster than their competitors. These teams don't end up running two or three times the headcount to deliver the same roadmap.
The Two Failure Modes High-Growth Products Hit
When a product organization gets the architecture wrong during growth, it almost always fails in one of two recognizable ways.
The first is the premature distribution trap. A team six months past launch reads about microservices, watches the conference talks, and decides this is the modern way to build software. They spin up fifteen services for a product that has five engineers and five thousand users. Each service has its own deployment pipeline, its own database, and its own on-call rotation. None of them genuinely needs to scale independently of the others. Six months later, the engineering team is spending most of its time on infrastructure and service-mesh debugging instead of features. Customer-facing velocity has dropped to a crawl. The architecture is "modern." It is also the wrong architecture for the problem the company actually has.
The second failure mode is the opposite shape but the same root cause. A team that started with a monolith and never reorganized it ends up with what amounts to a single, untouchable codebase by the time it crosses fifty engineers. Every change risks breaking something unrelated. Build times stretch into double digits. Deployments are big, infrequent, and political. The team starts breaking the monolith into services in a panic, and because the internal boundaries were never clean, they end up with a distributed monolith: all the operational complexity of microservices and none of the benefits, because the services still share databases and call each other synchronously for every meaningful operation. This is the failure mode Martin Fowler coined a name for years ago, and it is still the most common architecture pathology in growth-stage companies.
The teams that avoid both failure modes treat architecture as something that evolves with the constraints, not as a one-time decision that gets locked in early. That sounds obvious. The reason it is hard in practice is that the constraints change slowly enough that no single quarter feels like the right one to rebuild.
What Scalable Architecture Actually Means in 2026

The industry consensus on this question has moved noticeably in the last few years. By 2023, the "microservices by default" assumption that dominated the late 2010s started to break down publicly: Amazon Prime Video documented a 90% cost reduction by consolidating a microservices video-monitoring pipeline into a single deployable service. Shopify started talking openly about its modular monolith approach to its commerce platform, and a steady stream of scale-up engineering teams published post-mortems on the cost of premature distribution. By 2026, the CNCF Annual Survey reports that around 42% of organizations that had adopted microservices have consolidated some of those services back into larger units, and the term "modular monolith" has become the de facto vocabulary for what most growing teams should actually be building.
A modular monolith is a single deployable artifact with strict internal boundaries. Each module owns its data, exposes a defined interface, and hides its internals. Cross-module calls go through the interface, not through shared database tables or shared in-memory state. Tools like Spring Modulith, ArchUnit, and dependency-cruiser let teams enforce those boundaries as part of the build, so violations show up as failed CI runs instead of as architectural drift that nobody notices until two years later. The result is most of the organizational benefits of microservices (clear ownership, defined interfaces, independent development inside each module) without the operational cost of running a distributed system you weren't ready for.
The deeper point under all of this is that the boundary that matters is the domain boundary, not the deployment boundary. Eric Evans's domain-driven design, which has been around for two decades, keeps coming back into the conversation because the teams that get scaling right are the ones who invest in finding their bounded contexts before they decide how to deploy them. Once the bounded contexts are clean inside a single artifact, extracting one of them into a separate service later becomes a surgical refactor rather than a high-risk rewrite. Once the bounded contexts are tangled, no deployment strategy in the world will save the architecture.
The Signals That Tell You to Evolve
The question that comes up next is when, exactly, a team should extract a module into its own service. Most growing organizations get this wrong by extracting too early, but a handful get it wrong by waiting too long. The honest answer is that there are concrete signals that tell you the time has come, and architecture decisions should follow those signals rather than the trend cycle.
- A specific module has a fundamentally different scaling profile. A notification system that spikes to millions of events per second sitting in the same artifact as a billing module that handles a few hundred requests per day creates real waste, because every instance of the monolith has to be sized for the peak workload of the noisiest module. When the scaling profiles diverge by an order of magnitude, extraction makes sense.
- A specific module has a different deployment cadence and a team that owns it. If a module is being touched by a team that wants to deploy several times a day, and the rest of the monolith is on a weekly release cadence, the shared deployment is starting to constrain throughput. This is one of the cleanest extraction signals because it shows up directly in delivery metrics.
- A specific module has a regulatory, security, or technical requirement that makes physical separation easier than logical. Payments, PII handling, and certain compliance domains often fall into this category. The compliance case for separation tends to be much stronger than the engineering case, and that is fine.
- A specific module needs a fundamentally different runtime. A machine-learning inference workload that wants GPUs, or a low-latency module that wants a different language stack, will usually justify its own service whether the company is ready for distributed systems or not.
If none of those signals are present, the case for extracting a service is usually weaker than the case for letting the module mature inside the monolith. "We might want to scale this independently someday" and "microservices are the modern way" are not signals. They are anxieties.

The Operational Layer Most Architecture Decisions Ignore
The other shift in how scalable architecture is talked about in 2026 is the focus on unit economics. It used to be enough to know how the system performed at peak load. Increasingly, what matters is how the system performs per active user, per API call, per feature, and per inference, because those numbers determine whether the gross margin holds up as the product grows. Most engineering organizations still report aggregate cloud spend and call it FinOps. The teams pulling ahead are measuring cost per customer and cost per feature, instrumenting tenant identifiers into request paths, and using that data to make architecture decisions that the cost dashboards used to obscure.
Two other operational concerns belong in the same conversation. Observability has to be a first-class part of the architecture, not a Datadog dashboard bolted on at the end. Distributed tracing, structured logs, and golden-signal metrics are part of the build, not a phase-two investment. And capacity planning has to be tied to the workload signal that actually matters, which is rarely CPU utilization and almost always something closer to queue depth, request rate, or business-event volume. Architectures that scale gracefully are ones where the bottleneck always becomes visible before it becomes a customer-facing problem.
Ciklum's cloud and DevOps engineering teams have worked with high-growth organizations through exactly this layer of the work, because the operational maturity is what determines whether the architecture pays off in business metrics or only on paper.
How High-Growth Companies Get the Sequence Right
The teams that scale their architecture without burning two years of velocity tend to follow a recognizable sequence. Most of it is about doing the cheap, unglamorous work before the expensive, irreversible work.
They invest in domain discovery before deployment topology. Bounded contexts get drawn first, usually through a few rounds of event storming or domain modeling with the engineers who actually own the work. Module boundaries inside the monolith come next. Service boundaries, if they happen at all, come last and only on the modules with real signals.
They enforce module boundaries with tooling rather than discipline. Architectural fitness functions check, on every build, that modules talk to each other only through their declared interfaces and that no module reaches into another's data store. The cost of writing these checks is low. The cost of not writing them is the slow drift back into a tangled monolith that nobody can refactor.
They extract using the Strangler Fig pattern when extraction makes sense. A facade routes incoming traffic, and individual capabilities migrate behind that facade one at a time, while the monolith continues to serve the rest. This is the migration pattern that has the highest success rate, because it lets the team learn the operational reality of running a service before betting the whole architecture on a big-bang rewrite.
They invest in the platform layer once they actually have multiple services. Shared CI/CD, golden paths, internal developer platforms, a consistent observability story across services. None of this is needed in the first phase. All of it is needed once the company crosses the threshold where coordination becomes the dominant cost. Ciklum's product engineering teams work with high-growth organizations through this transition all the time, and the operating shift consistently shows up in delivery economics within a quarter or two.
That sequence shows up clearly in the engagement with a multinational payment card services corporation, where a series of acquired open-banking platforms were consolidated behind a single 200+ API layer, autonomous squads scaled from 15 to nearly 60 engineers across Poland and Spain, and the consolidated platform reached full PSD2 compliance across 16 EU states without rewriting the underlying systems. The architecture became the leverage point that let the engineering organization grow without losing the deployment economics, which is the outcome shape the sequence is designed to produce.
And they tie architecture choices to business metrics. Gross margin per customer, deployment frequency, time to restore service, lead time for changes. The teams that scale gracefully are the ones for whom architecture conversations and business conversations stop being separate.
What Scalable Looks Like When It Works
The signature of a well-evolved architecture is not the technology stack on it. It is what the engineering organization is able to do without thinking. Releases ship multiple times a day, in small batches, and the change failure rate stays flat. Capacity scales linearly with demand, without anyone running an emergency project to add it. New engineers reach productive contribution in weeks because the module boundaries make the system legible. Incidents stay scoped to the module that owns the problem. Cost per customer trends down as the product grows, not up. The roadmap stops slipping by default, because the architecture is no longer the bottleneck under the schedule.
That signature is most visible in long-running engineering partnerships. Ciklum's decade of embedded work with eToro is a good example: around 55 specialists across roughly 14 teams cover seven domains from compliance and trading to KYC, money movement, and exchanges, contributing alongside a 500-plus-person internal R&D organization on shared delivery, standards, and accountability. The architecture and the operating model evolved together as the platform scaled to 40 million users worldwide, which is the version of this work that produces durable results rather than one-off wins.
None of that requires a heroic rewrite. Most of it requires noticing the constraints early, choosing the architecture that matches the current constraints honestly, and being willing to evolve the architecture as the constraints change. That sounds simple. Doing it consistently, in a growing company with a roadmap full of customer commitments, is the actual engineering discipline.
Frequently Asked Questions
1. When should a high-growth product move off a monolith?
Often later than you’d expect. Reliable signals are: ongoing organizational friction (teams blocked by shared deployment cycles) or a module with a clearly different scaling or runtime profile. Team size is helpful as a guide:
- Under 10 engineers: stick with a single artifact.
- 10–50 engineers: use a modular monolith.
- Above 50 engineers: you may need to extract some services.
These aren’t hard rules, but much better than defaulting to microservices just because it’s trendy.
2. What's the difference between a monolith, a modular monolith, and microservices?
A monolith is a single deployable with no enforced boundaries where modules share data and call each other freely. A modular monolith is still a single deployable, but with clear internal module boundaries, private data, and automated tooling to prevent violations. Microservices are multiple independently deployable services that talk over the network. Modular monoliths are the practical default for most growing teams, providing microservices’ main organizational benefits without the complexity.
3. How do we avoid ending up with a distributed monolith?
Distributed monoliths usually result from splitting technical layers or reusing a shared database across services. To avoid this, consider the following solutions:
- Decompose by business domains.
- Ensure each service owns its own data.
- Favor asynchronous communication.
- Avoid shared libraries.
- If two services must always deploy together, merge them into one service as the correct fix.
4. Where does external engineering support add the most value during architecture evolution?
- Domain discovery and boundary setting: Providing an objective perspective to resolve debates faster, particularly when multiple teams share data.
- Platform engineering: Transferring proven patterns to accelerate the build by years, providing necessary bandwidth that internal teams often lack while shipping features.
Blogs