Est.

Backend Infrastructure Choices That Scale From Ten Users to Ten Thousand Without a Rewrite

Start with PostgreSQL and a modular monolith your team knows.

· 9 min read
Early-Stage Tech Strategy · October 22, 2026 · 9 min read · 1,974 words

For a pre-seed startup, backend infrastructure that scales from ten users to ten thousand starts with a modular monolith, PostgreSQL, and a stack the team already knows. To avoid a rewrite, it matters less how advanced the architecture is than whether the team solves database constraints first and adds complexity only when traffic shows it is needed. Managed infrastructure and disciplined migrations let that foundation adapt without a ground-up rebuild.

Why the rewrite happens and what actually causes it

Founders make their hardest-to-reverse infrastructure decisions when they know least about their product. The workload is still emerging, the hiring plan is uncertain, and the features that will attract users may not yet exist. Yet the architecture is often built as if all three are already known. The commitment arrives before the knowledge does. Its costs can compound quietly over the following year or more before they become visible.

The failure is usually a timing mismatch. A stack selected for the company the founders intend to become can obstruct the company they are running today. Hiring gets harder, features take longer, performance degrades, and the room to pivot narrows. None of this is obvious on day one. Treating scale as a synonym for complexity makes the mismatch worse, because overbuilding feels like preparation even when it creates immediate work without answering an immediate need.

Steve Johnson, a hands-on senior engineer who embeds with early-stage startups, has watched this pattern unfold repeatedly. Founders lock in infrastructure choices, accumulate friction for months, and only then recognize the cost. The alternative is to choose a foundation flexible enough to change as the product becomes clearer, so that pre-seed assumptions do not harden into refactoring crises at a later funding stage.

Why database scaling is the wall most backends hit first

Most backends encounter their first real scaling constraint in the database. Indexing, caching, and read replicas typically provide more room for growth than rewriting application logic. That changes where early design attention belongs. Framework debates should not crowd out database architecture, because poor indexing or insufficient read capacity can become a constraint while the application layer remains adequate.

PostgreSQL is the near-universal default for SaaS because it combines ACID compliance, relational guarantees, and support for very large row counts. Its JSON columns give the product document-style flexibility where it needs it. MongoDB offers schemaless flexibility, but as a product’s schema stabilizes, that choice can introduce data-consistency problems and migration complexity that PostgreSQL’s JSON support helps avoid.

The same consolidation applies to many AI-adjacent products. PostgreSQL’s pgvector extension supports vector data in the database that already holds relational data, removing the need for a separate vector store for many products up to very large embedding counts. The benefit is one fewer dependency to operate. With caching where it is needed and read replicas, this foundation can often grow beyond a million users without changes to application code, though how much it can handle still depends on the workload.

For an embedded senior engineer such as Steve Johnson, database architecture and indexing strategy are therefore a first line of defense against expensive rebuilding. The database choice compounds faster than an application-layer preference. In practice, the preventive move is to add Redis caching and a CDN before database pressure becomes an incident.

The monolith-first principle and what "modular" buys you

A modular monolith gives a small team one deployment unit without requiring the codebase to become one undifferentiated system. Each module owns its data and exposes a defined interface. Those boundaries are the essential architectural investment. They let the team ship through a single application and keep the option to split out services if deployment needs or uneven traffic later call for them.

Microservices solve problems that must first exist. They can make sense when teams need to deploy on their own or when some services need to scale far more than others, but launching a product does not in itself create either need. Every service boundary introduces a network call that can fail. The team then has to run service discovery, contract testing, and a deployment pipeline for each service, which takes engineering time before the startup knows whether separate services will help.

The objection that a monolith will inevitably require a rewrite confuses deployment shape with internal structure. A tightly entangled application may be difficult to separate, but enforced module boundaries make later extraction a controlled refactor. Simplicity means paying for the boundaries now while deferring the distributed machinery until it serves a demonstrated purpose.

This is where hands-on engineering leadership, including Steve Johnson’s early-stage work, has a practical role in enforcing boundaries from the outset. A modular monolith is a long-term asset. To upgrade it later, the team must keep those boundaries in place as it adds features. Without that discipline, the label “modular” does little to reduce the cost of change.

What tech stack should a pre-seed startup use to avoid expensive rewrites later?

The right stack matches the team’s current skills, the product’s workload, and the hiring market for the next engineers. For a two-person founding team, those criteria are more useful than benchmark leadership. Different workloads place pressure in different places. A latency-sensitive API, a compute-heavy data pipeline, an event-driven system, and a model-adjacent product should not be treated as interchangeable problems.

For general SaaS and products focused on creating, reading, updating, and deleting data, Node.js and Python remain strong choices for shipping speed because both have broad library ecosystems and large hiring pools. TypeScript on Node adds type annotations that pay back through fewer runtime bugs, better IDE support, and easier onboarding than plain JavaScript. Familiarity is a legitimate engineering advantage here. A team can focus on how the product works instead of learning a new language at the same time as it learns what customers need.

