Numerous wires and cables mounted into server patch panel in modern data center📷 Brett Sayles / Unsplash
Infrastructure

I Replaced My $300/Month Email Stack With a $5 VPS — Full Setup Guide

Cleanmails
·May 7, 2026·9 min read

I was paying $300/month for Instantly + Apollo + a warm-up tool — then I moved everything to a $5 VPS and my deliverability actually improved. Here's the exact setup.

Six months ago I was hemorrhaging $312/month on cold email tools. Then I cut it to $5. Not by downgrading — by understanding what I was actually paying for.

This is the full self hosted email server setup guide I wish existed when I started. No hand-waving. No "consult your DevOps team." Just the exact steps I followed on a Tuesday afternoon.

Why I Blew Up My Entire Email Stack

Here's what $312/month looked like for me:

Tool Monthly Cost What I Actually Used It For
Instantly (Growth) $97 Sending + sequences
Apollo (Basic) $49 List building
Mailreach $69 Warm-up
4× Google Workspace accounts $28 Sending domains
Dedicated SMTP (Sendgrid) $69 Overflow volume

$312/month. $3,744/year. And my reply rates were sitting at 2.1%.

The breaking point wasn't the cost — it was when Instantly flagged my account for "unusual sending patterns" and froze my active campaigns for 72 hours. I had a product launch sequence mid-flight. Three days of silence to a warm list because a SaaS company decided my behavior looked suspicious.

That's the fundamental problem with renting your infrastructure: someone else holds the kill switch.

The Contrarian Take Nobody Wants to Hear

Most people assume self-hosted email is harder to deliver to the inbox. The opposite is true — if you set it up correctly.

Here's why: shared sending infrastructure means shared reputation. When you're on Instantly or Smartlead's shared SMTP pools, you're riding alongside thousands of other senders. One bad actor tanks the IP reputation for everyone. The data on this is brutal — shared IPs can carry blacklist hits that drop inbox placement by 40% or more overnight.

With your own VPS and a fresh dedicated IP, your reputation is entirely yours to build or destroy. That control is worth more than any feature in a $97/month SaaS dashboard.

What You Actually Need (Minimum Viable Stack)

Before the setup steps, let's be clear about what this guide produces:

  • A Postfix SMTP server running on a $5/month VPS (I use Hetzner CX11 — 2 vCPU, 2GB RAM, 40GB SSD)
  • Proper SPF, DKIM, and DMARC records so you don't land in spam on day one
  • Cleanmails installed on the same VPS (one-time $497 — yes, I paid for it, yes it was worth it) handling sequences, sender rotation, and email validation
  • Total ongoing cost: $5/month for the VPS, nothing else

If you want to understand why monthly subscriptions are destroying cold email ROI, the math is simple: Cleanmails' one-time fee pays for itself in under 6 weeks versus what I was paying before.

Self Hosted Email Server Setup: Step-by-Step

Step 1: Provision Your VPS (10 minutes)

I use Hetzner because their IP ranges are clean and their EU data centers have solid deliverability out of the box. DigitalOcean and Vultr also work.

Spec requirements for cold email:

  • 1-2 vCPU minimum
  • 2GB RAM minimum (Postfix + Cleanmails fits comfortably)
  • Ubuntu 22.04 LTS
  • A fresh IP that hasn't been used for spam

First thing to do after provisioning — check your IP reputation:

curl https://api.mxtoolbox.com/api/v1/Lookup/blacklist/?argument=YOUR.IP.HERE

Or just paste your IP into MXToolbox. If it's listed on more than 2 blacklists, ask your provider for a different IP or spin up a new instance until you get a clean one. This takes 2 minutes and saves hours of deliverability debugging later.

Step 2: Install and Configure Postfix (15 minutes)

# Update and install
sudo apt update && sudo apt upgrade -y
sudo apt install postfix mailutils -y

# During install, select "Internet Site" and enter your mail domain
# e.g., mail.yourdomain.com

Edit your main Postfix config:

sudo nano /etc/postfix/main.cf

Add or update these lines:

myhostname = mail.yourdomain.com
mydomain = yourdomain.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
mynetworks = 127.0.0.0/8
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_note_starttls_offer = yes

Restart Postfix:

sudo systemctl restart postfix
sudo systemctl enable postfix

Step 3: Configure DNS Records (20 minutes)

This is where 80% of people screw up their self hosted email server setup. DNS is not optional. Get this wrong and your emails go straight to spam.

PTR Record (Reverse DNS) — Do this first

Log into your VPS provider's control panel and set the reverse DNS for your IP to match your mail hostname:

YOUR.IP.ADDRESS → mail.yourdomain.com

This is the single most important deliverability step most guides skip.

SPF Record

In your domain's DNS (wherever you manage it — Cloudflare, Namecheap, etc.):

Type: TXT
Name: @
Value: v=spf1 ip4:YOUR.VPS.IP ~all

DKIM Setup

sudo apt install opendkim opendkim-tools -y
sudo opendkim-genkey -t -s mail -d yourdomain.com
sudo cp mail.private /etc/opendkim/keys/yourdomain.com/mail.private

Add the public key from mail.txt to your DNS:

Type: TXT
Name: mail._domainkey
Value: (paste the p= value from mail.txt)

DMARC Record

Type: TXT
Name: _dmarc
Value: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com

After adding all three, verify them with the SPF/DKIM/DMARC Checker before you send a single email. I've seen setups where the DNS propagated incorrectly and nobody noticed for two weeks. Don't be that person.

Step 4: Install Cleanmails on the Same VPS

This is where the setup goes from "functional SMTP server" to "full cold email platform." Cleanmails installs directly on your VPS and connects to your Postfix instance — no external dependencies, no API rate limits, no subscription renewals.

# Download and run the Cleanmails installer
curl -O https://cleanmails.io/install.sh
chmod +x install.sh
sudo ./install.sh

The installer handles the Postfix integration automatically. Once it's running, you get:

  • Multi-sender rotation across all your domains
  • Built-in email validation (critical — bounces above 3% will kill your sender reputation fast)
  • Visual sequence builder with cadences
  • Sending limits per sender to avoid triggering spam filters

The sender rotation piece alone is worth the setup effort. I now run 8 sending domains through one interface. Optimizing sender rotation at this level was impossible in my old stack without paying for additional seats.

Step 5: Clean Your List Before You Send Anything

I can't stress this enough: do not send cold email from a fresh server to an unvalidated list.

A new IP with a 5% bounce rate on day one is essentially dead. ISPs use bounce rates as a spam signal, and a new IP has no positive history to offset it.

Run your list through the Bulk Email Verifier before loading it into Cleanmails. Remove all invalid, catch-all, and disposable addresses. Target a bounce rate under 2% — ideally under 1%.

Also run your templates through the Email Spam Word Checker before sending. A clean server with a spam-triggering subject line is still going to underperform.

The Warm-Up Phase You Can't Skip

Fresh IP + fresh domain = zero reputation. You need to build it before scaling.

My warm-up schedule:

Week Emails/Day What to Send
1 10-20 Real emails to colleagues, test accounts
2 20-50 Mix of known contacts + first small cold batch
3 50-100 Gradual cold volume increase
4+ 100-200+ Normal operations

For a deeper breakdown of this process, the domain warm-up guide covers the exact ramp schedule I follow for every new sending domain.

Monitor your inbox placement weekly during warm-up. Send test emails to Gmail, Outlook, and Yahoo addresses you control. If you're hitting spam folders, check your authentication records first — that's the cause 90% of the time.

What Changed After the Switch

Three months post-migration:

  • Reply rate: 2.1% → 3.4% (deliverability improvement + better control over sending cadence)
  • Monthly cost: $312 → $5
  • Uptime incidents: 0 (versus 3 platform outages in the previous 6 months)
  • Time spent on billing/account issues: 0 hours

The reply rate improvement surprised me. I attributed it partly to deliverability, but also to the fact that I could now A/B test sending times and cadences without being constrained by a SaaS platform's feature set.

Common Failure Points (And How to Avoid Them)

Port 25 blocked by VPS provider Some providers (AWS, Google Cloud) block outbound port 25 by default. Hetzner and DigitalOcean don't. If you're on a blocked provider, request the restriction be lifted or switch providers.

Missing reverse DNS If you skip the PTR record, Outlook will reject your emails with a 550 error. Set it before anything else.

Sending too fast too soon I see this constantly. Someone sets up their server, imports 10,000 contacts, and sends everything on day one. The IP gets flagged within 48 hours. Ramp slowly. The bounce rate management guide has the exact thresholds to watch.

Not monitoring blacklists Set up a weekly check on your sending IP. MXToolbox and Hetrix Tools both offer free monitoring. Catching a blacklist hit early means you can address it before it compounds.

Is This Setup Right for You?

Honestly? If you're sending fewer than 500 emails/month, stick with a managed tool. The setup overhead isn't worth it at that volume.

But if you're sending 2,000+ emails/month, managing multiple clients or domains, or you've been burned by platform outages or account freezes — the self-hosted path is the right one. Agencies especially are making this move for exactly the reasons I did: control, cost, and reliability.

The $5/month VPS isn't the point. The point is owning your infrastructure so nobody can freeze your campaigns at midnight before a product launch.


Related:

InfrastructureSelf-HostedCold EmailSMTPCost Savings

Stop paying monthly for cold email.

Cleanmails — self-hosted, unlimited everything, $497 one-time.

Get Cleanmails
Related