Technology

Why Microservices Are Wrong for Most Small SaaS Products

You do not need twelve services, a message queue and a service mesh to serve 500 customers. You need a monolith and a good deployment pipeline.

Why Microservices Are Wrong for Most Small SaaS Products

Microservices architecture is one of those ideas that sounds brilliant in a conference talk and becomes a nightmare in a two person team. I have built four SaaS products from scratch. Every single one started as a monolith. The ones that succeeded stayed that way for years. The one time I tried to go microservices early, I wasted three months of development time solving infrastructure problems that had nothing to do with my actual product.

Let me be blunt about this: if you are building a small SaaS product with a team of fewer than ten developers, microservices are almost certainly the wrong architecture. Not because they are bad technology. Because they solve problems you do not have yet, while creating problems you cannot afford to deal with.

The problem microservices actually solve

Microservices exist because Netflix, Amazon and Google hit scaling problems that monolithic applications genuinely cannot handle. When you have thousands of engineers working on the same product, a monolith becomes a coordination nightmare. Deployments take hours. One team's change breaks another team's feature. The codebase becomes so large that nobody understands the whole thing.

At that scale, splitting the system into independent services makes perfect sense. Each team owns their service. They deploy independently. They scale independently. The organisational benefit is enormous.

But here is the thing. You are not Netflix. You are not Amazon. You have three developers and 200 customers and you are trying to ship features fast enough to survive. The problems that microservices solve do not exist in your world. What exists in your world is the need to move quickly, keep operational costs low, and debug issues without needing a distributed tracing PhD.

What microservices actually cost a small team

Let me walk you through what happens when a small SaaS team decides to "do microservices properly" because they read about it on a tech blog or their newest hire came from a big company.

Infrastructure complexity explodes

Instead of one application to deploy, you now have six. Each needs its own CI/CD pipeline. Each needs monitoring. Each needs health checks. Each needs its own database or at least its own schema. You need service discovery. You probably need an API gateway. You definitely need a way to handle inter service communication, whether that is REST, gRPC, or message queues.

On a team of three, someone has to maintain all of this. That someone was supposed to be building features. Now they are debugging why Service B cannot reach Service D and it turns out the Kubernetes pod got evicted because you forgot to set memory limits. Congratulations, you have just spent two days on a problem that does not exist in a monolith.

Development speed collapses

In a monolith, adding a feature that touches the user system and the billing system is a single pull request. In microservices land, it is three pull requests across three repositories, a contract change between services, and a coordinated deployment. A feature that would have taken two days now takes a week because of the ceremony around it.

When I was building CampSuite, we needed to add a feature where a booking confirmation would trigger an inventory update and send a notification. In our monolith, that was a single method call chain. Done in an afternoon. In a microservices architecture, that would have been an event published to a queue, consumed by an inventory service, with a separate notification service listening for the same event. Three services to coordinate. Error handling across service boundaries. Eventual consistency to worry about. For a feature that took us four hours.

Debugging becomes archaeological

A customer reports something weird. In a monolith, you look at the logs, find the request, trace it through the code. Ten minutes to understand what happened. In microservices, that same request has bounced through four services. You need correlated logging. You need distributed tracing. You need to piece together what happened across multiple log streams with different timestamps and formats.

I have seen teams spend more time on observability tooling than on their actual product. When your tool stack for understanding your system is more complex than the system itself, something has gone badly wrong.

When a monolith actually falls over

The common fear is that monoliths cannot scale. This is largely nonsense for small SaaS products. A well written .NET or Node.js monolith running on a single decent server can handle thousands of concurrent users without breaking a sweat. Add a CDN, some caching, and a managed database and you are looking at tens of thousands of users before you need to think seriously about architecture changes.

The point at which a monolith genuinely struggles is usually one of these:

You have one component that needs radically different scaling characteristics. Your core app handles 100 requests per second but your report generation hammers the CPU for minutes at a time. Fair enough, split that out. But that is extracting one service, not rebuilding everything as microservices.

Your team has grown past 15 to 20 developers and deployment coordination is genuinely painful. At that point, splitting along team boundaries makes sense. But if you have reached 20 developers, your SaaS product is already successful and you can afford to do the migration properly.

You have a genuine need for different technology stacks in different parts of the system. Maybe your core app is .NET but your machine learning pipeline needs Python. Fine, that is a valid reason for a separate service. But again, that is one targeted split, not a wholesale architectural change.

What to do instead

Build a well structured monolith. I know that sounds boring. Good. Boring technology makes money. Here is what that looks like in practice.

Modular monolith architecture

Structure your code into clear modules with defined boundaries. Your billing code lives in one folder with its own models, services and interfaces. Your user management lives in another. They communicate through defined interfaces, not by reaching into each other's databases or calling internal methods directly.

This gives you most of the organisational benefits of microservices without any of the infrastructure cost. If you ever do need to extract a service later, you already have clean boundaries to cut along. But you probably never will, and that is fine.

Invest in deployment instead

The thing that actually makes small teams fast is not architecture. It is deployment confidence. If you can push to production ten times a day without fear, your architecture matters far less than you think. Invest in automated tests, a proper CI/CD pipeline, feature flags, and zero downtime deployments. That gives you speed. Microservices give you complexity.

When I wrote about choosing a tech stack for SaaS, the same principle applied. Pick boring technology that lets you move fast. The exciting stuff can wait until you have customers who are paying enough to justify the engineering time.

Extract only when forced

If you do hit a genuine scaling bottleneck, extract the specific component that needs it. Do not rebuild the whole system. Background job processing is often the first thing worth splitting out. Maybe file processing or report generation. These are targeted extractions that solve real problems.

The key is to let the pain guide you. If something is genuinely causing problems, fix it. If it is working fine as part of your monolith, leave it alone. Premature extraction is just premature optimisation wearing a different hat.

The real reason people choose microservices too early

I am going to be honest about this. Most of the time, the decision to use microservices in a small team is not driven by technical requirements. It is driven by one of two things: either someone wants to put it on their CV, or someone is afraid of making a decision they cannot reverse.

The CV motivation is understandable but actively harmful to your business. Your architecture should serve your customers and your team, not someone's career development goals. If a developer wants microservices experience, they can get it at a company that actually needs microservices.

The fear of irreversibility is more sympathetic but equally misguided. A well structured monolith is not a dead end. It is a starting point that you can evolve. The path from monolith to services is well trodden and manageable. The path from premature microservices back to sanity is much harder because you have built all this infrastructure that nobody wants to throw away even though it is costing you every day.

The bottom line

If you are a small team building a SaaS product, start with a monolith. Not because monoliths are always better, but because they are better for where you are right now. They let you move fast, keep costs low, debug quickly, and focus on the thing that actually matters: building something customers will pay for.

You can always add complexity later when you have the revenue and team size to justify it. You cannot easily remove complexity once it is baked into your infrastructure. Start simple. Ship fast. Refactor when you have real problems, not imaginary ones.

If you are staring at architecture decisions for a new SaaS product and feel paralysed by the options, that is exactly the kind of thing I help with in my consulting work. Sometimes an outside perspective from someone who has made these choices multiple times is worth more than another week of reading blog posts and watching conference talks.

More from the blog

Technology8 min read

Technical Debt Is Not the Enemy: A Practical Guide for Small Teams

Read more
Technology8 min read

Choosing a Tech Stack for Your SaaS: A No Nonsense Guide

Read more
Business9 min read

Why Every Developer Should Start a Business at Least Once

Read more