The Self-Hosted SaaS Replacements That Actually Work
Every SaaS tool starts with a reasonable-sounding price. Then you add a second workspace. Then a team member. Then you cross the 10k event threshold and suddenly you’re on the “Growth” plan. Then the “Business” plan. Then you get an email asking if you’d like to talk to sales.
This is the SaaS ratchet. It only turns one direction.
The alternative isn’t going back to spreadsheets. It’s running open-source software on a VPS you actually control — and paying $6/month instead of $60.
Here’s the stack I’ve landed on. These aren’t moonshots or abandoned projects. They’re boring, stable, and maintained.
Analytics: Umami
Replaces: Google Analytics, Plausible
I wrote about deleting Google Analytics a while back. My recommendation there was Plausible as the simplest hosted alternative — but at $9/month, Plausible’s pricing still scales with pageviews.
Umami is the self-hosted version of that idea. It’s a single Node.js app backed by PostgreSQL or MySQL. The dashboard is clean and fast. It tracks what you actually care about — page views, referrers, devices, countries — with no cookie banners required because it doesn’t use cookies.
# docker-compose.yml (minimal)
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
APP_SECRET: your-secret-here
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
Drop a single <script> tag on your site. That’s the entire integration.
Caveat: Umami doesn’t have Plausible’s funnels or goal tracking yet. If you need conversion funnels, Plausible is still the cleaner hosted option. For page-level analytics on content sites, Umami is more than enough.
Email: Listmonk
Replaces: Mailchimp, ConvertKit, Beehiiv
Listmonk is a self-hosted newsletter and mailing list manager. It stores subscribers, manages lists and segments, schedules campaigns, and gives you a full templating system. You bring your own SMTP — Postmark, SES, or Resend — and it handles the rest.
The pitch: Mailchimp charges $20/month for 500 subscribers and calls it a “free trial.” Listmonk is free. The only cost is the VPS (shared with everything else on this list) and transactional email (Postmark is $1.50/1000 emails; a weekly newsletter to 2,000 subscribers costs $3/month).
# One-command install with Docker
docker run -d \
--name listmonk \
-p 9000:9000 \
-v listmonk-data:/listmonk/data \
listmonk/listmonk:latest
The admin UI is functional, not pretty, but you’re configuring it once and then forgetting it exists. Your subscribers only ever see the emails and the opt-in/opt-out pages, which you fully control via templates.
Caveat: Listmonk doesn’t have an RSS-to-email feature out of the box. If you want automatic “new post” emails, you’ll wire that up with a cron job or n8n (more on that below). It also has no analytics beyond open rates and click rates — though with Umami on the same stack, you can fill that gap.
Uptime Monitoring: Uptime Kuma
Replaces: Better Uptime, Pingdom, UptimeRobot
Uptime Kuma is a self-hosted monitoring UI. It pings your endpoints on a configurable interval and alerts you via Slack, Discord, email, PagerDuty, or a dozen other channels when something goes down.
The feature list is unexpectedly complete: HTTP/TCP/ping monitors, SSL certificate expiry alerts, status pages you can share publicly, response time graphs, and per-monitor alert thresholds.
docker run -d \
--name uptime-kuma \
-p 3001:3001 \
-v uptime-kuma:/app/data \
louislam/uptime-kuma:1
I run this with 30-second check intervals. For a static site on Render, it catches CDN hiccups before users report them.
Caveat: Uptime Kuma monitors from wherever you’re running it — a single location. If you want multi-region monitoring (is it down just in Asia?), you’d need multiple deployments or a separate tool. For most content sites, single-location monitoring from a US VPS is fine.
Git Hosting: Forgejo
Replaces: GitHub private repos, GitLab
This one has a narrower use case. If you’re building client sites or running internal tools and you’d rather not have every repo on GitHub, Forgejo is a full Git forge — code hosting, pull requests, issues, CI/CD via Forgejo Actions, and an API that mirrors GitHub’s in enough places to be useful.
Forgejo is a hard fork of Gitea, which is itself a Go rewrite of Gogs. It’s fast, lightweight (runs comfortably on 512MB RAM), and the community is active.
docker run -d \
--name forgejo \
-p 3002:3000 \
-p 222:22 \
-v forgejo-data:/data \
codeberg.org/forgejo/forgejo:1.21
The public instance at Codeberg runs Forgejo — if you’ve used Codeberg, you’ve used Forgejo.
Caveat: GitHub Actions workflows don’t run on Forgejo Actions unchanged. The syntax is close but not identical, and the marketplace ecosystem is much smaller. If you’re deeply invested in GitHub Actions, migrating workflows is real work.
Automation: n8n
Replaces: Zapier, Make (Integromat)
n8n is a workflow automation tool with a visual node editor. It connects to hundreds of services via HTTP, webhooks, and native integrations. Zapier charges $20/month for 750 tasks; n8n community edition is free to self-host with no task limits.
I use it for three things: notifying Slack when a new post goes live (webhook from Render → n8n → Slack), syncing new Listmonk subscribers to a backup spreadsheet, and a weekly digest of Uptime Kuma downtime events. None of these are complicated — they’re 3-5 node workflows.
docker run -d \
--name n8n \
-p 5678:5678 \
-v n8n-data:/home/node/.n8n \
n8nio/n8n:latest
Caveat: n8n’s self-hosted edition doesn’t include the cloud-only features (execution history beyond 200 runs, LDAP/SSO, version control for workflows). For a one-person or small-team setup, those limits don’t bite. If you need compliance or audit logs, look at the licensed enterprise edition.
The Infrastructure Question
All five of these fit on a $6/month Hetzner CX22 (2 vCPU, 4GB RAM) with room to spare. The baseline is Debian + Docker + Caddy as a reverse proxy with automatic HTTPS. Caddy’s config is readable enough to serve as documentation:
analytics.yourdomain.com {
reverse_proxy umami:3000
}
mail.yourdomain.com {
reverse_proxy listmonk:9000
}
status.yourdomain.com {
reverse_proxy uptime-kuma:3001
}
Backups are the part most people skip. Add a daily docker volume snapshot to Backblaze B2 with rclone — it costs roughly $0.006/GB/month and takes 10 minutes to set up:
# /etc/cron.daily/backup-volumes
#!/bin/bash
for vol in umami-data listmonk-data uptime-kuma n8n-data forgejo-data; do
docker run --rm \
-v "$vol":/data \
-e RCLONE_CONFIG=/config/rclone.conf \
rclone/rclone sync /data "b2:your-bucket/$vol"
done
What This Doesn’t Replace
Self-hosting has a maintenance tax. You’re responsible for OS updates, Docker image upgrades, and whatever breaks when you upgrade. For a handful of containers, this is a 30-minute monthly job. It scales badly if you add twenty more services.
Some SaaS tools are genuinely irreplaceable at the self-hosted tier. Stripe is the obvious example. Transactional email deliverability is another — the SMTP relay (Postmark, SES, Resend) is still a SaaS dependency even with Listmonk handling the frontend. You’re reducing the surface area, not eliminating it.
And some of these tools lag behind their SaaS counterparts on features. Umami doesn’t have Plausible’s polish. n8n’s UI is noisier than Zapier’s. If you’re onboarding non-technical teammates, that friction is real.
The argument isn’t that self-hosting is always better. It’s that the default posture — reaching for a SaaS tool for every problem — adds up to a subscription stack that costs several hundred dollars a month before you’ve built anything real. For the infrastructure category (analytics, monitoring, automation, email), self-hosted alternatives exist, they work, and the total cost is a rounding error on a $6 VPS bill.
Pick the tools that fit. Ignore the ones that don’t. The goal is fewer line items on the credit card statement, not a manifesto.