8 April 20268 min read

We replaced Zoho Mail with Mailcow on a Hetzner box — here's the math

Self-hosting email is supposedly painful. With Mailcow + a dedicated IP + 4 GB RAM, it's actually pretty boring. The annual savings paid for our second AX41.

"Don't self-host email" is one of those internet truisms that made sense in 2010 and propagated into 2026 without anyone checking the math. We checked the math.

The trigger

Zoho Mail Lite started at ₹0/user/month and migrated to ₹56/user/month somewhere along the way. Twelve mailboxes (admin, billing, support, noc, dmarc, abuse, postmaster, plus a handful of forwarders) added up to ₹670/month — not a lot, but a recurring vendor lock-in we didn't need.

More importantly: every time a customer asked about email hosting, we had to say "we don't do email." That was leaving money on the table.

The setup

Mailcow is a Docker Compose stack of Postfix, Dovecot, SOGo, Rspamd, ClamAV, and a web admin UI. It runs on one VM with 4 GB RAM and 40 GB disk. We provisioned a fresh Hetzner additional IPv4 (€1.19/month) so a future blocklist hit on the mail IP doesn't drag cloudnx.in web reputation down with it.

The unsexy steps that mattered:

  • Hetzner port-25 unblock ticket — one-time, auto-approved within 24 hours.
  • rDNS for the dedicated IP set to mail.cloudnx.in. Without this, Gmail will silently spam-foldering you.
  • SPF, DKIM, DMARC published. We bootstrapped DMARC at p=none and tightened to quarantine after two clean weeks.
  • MTA-STS in enforce mode and TLS-RPT pointing at [email protected]. Free reputation upside; both are basically zero-effort.

The cost

€1.19/month for the IP. ~₹0 for the VM (it runs on hardware we already own). The migration took two weekends including running both stacks in parallel for a week.

Zoho savings: ~₹670/month, or ₹8,000/year. The annual saving paid for the second AX41 we'd been wanting to add for HA.

The catches

Reputation is a long-term game. A new IP starts cold; expect 30 days of slightly-elevated spam-folder rates while your deliverability data accumulates with Google Postmaster Tools and Microsoft SNDS. Don't migrate marketing newsletters to a cold IP — only migrate transactional/personal mail first.

Mailcow upgrades are monthly. Most are routinegit pull && docker compose up -d. Twice a year there's a substantive change (we hit one for the SOGo theme file paths). The runbook lives in the repo atdeploy/MAIL_RUNBOOK.md.

Disaster recovery is your problem now, not Zoho's. We snapshot the mail VM nightly via Proxmox and dump Mailcow's MariaDB separately. Tested restore once before declaring victory.

The recommendation

If you have ≥10 mailboxes and ≥1 engineer comfortable with Docker Compose, self-host. The Mailcow team has done the hard work of making this boring. The "don't self-host email" advice was correct in 2010 and is now a vestigial reflex.

Try CloudNx

Bare-metal NVMe instances from ₹699/mo. INR pricing, GST invoices, UPI checkout. ₹500 free credit on signup — no card required.

Start free