Featured image · 2520×1080
Most side projects don’t need a platform bill that grows faster than the user count. We rebuilt a small client app on a stack that costs $13 a month and ran it in production for four weeks. Here is every piece, what it costs and where it falls short.
The stack at a glance
|
Layer |
Tool |
Plan |
Per month |
|---|---|---|---|
|
Hosting |
Render |
Starter |
$7 |
|
Database |
Neon |
Free |
$0 |
|
|
Resend |
Free |
$0 |
|
Monitoring |
GlitchTip |
Self-hosted, $5 VPS |
$5 |
|
Domain + DNS |
Cloudflare |
Registrar, free DNS |
$1 |
Total
$13
Hosting: Render
Render’s Starter web service runs the Node app with zero-downtime deploys from the main branch. Cold starts are not an issue on paid instances, and the dashboard makes logs and environment variables easy to find. We kept the whole config in one file so the setup can be rebuilt in minutes.
services:
- type: web
name: app
plan: starter
buildCommand: npm ci && npm run build
startCommand: npm start
envVars:
- key: DATABASE_URL
sync: falseDatabase: Neon
Neon’s free tier gave us serverless Postgres with enough storage for the app and, more importantly, branching. Every pull request got its own database branch, which made preview deploys behave like production.
N
We reviewed it
Neon
Serverless Postgres with branching.
8.4
Email: Resend
Transactional email ran on Resend’s free plan. Sign-up confirmations and password resets never came close to the monthly limit, and the React email templates lived in the same repo as the app.
Four weeks, zero platform outages. The only downtime was a migration we ran by hand.
From our production log
Monitoring: GlitchTip on a $5 server
Hosted error tracking was the one line item that pushed past our budget, so we self-hosted GlitchTip on a small VPS. It speaks the Sentry SDK protocol, so switching later means changing one environment variable.
Screenshot · GlitchTip issues view
GlitchTip grouping errors from the production app during week two.
Where it falls short
–
The Neon free tier suspends compute when idle, so the first query after a quiet hour is slower.
–
Self-hosted monitoring means you patch and back up that server yourself.
–
No built-in background jobs. We used a cron endpoint instead of a queue.
–
Render Starter has 512 MB of RAM, which limits heavier builds.
Questions
Does this scale past a few hundred users?
Yes, with upgrades. Move Neon to a paid plan first, then scale the Render instance. Nothing in the stack needs to be replaced.
Why not use a single platform for everything?
All-in-one platforms were simpler to set up, but every one we priced passed $20 a month once monitoring and email were included.
Were any of these tools sponsored?
No. We paid for every plan listed, and some links in this post are affiliate links that never change our picks.
Bottom line
For a small production app with a few hundred users, this stack is stable, cheap and easy to move off when you outgrow it. Budget for a paid database plan once you need more storage or always-on compute.
LP
Written by
Lena Park
Backend and infrastructure
Lena runs the servers, databases and deploy pipelines behind our test projects. She has shipped production Postgres for ten years and still reads the pricing page first.
On this page
07
08
$ sudo
request –tool
Want a tool in this stack reviewed?
← Previous post
Why our engineering docs left Notion
Next post →
Our recording setup, from mic to upload
Keep reading
Post image
Post image
Post image