There is a specific failure we see over and over in early-stage product work: a team spends five months building an MVP that could handle a million users, launches it to forty, and discovers that those forty wanted something else entirely. The architecture was never the problem. The sequencing was.
The word "scale" does a lot of unhelpful work in these conversations. It usually gets read as "handle traffic," which for a pre-launch product is almost never the binding constraint. The more useful reading is "absorb change." Your first version is a hypothesis, and most hypotheses are wrong in ways you cannot predict from a whiteboard. An MVP that scales is one you can rewrite in pieces after the market tells you which pieces were wrong.
The failure mode is demand, not throughput
CB Insights has run a post-mortem analysis of failed startups for over a decade, asking founders and investors what actually killed the company. The pattern is stable across every version of the study: the top cause is building something nobody sufficiently wanted.
Share of failures citing this factor (multiple causes per company)
Source: CB Insights, “The Top 12 Reasons Startups Fail,” based on founder and investor post-mortems. Companies typically cite more than one cause, so shares do not total 100%.
Read that chart as a budget allocation problem. If four in ten failures trace back to demand, then the scarcest resource in your first six months is not compute or database throughput. It is the number of times you get to put something in front of a real user and be told you were wrong. Every week of engineering spent on infrastructure you do not yet need is a week you did not spend buying one of those answers.
Sort every decision by reversal cost
The practical question is not "is this good architecture" but "what does it cost me to change my mind about this in nine months." Most technical decisions are cheap to reverse and get treated as though they are expensive. A handful are genuinely expensive and get made casually in the first week, usually by whoever set up the repo.
| Decision | Cost to reverse later | What to do now |
|---|---|---|
| Data model and identifiers | High. Migrating live customer data means downtime, backfills, and a window where both shapes must work. | Spend real time here. Use stable opaque IDs, avoid encoding business meaning into keys, and keep a migrations discipline from commit one. |
| Auth and tenancy model | High. Retrofitting multi-tenancy or SSO into a single-user assumption touches every query you have written. | Decide single-tenant vs multi-tenant deliberately, even if you only have one customer. Use a managed provider rather than rolling your own. |
| Third-party lock-in at the core | High. If your domain logic is written inside a vendor’s primitives, leaving means a rewrite. | Keep vendor calls behind a thin interface of your own. Not a full abstraction layer, just a seam. |
| Public API and URL structure | Medium. External consumers and search engines both hold references you cannot recall. | Version from the start and pick URLs you can live with. Redirects are cheap; broken integrations are not. |
| UI framework and component structure | Low. Screens get rewritten constantly and nobody outside notices. | Pick the boring option your team knows and move on. Do not design a component library yet. |
| Caching, queues, sharding, microservices | Low, because you can add them when a measurement demands it. | Skip entirely until you have production numbers proving a bottleneck. Premature distribution is the most expensive form of "scalable." |
The row that surprises people is the last one. Splitting a product into services before you understand its seams does not buy scalability, it buys a distributed version of a design you have not validated. You inherit network calls, partial failures, and deployment coordination in exchange for flexibility you cannot yet use. Start as a well-organized single deployable and let real load draw the boundaries.
Instrument before you optimize
The one piece of "infrastructure" worth building on day one is the ability to see what is happening. Not a full observability stack, but enough that when a user tells you the app is slow, you can answer whether that is true and where.
- Structured logs with a request ID that follows a call end to end. Grepping unstructured text stops working at roughly week three.
- One error tracker wired into both client and server, with releases tagged so you can tell whether a spike started with a deploy.
- Product analytics on the four or five events that define activation for your product, not every click. See smarter analytics for small teams for how to choose those events.
- Real user performance data rather than lab scores, since lab numbers hide the slow devices and networks your actual customers use.
That last point matters more than it sounds. Google evaluates Core Web Vitals at the 75th percentile of real visits, meaning three quarters of your users need a good experience for a page to pass. The thresholds are 2.5 seconds for Largest Contentful Paint, 200 milliseconds for Interaction to Next Paint, and 0.1 for Cumulative Layout Shift. A synthetic test on your laptop will pass all three long after your customers on mid-range Android phones have stopped waiting. We cover the specific fixes in Next.js performance optimization.
Take debt on purpose, and write it down
Shipping fast means taking shortcuts. The distinction that matters is between debt you chose and debt you accumulated. Chosen debt has a note attached explaining what you skipped, what would trigger fixing it, and roughly what the fix costs. Accumulated debt is discovered eighteen months later by someone who has to reverse-engineer why a function is shaped that way.
We keep this as a plain markdown file in the repo, one entry per shortcut, with a trigger condition. "No background job queue; sending email inline in the request. Revisit when send volume exceeds ~50 per minute or p95 request time crosses 800ms." That single line turns a landmine into a scheduled decision, and it means the person who inherits the code knows the tradeoff was deliberate.
Make it work, make it right, make it fast. In that order.
The ordering is the whole point, and it is the part teams skip. "Make it right" before you know whether it works is speculation dressed up as craft.
A reasonable first-version checklist
- Write down the single user outcome the product must produce, in one sentence, before opening an editor.
- Identify the smallest path that produces that outcome for one real person, even if steps behind the scenes are manual.
- Ship it to people who can say no to you. Friends and colleagues cannot.
- Instrument activation, error rates, and real-user performance from the first deploy.
- Keep type safety and a handful of tests around money, auth, and data writes. Skip broad coverage of screens that will change.
- Log every deliberate shortcut with its trigger condition.
- Revisit architecture only when a measurement, not an intuition, says to.
Key takeaways
- Roughly 42% of startup failures trace to no market need, so demand validation, not throughput, is the constraint to design around.
- Sort decisions by reversal cost: data model, auth, and vendor coupling deserve real thought; UI structure and service boundaries do not.
- Distributing a system before you understand its seams adds cost without adding validated flexibility.
- Instrument on day one so later optimization is driven by measurement rather than intuition.
- Record technical debt with an explicit trigger for when to pay it down.
Related reading
Sources
- The Top 12 Reasons Startups Fail, CB Insights
- Web Vitals: thresholds and the 75th percentile, Google web.dev
- How the Core Web Vitals metrics thresholds were defined, Google web.dev
- Product
- Strategy
- Engineering

Written by
Valon BadivukuDigital Strategist
Valon Badivuku is a Digital Strategist at ThisCom, helping brands get seen and become visible online through strategies that turn attention into lasting growth.
All articles by Valon Badivuku →