REST is the default for most early-stage APIs because it is simpler, works well with HTTP caching, and is familiar to developers and tools. GraphQL is a good fit when web, mobile, and third-party clients need the same backend to send data in different shapes. Choosing REST does not mean accepting an architecture that must be replaced as soon as the product succeeds.

For AI-heavy products, Python with FastAPI works well with the Python-first AI and ML ecosystem, has support for asynchronous execution, and writes OpenAPI documentation on its own. LLM calls should be queued through BullMQ or Celery rather than run synchronously inside an API request, with results returned through a webhook or polling. Because LLM API calls are an especially unpredictable cost variable, every AI endpoint should be instrumented and per-user quotas set from day one.

Go fits high-throughput APIs, proxies, and infrastructure-adjacent services that have throughput and a small memory footprint as central requirements. Its trade-off is a smaller hiring pool and a slower route to an initial MVP. Managed platforms address a different decision altogether. Vercel, Supabase, and Railway support most early-stage products without infrastructure management overhead, although cost can become a constraint at very high traffic volumes. Regardless of platform, GitHub Actions provides a low-friction starting point for testing, linting, building, and deployment on every push.

How infrastructure scales incrementally without a rewrite

From an MVP to early traction, roughly zero to a thousand users, the starting infrastructure can remain compact. A single application server, a managed database such as RDS micro-class or equivalent, object storage, and a CDN in front of static assets can be provisioned in an afternoon for well under a hundred dollars a month. Costs for this starting configuration can vary. When it can no longer do the job still depends on the workload.

Authentication, authorization, input validation, logging, and tracing belong in the initial design. These are architectural decisions. They also support the broader discipline of making changes from evidence, because a team cannot respond sensibly to performance degradation it cannot observe.

As traffic grows, the next layer should address the pressure that has actually appeared. Indexing addresses database access problems, Redis caching reduces repeated database work, and read replicas provide additional read capacity. Queues move slow AI tasks out of the request path. Each addition preserves the application foundation instead of requiring a replacement, and none needs to arrive merely because the startup has reached a particular funding stage.

This sequence distinguishes delaying complexity from delaying preparation. A CDN can be present from the start, while caching and read replicas arrive as the workload warrants them. The application can remain a modular monolith throughout. User count is part of the picture, but measurements of database pressure and how requests behave give a team better grounds for change than an architecture plan based on how much it expects to grow.

Data migrations that don't require downtime or a rollback prayer

Most migration outages result from rushed cutovers, untested rollbacks, or schema changes that lock a busy table. They do not establish that the underlying stack was wrong. Procedure is the controlling variable in these operations. A durable backend needs a way to change its data structures while the application continues serving users, rather than allowing schema debt to accumulate until a forced migration becomes a crisis.

The expand-and-contract pattern separates a migration into stages. First, the team introduces the new schema without removing the old one. It then keeps both synchronized while the application transitions, and removes the deprecated schema only after all traffic has moved. Compatibility is preserved during the transition rather than entrusted to one cutover. This keeps the database and application deployable and rollback-capable while the migration is in progress.

Moving existing data requires its own discipline. A backfill should run as a throttled, resumable background job using smaller UPDATE statements. Batches with short pauses limit the work imposed at once, while tracking the last processed key gives the job a place to resume. The job must also be idempotent. If it crashes and restarts, processing the same data again must not double-apply the change.

PostgreSQL supports adding columns without volatile defaults instantly, and indexes can be built with CREATE INDEX CONCURRENTLY so writes are not blocked during the build. These mechanisms avoid making ordinary schema work unnecessarily disruptive. Before cutover, byte-identical parity verification must establish that the new schema’s data matches the source. Correctness cannot simply be assumed from a completed backfill.

Where a fractional CTO changes the outcome of these decisions

Teams often make their most expensive early infrastructure mistakes even when they know the best practices. What is missing is an experienced senior voice when the decision must be made. Knowledge alone does not settle competing pressures. Under delivery deadlines or investor scrutiny, a team may still choose visible architectural sophistication over the less dramatic work of keeping the system simple and adaptable.

A fractional CTO’s contribution is therefore judgment and enforcement. Staying on a managed monolith instead of building Kubernetes clusters can save months of DevOps work and significant burn before there is evidence that the machinery is needed. A good engagement begins with a written technical assessment. It connects the current stack to what the product needs to do over the next year or more and identifies which choices support that work without a rewrite.

Early-stage scope concentrates on keeping the stack simple enough to move quickly, hiring the first engineers in the right sequence, and supporting credible investor technical due diligence. The fractional model has a boundary of its own. When technical decisions become a daily strategic function, and the organization needs someone to manage managers, run sprint planning, and handle performance reviews full-time, a full-time hire becomes appropriate.

Database-first scaling, modular boundaries, staged infrastructure, and safe migrations are principles that are easy to grasp. Applying them under pressure is the harder task. The fractional CTO’s actual contribution is to distinguish the complexity that growth now requires from the complexity a young company can still afford to postpone.

More in Early-Stage Tech Strategy