Choosing Node.js Hosting for a SaaS: What Actually Mattered vs. What I Thought Would
TIL that I picked Render for a Node.js API expecting the deciding factor to be price, and the thing that actually mattered day to day turned out to be deploy simplicity and predictable cold-start behavior.
The Problem #
Choosing where to host a production Node.js API as a solo developer meant weighing a handful of platforms, and I initially framed the decision almost entirely around hosting cost per month — which turned out to be the wrong primary axis for how the decision actually played out afterward.
Context #
This is a small-to-medium API with real users depending on it (dispatchers, drivers), maintained by one person who also has to handle deploys, incident response, and everything else — there's no dedicated ops time to spend fighting infrastructure.
What I Tried #
Compared several providers mostly on price-per-instance-hour and picked the cheapest option that met the basic requirements.
What Went Wrong #
The cheapest option had a deploy process that required more manual steps than I'd accounted for, and its free/cheap tier had cold-start behavior that occasionally meant a driver's first request after idle time hit a multi-second delay — a real UX problem for a time-sensitive delivery app, not just an inconvenience.
The Solution #
Moved to Render specifically for git-push-to-deploy simplicity and more predictable instance behavior, accepting a higher monthly cost in exchange for fewer manual deploy steps and fewer cold-start surprises — a trade-off that's clearly correct for a solo developer's actual constraint (time and attention), even though it looks worse on a pure price comparison.
# render.yaml — deploy is "push to main", not a manual runbook
services:
- type: web
name: delivery-api
env: node
buildCommand: npm install
startCommand: npm startWhy It Works #
For a solo developer, the scarce resource isn't the marginal hosting dollar — it's attention. A hosting choice that removes manual deploy steps and cold-start unpredictability trades money for exactly the thing that's actually constrained, which is the correct trade for this specific situation even though it wouldn't necessarily be for a team with dedicated infrastructure time.
Lessons Learned #
"Cheapest that meets the requirements" isn't the same question as "cheapest given what my actual time is worth as the only person who'll fix it at 11pm." I priced the wrong variable the first time.
What I Would Do Differently #
I'd weight deploy simplicity and operational predictability explicitly against price from the start, instead of defaulting to price as the primary axis and re-deriving the real priorities after hitting friction.
Related Concepts #
Git-based deploy workflows, cold starts on managed platforms, solo-developer operational trade-offs.
Related content
Using Docker for Application Deployment: The Boring Win I Underrated
TIL that 'works on my machine' stopped being a real category of bug the day I containerized the API, not because Docker is clever but because it removed an entire class of environment-drift I'd been debugging manually.
Live Poll Results Without WebSockets: Server-Sent Events in a Node.js API
TIL that once vote writes were race-free, the results screen still felt dead until a manual refresh — switching from client polling to Server-Sent Events made results update instantly without the bidirectional complexity WebSockets would have added for a channel that only ever sends in one direction.
Debugging Problems That Only Appear in Production
TIL that a bug I couldn't reproduce locally turned out to depend on a real difference between environments — request concurrency — that my local setup structurally couldn't produce, no matter how hard I tried to repro it.