Every “self-hosting is cheaper” post compares a $10 VPS against a per-seat invoice, declares victory, and quietly omits the most expensive line item, which is a human being. This one includes it.
Figures are illustrative and provider-dependent. The point is the structure of the budget, not the exact digits.
Line 1: Compute
The cheapest and most over-estimated part. Team chat is a low-throughput workload — a busy 50-person team writes a few thousand messages a day, which barely registers on modern hardware.
| Team size | Shape | Monthly |
|---|---|---|
| Up to 25 | 1 vCPU / 2 GB, Postgres on the same box | $6–12 |
| 25–100 | 2 vCPU / 4 GB | $18–40 |
| 100–500 | 2+ app processes behind a load balancer | $60–150 |
| 500+ | Load-balanced app tier | Scales with the database, not headcount |
Notice the flat stretches. Going from 25 people to 50 costs a per-seat plan twice as much and costs a server essentially nothing.
Line 2: Database
You can run Postgres on the same box for free, or pay for managed Postgres and buy back the backup routine. The second option is usually worth it, and it's the line item most likely to surprise you.
- Self-managed on the app server: $0 extra, and backups become your calendar reminder.
- Small managed instance: roughly $15–30/month, with automated backups and point-in-time recovery.
- Production-grade managed with replicas: $100+/month, relevant past a few hundred people.
Line 3: Object storage
Uploads and exports need somewhere to live. This is genuinely cheap, and the only variable that matters is whether your team shares screenshots or video.
- Storage: typically a couple of cents per GB per month. A team of 25 sharing screenshots might use a few GB a year.
- Egress: the line that bites. Some providers charge meaningfully for downloads; others include it. Check before you pick.
- MinIO on the same box: $0, at the cost of it being your problem.
Budget $2–10/month for most teams. It's noise unless someone starts sharing raw video, at which point it's suddenly not.
Line 4: Backups
Off-site backup storage is a few dollars a month and the single most important line here. A backup on the same server is a story about a server.
- Off-site storage: $1–5/month for a small team's dumps.
- Automation: an hour once, to write the script and the cron entry.
- Restore rehearsal: an hour, once, and again after any major change. Non-negotiable.
Line 5: The person
Here's the line the comparison posts skip. Someone has to do this work, and their time has a cost whether or not it appears on an invoice.
| Task | Hours | Frequency |
|---|---|---|
| Initial setup, domain, TLS | 2–4 | Once |
| Backup automation and a restore test | 1–2 | Once, then after major changes |
| Upgrades | 0.5 | Monthly-ish |
| Host patching and monitoring | 0.5 | Monthly |
| Something broke | 2–8 | Once or twice a year, unpredictably |
That's roughly 4–6 hours up front and 12–15 hours a year. At an internal cost of $100/hour, call it $500 to start and $1,300 a year ongoing. Suddenly the $10 VPS isn't the headline number.
The whole budget
| 10 people | 50 people | 100 people | |
|---|---|---|---|
| Compute | $8/mo | $30/mo | $70/mo |
| Managed Postgres | $15/mo | $25/mo | $60/mo |
| Object storage + backups | $5/mo | $10/mo | $20/mo |
| Infrastructure subtotal | $336/yr | $780/yr | $1,800/yr |
| Staff time at $100/hr | $1,300/yr | $1,300/yr | $1,500/yr |
| Total | ~$1,640/yr | ~$2,080/yr | ~$3,300/yr |
| Per-seat SaaS at $10/seat/mo | $1,200/yr | $6,000/yr | $12,000/yr |
The interesting row is the last two. At 10 people, self-hosting costs more once you're honest about time. At 50 it's a third of the price. At 100 it's a quarter. The crossover sits somewhere around 20–25 people, and the gap widens with every hire because one side of it is flat.
The costs people forget entirely
- Bus factor. If one person set it up and nobody else knows how, you have an undocumented dependency wearing a server costume. Write the runbook.
- Attention. Even a healthy deployment occupies a little background thought, permanently.
- The upgrade you postpone. Deferred upgrades compound into a version nobody dares to touch, which is how self-hosted deployments become security problems.
- Migration, if you leave. Getting data out matters. Check the export story before you commit, not after.
The third column
The table above assumes hosted means paying per seat. That's not always true. Fluid Chat's hosted version is $0 with no seat count and no history limit, which flattens the whole analysis: you get the cost profile of self-hosting without the staff-time line.
In which case self-hosting stops being a cost decision and becomes purely a control decision — data residency, network isolation, or wanting the database on hardware you can point at. Those are good reasons. “It's cheaper” stops being one when the alternative is also free.
Both columns are $0 here.
Fluid Chat is free hosted and free self-hosted, running the same code. Pick on control rather than price, because price isn't the variable.