For one person, Brevo's core is a contact list, a campaign composer, a welcome sequence and an SMTP endpoint for app mail. An agent can write that in a weekend on SES or any SMTP server, and listmonk already covers most of it. What you can't copy is the sending reputation: Brevo mails from shared infrastructure that it monitors and polices, while a new domain of yours starts cold, with SPF, DKIM, DMARC and complaint rates to look after. SMS, WhatsApp, the CRM and the visual automation builder are separate products, so they stay out.
Before you buildBrevo Free allows 300 emails a day and 100,000 contacts. If your list is small and you send occasionally, you may never need to pay.
Build me a personal email sender for campaigns and app mail to replace Brevo. Requirements:
- Python 3.12 + FastAPI with Jinja2 pages and htmx. `uvicorn app:app` serves http://localhost:4600:
admin at /admin, public routes /subscribe, /confirm/<token> and /unsubscribe/<token>.
- Storage: SQLite (stdlib sqlite3, WAL mode) in ./data/mail.db: contacts (email, first_name, status
pending / active / unsubscribed / bounced / complained, consent_at, source), lists, campaigns, a send
log with one row per recipient and a suppression table that every send checks first.
- Contacts: CSV import with a column-mapping step and a required consent date (rows without one are
refused), CSV export, tags, and double opt-in through a signup form with an embeddable HTML snippet.
- Campaigns: Markdown with {{first_name}} merge fields, CSS inlined with `premailer`, a plain-text
part, "send test to me", then send to a list through SES or any SMTP server from .env
(`aiosmtplib`) at most 10 messages a second, soft failures retried with backoff. Every message
carries a visible unsubscribe link plus List-Unsubscribe and List-Unsubscribe-Post headers (RFC 8058).
- One welcome automation per list: email, wait N days, email, run by an APScheduler job every minute;
leaving the list stops it.
- App mail: POST /api/send with a bearer token from .env takes to, subject, html and variables, uses
the same SMTP settings, logs the result and answers 202.
- Bounces and complaints arrive on a webhook that verifies Amazon SNS signatures, writes to the
suppression table and pauses a campaign if complaints pass 0.1% after 500 sends. Stats per campaign:
sent, failed, bounced, complained, unsubscribed. Open tracking stays off.
- One admin password in .env. No accounts, no telemetry, local-first apart from SMTP and the webhook.
- Out of scope: a drag-and-drop editor, SMS and WhatsApp, landing pages, a CRM, multiple seats.
- README: SPF, DKIM and DMARC records, SES production access, exposing the public routes over HTTPS,
and a note that a new sending domain should start with a few hundred messages a day.Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Brevo.
Extend the email sender in this folder. Requirements: - Add saved segments: a filter over tags, list membership, signup date and one custom field per contact, combined with AND or OR, stored as JSON in SQLite. - A campaign can target a list, a segment or both; resolve the audience when sending starts and save the recipient count on the campaign. - Show a live count and ten sample addresses while editing a segment. - Suppressed and unsubscribed addresses are always excluded, whatever the segment says. - Update the README.
Add IMAP bounce processing to the email sender in this folder. Requirements: - Read a bounce mailbox from IMAP_HOST, IMAP_USER and IMAP_PASSWORD in .env every 5 minutes (`imapclient`), and parse delivery status notifications (RFC 3464) with the `email` module. - Hard bounces (5.x.x) go to the suppression table at once; soft bounces count, and the third one inside 30 days suppresses the address. - Mark processed messages as seen and move them to a Processed folder. - Show the last 50 bounces with the reason in the admin page. - Update the README.
Add optional click tracking to the email sender in this folder. Requirements: - A per-campaign checkbox, off by default. When on, rewrite links to /r/<signed-token> that redirects and records the contact, the campaign and the time. - Sign tokens with HMAC from .env; unknown or tampered tokens return 404 and never redirect. - Report clicks per link and per campaign; never show open rates. - State in the campaign page that tracking is on, and in the unsubscribe page what is recorded. - Update the README.
Add a confirmation reminder to the email sender in this folder. Requirements: - Three days after a signup stays pending, send one reminder with a fresh confirmation link. - Send at most one reminder per address; after 14 days delete the pending row. - Use the same SMTP settings and the same suppression checks as campaigns. - Log every reminder in the send log, and add a count of pending signups to the admin page. - Update the README.
Reaching the inbox is the product. Brevo sends from reputation it has already built, handles unsubscribe and consent plumbing, and puts email, SMS and a small CRM in one login at a price that starts at $9. A script on your own domain has to earn trust one batch at a time, and a bad first week can land you in spam.
Estimate · A small VPS or a tunnel plus per-message fees from SES or another SMTP provider, which stay low at newsletter volumes. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | 300 email sends a day, up to 100,000 stored contacts, 1 marketing seat, drag-and-drop editor, transactional email and SMS, automation for up to 2,000 contacts. |
| Starter | $9 | $8.08 | From 5,000 emails a month with no daily cap, advanced segmentation, signup forms, email templates, basic reporting, email support. The 5,000 tier stores up to 500 contacts. |
| Standard | $18 | $16.17 | Everything in Starter plus marketing automation, A/B testing, send-time optimization, advanced reports, web and event tracking, one landing page, no Brevo logo. |
| Professional | $499 | $449.08 | From 150,000 emails a month, 10 seats, WhatsApp, popups and push, contact scoring, AI segmentation, phone support, 3 hours a year with a deliverability specialist. |
| Enterprise | $2,499 | — | Custom sending volumes, multi-account management, custom objects, dedicated IP, SSO and SAML, tailored onboarding. |
Free allows 300 emails a day and stores up to 100,000 contacts, with email campaigns, transactional email and a drag-and-drop editor.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Delivery from an established shared sending pool and a team watching abuse and bounces, SMS, WhatsApp and push channels.
About $9 a month on the Starter plan, $108 a year (checked 2026-10-19).
Delivery from an established shared sending pool and a team watching abuse and bounces; SMS, WhatsApp and push channels; The visual automation builder, A/B testing and send-time optimization; Landing pages, popups and the built-in CRM with deals and chat; Ready-made connectors and plugins for shops and website builders. If any of those matter to you, keep paying.
Yes: listmonk (open source), Mautic (open source), Keila (open source).