DEV Community

Sisofo Andrea
Sisofo Andrea

Posted on • Originally published at andreasisofo.it

Why I Stopped Using Mailchimp for Cold Email and Built Something with Brevo + n8n (Real Costs and Deliverability)

Mailchimp is great for newsletters. It is the wrong tool for cold outreach. I learned this the hard way after a 1.4% reply rate on a 600-prospect campaign that I was sure would land. Same list, same copy, same offer, rebuilt on Brevo + n8n: 4.7% reply rate, 81% inbox placement, cost per qualified reply down from €18 to €4.

This is the stack I run today for my own outreach (sisofo-outreach, ~300 emails/day, 7.5% bounce, 0 spam reports), the deliverability mechanics most "growth" blogs skip, and the three things I would not do again.


Why Mailchimp Kills Cold Email Deliverability

Mailchimp's whole pricing model is calibrated for opt-in newsletters. The shared IP pools are tuned for senders whose recipients explicitly subscribed. The moment you push cold outreach through that infrastructure, three things happen within hours.

Their abuse detection flags you on the first complaint. Mailchimp's TOS explicitly forbids non-permission-based sending. I had an account suspended in 72 hours on my second cold campaign. Not warned: suspended. They are right to do this, it's their reputation. But it means cold email is contractually a non-starter, not a "use carefully" situation.

Shared IP reputation is calibrated for the wrong sender. Mailchimp shared IPs run mixed traffic where the median sender has a 0.01% complaint rate. The threshold ESPs use to demote IP reputation is around 0.1%. A single cold campaign with three "this is spam" clicks on 600 sends puts you at 0.5% — five times the safe ceiling. Your IP gets quietly demoted into the shared sub-pool for risky senders, and inbox placement drops to 30-40%.

No granular bounce handling. Mailchimp treats hard bounces and soft bounces with one global suppression. For cold email, you need per-domain backoff and the ability to retry on transient SMTP errors without burning the address. You do not get that.


The Brevo + n8n Stack (And Why It Beats Apollo/Lemlist on Cost)

After testing Lemlist, Apollo.io, Instantly, and a brief flirt with Smartlead, here's what I run in production.

Brevo Transactional API — not the marketing UI, the Transactional API endpoint. I'm on the paid plan at €25/month for 20k emails. After warm-up I requested a dedicated IP (additional €15/month, optional but recommended above 5k sends/month). What I like: the API is REST, well-documented, webhooks fire for opens/clicks/bounces/spam/unsubscribe within seconds, and they have actual humans in support who answer in Italian within 24h.

n8n self-hosted on a Hostinger VPS — €4.99/month KVM2 box, runs n8n + my dashboard + PostgreSQL on the same machine. n8n is the orchestration layer: scheduling, personalization, followups, bounce handling, suppression list management. The whole sequence logic lives in one workflow JSON I can version-control.

Custom Next.js dashboard (sisofo-outreach, my own tool) — Supabase Postgres for prospect storage, dashboard at dashboard.andreasisofo.it for review/approval before sending. Optional layer; you can run the whole stack without it if you're comfortable querying Postgres directly.

Total monthly cost: ~€30 for what Lemlist charges €99/month and Apollo €119/month at the same volume. The trade-off is honest: you build the sequence logic yourself instead of dragging boxes in a SaaS UI. For me, two days of n8n work pays back in 9 months.

Alternatives I rejected after testing:

  • Lemlist: best UX in the category, but at 5k+ sends/month the price scales painfully and you lose IP control
  • Apollo.io: prospecting + sending bundled, attractive on paper, but the sending IPs are notoriously hot and warm-up is opaque
  • Instantly: cheapest of the SaaS options, but I had two accounts deliverability-deteriorate without explanation
  • Smartlead: technically excellent, but pricing only works above 10k sends/month

The IP Warm-Up Nobody Explains Properly

Every "cold email guide" tells you to warm up your IP. Almost none tell you what the curve actually looks like when an ESP scores it.

Here's the schedule I run on every new dedicated IP, derived from 6 warm-up cycles on Brevo:

Day range Volume/day What you're proving
1-7 20 "I'm a human sender, not a script"
8-14 50 "My recipients don't complain"
15-21 100 "I have a stable open rate >15%"
22-30 200 "I can sustain volume without spike"
31+ 300-500 Normal operating range

Why the curve matters: ESPs (Gmail, Outlook, Yahoo, Libero, Tiscali) maintain per-IP reputation scores updated daily. A new IP starts neutral. Each delivery, open, click, complaint, and bounce moves the score. A sudden jump from 0 to 500/day reads as "compromised IP being used by a spammer", and the score drops faster than warm-up can rebuild it.

Seed test accounts for inbox placement measurement. I have one address each at Gmail, Outlook.com, Yahoo, Libero, and Tiscali. Every Monday I send the current campaign template to all five and manually check where it lands (Inbox / Promotions / Spam / Not Delivered). If two of five land in Spam, I pause sends and review copy and headers before resuming. GlockApps automates this for ~$50/month if you want it managed.

