How I’d start a company now: the mistakes that actually killed the last one

Andre Okonkwo

Andre Okonkwo

September 18, 2026

How I’d start a company now: the mistakes that actually killed the last one

The last company did not die from a bad idea. The idea was fine: a B2B API that turned messy vendor CSVs into a clean invoice object other tools could POST. Customers paid. Then we ran out of time in a way that looked like we had been busy. I would start again. I would not start the same way. Here is the autopsy I actually use, and the sequence I would run if I opened a repo on Monday.

I have shipped two products as the whole engineering team and sold one of them. I have also been the person who hired too early, priced like a consultant, and treated Stripe as a detail. This is not a manifesto. It is a list of mistakes that had invoices attached.

What actually killed it

We built a second product before the first one had a boring renewal. A design partner asked for “just a dashboard.” The dashboard became a React app, then a permissions model, then a second on-call. The API that paid rent got the leftovers. I would not start a UI company inside an API company again unless the UI was the product. A partner asking for a screen is not a strategy. It is a support ticket with a Figma file.

We hired a “full-stack” person when the constraint was me talking to customers. Two engineers did not double throughput. They doubled the number of things that needed a decision I had not written down. Theory of Constraints is rude when you are the founder: extra hands in front of a gate make a bigger pile. I would hire a part-time support person who can close Zendesk before I hire a second engineer. I have the burn chart.

We priced per-seat because every SaaS blog did. The buyer was a finance ops lead who wanted a pipe, not seats. We left money on the table and trained them to invite fewer people. I would price the pipe: volume of invoices, or a platform fee plus overage, with a number I can explain on a pricing page without a call. If I cannot explain it, it is not a price. It is a negotiation hobby.

We treated deliverability and webhooks as week-twelve work. A missed Stripe invoice.paid and a “welcome” email that never left SendGrid taught a customer we were sloppy. They were right. I would put the webhook table and the idempotency key in the first week, even if the homepage is ugly. Ugly is recoverable. A double charge is a story that outlives the company.

We raised a small friends-and-family round to “go faster” and then optimized for looking fundable. The board (two people, informal) wanted a metric that was not revenue. I spent a month on a usage dashboard for them. I would not take that money again unless I already had a default-alive plan without it. Default-alive is not a tweet. It is a spreadsheet where the worst month still covers the server and my rent.

Founder at a kitchen table with a laptop and a notebook of numbers

What I would do in the first thirty days

Pick a buyer I can name and a job I can finish without a platform. One integration, one object, one “it worked” email. I would still use Rails or a boring Node/Go API — I have started in Rails when I wanted billing and an admin on Friday. I would not start in a mesh of services. I would not start in a new language to feel serious.

Talk to ten people who already pay for a worse version of this. I would not build a landing page first. I would send invoices for a concierge version: I run the CSV by hand, I POST the result, I charge. If they will not pay for the ugly version, they will not pay for the pretty one. I learned that backwards.

Put money on the critical path on day one: Stripe, a webhook controller I can replay from a console, a Billing::ProcessWebhook with an idempotency table. I have written that sentence in other essays because I keep meaning it. The last company treated it as plumbing. Plumbing is the product when you sell an API that moves money-shaped data.

Write the “we do not do this” list. The last company said yes to a custom SFTP pickup, a second file format, and an on-prem whisper. Each yes was a week. I would publish a no-list on the site. Customers who need the no-list items are not my customers. That is a product decision, not a personality.

One deployable. Postgres. A job queue. Sentry or Honeybadger. A restore I have actually run. I would not buy Kubernetes. I would not buy a second cloud “for HA.” I would buy backups I have restored and a status page that is not a lie.

The five errors I would skip on purpose

  1. Building the dashboard they asked for before the API renews. Give them a CSV and a Stripe customer portal. If that is not enough, they are asking me to become a different company.
  2. Hiring to fill loneliness. A cofounder or an engineer to have someone to Slack is the most expensive chat app I have bought. I would use a paid community or a weekly founder call first.
  3. Per-seat pricing for a pipe. Price the job. Seats are for tools people sit in all day.
  4. Treating email and webhooks as later. They are the product’s memory. I would test them like I test refunds.
  5. Raising to postpone the default-alive question. If the round is to avoid a pricing conversation, I would have the conversation instead.

I would still make new mistakes. I would like them to be new.

Small server and a laptop on a tidy desk, one product stack

Stack I would actually open

Rails 8, Postgres, Stripe, Sidekiq or Solid Queue, Hotwire for the admin I cannot avoid, a thin OpenAPI for the customers who want a client. I have argued for this stack when the product is a business web app. I would not start in Next.js plus a BFF plus a queue I invented. I would not start in a clean-architecture folder tree. I would start with a script that takes a file and emits a JSON invoice, then I would wrap the script in HTTP.

Auth: a boring session for the admin, API keys for the pipe, hashed, last-used-at, a revoke button. I would not build a permissions matrix for five customers.

Docs: a single page that a tired integration engineer can finish. I have seen companies ship a docs site as a brand. I would ship five curl examples and a webhook signature note. Elena-style static docs are enough until someone pays for a guide.

I would keep a typed SQL escape hatch for the report that will appear in month two. I would not start with Hibernate and a repository for every noun. I would not start with sqlc as a personality either if Rails is the app. I would write the ugly query when the admin is slow.

What I would refuse to call “traction”

Waitlist numbers. A Product Hunt badge. A design-partner logo on a homepage when the partner has not paid. A usage graph that is me testing. I would call traction: money that is not a favor, a second month, a customer who sent a second file without me asking. Everything else is a costume I have worn.

I would also refuse a “platform” narrative in year one. Platforms are how you justify eight services. A pipe is allowed to be a pipe. If the market wants a platform later, I will notice in the tickets. I will not notice in a deck I wrote to feel larger.

People, on the clock I actually have

I would stay solo until a task repeats that I hate and that a person can own without my brain: support macros, invoice exceptions, a weekly report. I would pay them as a contractor with a written scope. I would not invent a culture deck. I would invent a working agreement of one page: how we ship, how we page, how we refund.

If I take a cofounder, I would want one who already has the customer conversations I skip, not another person who wants to rewrite the queue. Two engineers is how the last company got a second product. An engineer and someone who can sell the pipe is a company. I say that as the engineer who thought selling was a later skill. Selling was the skill. The code was the proof.

I would not hire from a FAANG listing copy. I would hire someone who has shipped a webhook and read a Stripe log. I would pay in cash I have, not in equity stories I cannot explain. Equity for a contractor who will be gone in four months is how you create a ghost on the cap table. I have that ghost. I would not add a second.

The Monday morning version

If I started Monday: a repo, a Stripe test mode, ten conversations, one paid concierge job, no dashboard, no hire, no round. A written no-list. A webhook I can replay. A price that is a pipe. A deploy I can do from a laptop. I would keep the last company’s domain knowledge and throw away its org chart, its second app, and its belief that busy is a strategy.

The idea can stay. The sequence cannot. I know which mistakes killed us because I still have the Linear board and the Stripe payout that arrived after we had already started the dashboard. I would start the company that can survive a month of no new features. That company is smaller and ruder and closer to a product. I would pick it on purpose this time.

More articles for you