By now you have a clear picture of your technology and either a new hire or external support. Time to make the decisions that shape the next two years.
Build vs buy
Every feature request creates this choice. Build it yourself or pay for an existing solution? The default for most engineering teams is to build, because building is more interesting than integrating. But interesting is not the same as smart. We have written a detailed build vs buy framework that covers this decision in depth.
The rule of thumb: If it is not your core differentiator, buy it. Authentication? Use Auth0 or Clerk. Payments? Stripe. Email? SendGrid. Monitoring? Datadog. Your engineering team's time is your most expensive and most limited resource. Spend it on the things that make your product unique, not on reinventing infrastructure that someone else has already perfected.
The exception is when the bought solution creates a dependency that limits your product. If your core value proposition depends on sending emails in a very specific way, maybe you do build your own email pipeline. But be honest about whether that is truly the case.
Monolith vs microservices
I will save you months of debate: start with a monolith. Or rather, keep your monolith. If your current product is a single application, do not break it apart into microservices. Not yet. Probably not for a long time.
Microservices solve a specific problem: they allow large teams (20 or more engineers) to work independently on different parts of a system. If you have fewer than ten engineers, microservices add complexity without any of the benefits. You will spend more time managing inter-service communication, deployment orchestration, and distributed debugging than you will save in development speed.
The companies that successfully run microservices all started with monoliths. They extracted services later, when they had clear reasons to do so and the team size to support it. Follow their path, not their destination.
Tech debt trade-offs
Your technical debt did not disappear when the money landed. But now you have the resources to address it strategically. The key word is "strategically," not "comprehensively."
Categorise your tech debt into three buckets:
Blocking debt
Debt that will prevent you from scaling. A database that cannot handle growth, a deployment process that takes a full day, authentication that is not secure enough for enterprise customers. Fix this now.
Slowing debt
Debt that makes the team slower but does not prevent progress. Messy code in frequently changed areas, missing tests for critical paths, manual processes that could be automated. Address this incrementally, allocating 15 to 20 percent of each sprint to paying it down.
Cosmetic debt
Debt that offends developers but does not affect the business. Inconsistent naming conventions, old libraries that still work, code that is ugly but functional. Ignore this entirely until you have nothing more important to do. You always will.