My real numbers post-warmup, 30 days running:

  • 7.5% combined bounce rate (Brevo threshold is 8%, I'm one bad import away from trouble)
  • 0 spam reports
  • 81% inbox placement (Inbox + Updates, excluding Promotions)
  • DKIM + SPF + DMARC all aligned

The Cold Email Workflow (8-step n8n)

Here's what fires every weekday at 09:30 Rome time:

{
  "nodes": [
    { "name": "Cron 09:30", "type": "schedule" },
    { "name": "Fetch eligible prospects", "type": "postgres",
      "query": "SELECT * FROM prospects WHERE status='queued' AND next_send_at <= NOW() LIMIT 50" },
    { "name": "Personalize first line", "type": "openai",
      "model": "gpt-4o-mini", "cost_per_email": "€0.0006" },
    { "name": "Send via Brevo Transactional API", "type": "http",
      "endpoint": "POST /v3/smtp/email" },
    { "name": "Update prospect status", "type": "postgres",
      "set": "sent, last_sent_at=NOW(), step=step+1" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Webhook side runs as a separate workflow on /api/webhooks/brevo:

  1. Open event → log to email_events, update last_open_at
  2. Click event → log + mark prospect as engaged
  3. Bounce event → if hard bounce, mark bounced, remove from sequence
  4. Spam complaint → mark complained, remove from ALL sequences, add to global suppression
  5. Reply detected (via IMAP polling, separate cron every 15 min) → mark replied, pause sequence, notify me on Telegram

The followup logic is deliberately conservative:

  • Email 1 day 0
  • Email 2 day +4 if no reply, no open required (opens are noisy on iOS Mail Privacy Protection)
  • Email 3 day +9 if no reply
  • Hard stop after email 3 or any reply

Three emails is the ceiling I've found. Anything more and reply rate per send drops below 0.3% while complaint rate creeps up. Not worth the reputation cost.


Real Numbers vs Mailchimp Baseline

Same prospect list (487 Italian agency contacts, B2B), same offer, same copy structure. I ran the Mailchimp campaign in late 2024 before I knew better, then re-ran the corrected version on Brevo + n8n in Q1 2026 on a fresh subset to keep it apples-to-apples.

Metric Mailchimp baseline Brevo + n8n
Inbox placement 32% 81%
Open rate 11% 38%
Reply rate 1.4% 4.7%
Bounce rate 4.2% 7.5%
Spam complaints 0.4% 0.0%
Cost per qualified reply €18 €4

The biggest single lever was IP warm-up, not copy. Copy moved reply rate by maybe 1 percentage point in A/B tests I ran on the same infrastructure. IP and authentication moved inbox placement by 49 points. If your emails land in Spam, perfect copy is invisible.

The bounce rate looks worse on Brevo — that's because I'm seeing real bounces instead of Mailchimp's pre-filtered suppression. Honest data is more useful than flattering data.


What I Wouldn't Do Again

Three mistakes from my first 90 days, in order of how much they cost me.

Skipping DMARC alignment for the first two weeks. I had SPF and DKIM configured but DMARC was on p=none with no alignment check. Brevo's IP was authenticated, but my "From" domain wasn't aligned. Inbox placement on Gmail was ~50% lower than it should have been. Fixed in one afternoon by setting up DMARC with p=quarantine and alignment mode s (strict). Should have been day 1.

Using a role address like info@ as the reply-to. Gmail and Outlook heuristics weight role addresses as lower-trust senders. Switched to andrea@andreasisofo.it and inbox placement on Outlook jumped 12 points in a week. Use a personal name on a personal subdomain.

Buying a list, even once. I bought a "verified Italian SMB" list from a vendor that claimed 95% deliverability. Actual bounce rate on that import was 22%, my IP reputation tanked, and I lost a week of warm-up progress. Build your prospect list manually or with public-source scraping (LinkedIn Sales Navigator, Google Maps for local businesses). Never buy.


Where This Stack Doesn't Work

I get asked to set this up for clients regularly. I refuse about 25% of requests. Here's when:

Volume under 200 sends/month. The fixed cost of warm-up (4 weeks before you can sustain volume) doesn't amortize. Use a paid SaaS like Lemlist if you need cold email at low volume; the convenience is worth it.

B2C cold outreach. Consumer email providers (Gmail personal, Yahoo, Libero) are stricter on B2C cold sends than business domains. Reply rates drop below 1% regardless of stack. Use ads or organic content instead.

Anything regulated (legal, financial, medical). Italian GDPR enforcement on cold outreach to consumers in regulated industries is real. The fines are 4% of revenue. Cold outreach to a B2B office contact for software services is fine; cold-emailing patients to promote dental services is not. Know the line.


Closing

The full n8n workflow (importable JSON), the warm-up calendar template, and the Postgres schema I use for sisofo-outreach are documented at andreasisofo.it/blog/automazione-aziendale-ai-pmi-2026. If you want the workflow JSON directly, send me a message on LinkedIn — I'll share it gladly.

I'm Andrea Sisofo, freelance automation engineer based in Rome and Pescara. I build n8n workflows for SMBs that replace €100/month SaaS with €5/month VPS, and I run my own cold outreach on the same stack I'd sell you. Reach me at andreasisofo.it or on LinkedIn.

Open to questions in the comments — especially deliverability war stories.

Top comments (0)