Brevo

brevo.comcontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

Marketing and transactional email, SMS and a small CRM in one account, priced by emails sent rather than by contacts stored — which suits a large list that is mailed rarely.

Promptfree, for everyone, and the only version there is
Build me email sending that replaces Brevo — and know exactly why this is ALMOST.

The application is a fortnight. **Deliverability is not.** What you are paying for is a warmed sending platform with people watching complaint rates, shared reputation you did not have to build, and pricing by send rather than by contact. You can run the software; you cannot short-cut the reputation. Read the warm-up section before deciding.

STACK
- Node 20+ with Fastify, server-rendered HTML
- SQLite through better-sqlite3, WAL mode
- A bulk sending provider — you still need one, and that is the honest position. What you avoid is the per-contact pricing on top
- A worker for sending, separate from the web process
- Caddy in front

THE DATA MODEL
- lists, contacts, segments — segments as saved rules, evaluated at send time and never stored as a member list
- contacts: id, email, attributes_json, status, confirmed_at, unsubscribed_at, bounced_at, complained_at, source, consent_text, consent_at, ip_hash
- campaigns and deliveries: one delivery row per contact per campaign, written before sending, which is what makes a resume exact and a duplicate impossible
- transactional: id, template_id, to_hash, payload_json, provider_ref, status, sent_at, opened_at, bounced_at
- templates: id, kind, subject, mjml_source, text_source, version
- suppression: email_hash, reason, at — global, across every list, forever
- automations and automation_sends, so nobody receives the same step twice

THE ONE RULE ABOUT REPUTATION
- Transactional and marketing mail must not share a sending domain. A password reset that fails to arrive because a campaign got complaints is a support disaster
- Use a subdomain for each, with separate SPF, DKIM and DMARC records, and separate provider streams if the provider allows
- Warm slowly: a new domain sending twenty thousand messages on day one goes to spam and stays there. Start in the hundreds and double over weeks. Put the schedule in the README
- Watch the complaint rate. Above a fraction of a percent the provider suspends you, and that is the failure that ends the project
- Suppress hard bounces immediately, complaints permanently, and anyone who has not opened anything in a very long time. A list full of dead addresses is what destroys reputation

SENDING
- The worker claims a batch with a lease, sends, and records the result. A crash resumes exactly where it stopped
- Idempotent per contact per campaign, because the row already exists
- Rate limited to what the provider accepts, with backoff on throttling
- A test send required before any campaign, and a confirmation showing the recipient count and the segment — the mistake everybody makes once is sending to the wrong list

THE MESSAGE
- Built with MJML or tables and inline styles, with a plain-text alternative generated from the same source
- Personalisation with a default for a missing value, so nobody is greeted as 'Hi ,'
- One-click unsubscribe with no login, plus the List-Unsubscribe headers the large providers now effectively require
- Preview at phone and desktop width, and in the client that renders with the Word engine

SMS, HONESTLY
- If you need it, it is a provider, a per-message cost, and in most countries a registered sender identity with an application process. It is not code, it is paperwork, and it is worth checking before promising it

REPORTS
- Sent, delivered, opened, clicked, bounced, complained, unsubscribed, per campaign and over time, computed from rows at query time
- Open rate labelled as unreliable, because privacy proxies pre-fetch images. Clicks are the number that means something

OPERATIONS
- .env: DATABASE_PATH, BASE_URL, PROVIDER credentials, FROM_ADDRESS, SESSION_SECRET, HASH_SALT
- Migrations on boot, each once; nightly backup off the machine — this holds your list, which is the asset
- Health endpoint checking the provider and the bounce feed

WHAT MATTERS MOST
Separate domains and the suppression list. Get those two right before the first send, because reputation is the one thing here that cannot be fixed afterwards.

What you lose

  • Pricing by send rather than by contact, which is genuinely cheaper for a big, quiet list
  • Transactional and marketing on one sending reputation, warmed and monitored
  • SMS and WhatsApp alongside email without a second vendor

If you would rather not build

  • Postmark or SES for transactional

What it costs

read from their page 15 Aug 2026

PlanBilled monthlyBilled yearlyLast read
—$9/mo—15 Aug 2026

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Listmonk

$0

Self-hosted campaigns with SMTP or SES delivery.

knadh/listmonkfree · open source

MJML

$0

Markup that compiles to email HTML which renders correctly in Outlook.

mjmlio/mjmlfree · open source

Why this verdict

our own opinion · changed only by a person

50/100

Verdict kinda at 50. Two pipes on one contact record is straightforward; the CRM and SMS halves are where you would stop and keep paying.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 1/day
views0130 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Brevo

answered from the record above

Is Brevo free?

No — the plan we track is $9 a month. Starter from around $9/month billed monthly for 5,000 emails; pricing is by send volume rather than contacts.

Can you replace Brevo by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 50 out of 100, build time a weekend. Read what you lose before you decide.

How much does Brevo cost?

$9 a month on Starter — $108 a year. Recorded 9 Aug 2026.

What do you lose by replacing Brevo?

Pricing by send rather than by contact, which is genuinely cheaper for a big, quiet list; Transactional and marketing on one sending reputation, warmed and monitored; SMS and WhatsApp alongside email without a second vendor. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Brevo?

Yes: Listmonk, MJML. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 33 in Email & newsletters

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc