Everything between a spreadsheet and the inbox
MyNewsletter covers the whole loop — importing, segmenting, composing, sending at a controlled rate, and measuring what happened — without asking you to stitch four tools together.
Point it at any CSV and it works out the rest
Exports from Customer.io, Close, HubSpot or a spreadsheet someone kept by hand all land the same way. Columns are matched by name, by fuzzy match, and — for the email column — by reading the values themselves.
Automatic field mapping
"Customer Email Address" becomes email. "Full Name" is split into first and last. You review and correct every decision before a single row is written.
Nothing gets dropped
Columns that do not match a standard field are kept as custom fields, so the plan, the account manager and the renewal date all survive the import and stay searchable.
Arrives already sorted
Low-cardinality columns like plan or country are offered as auto-tagging sources. Import 40,000 rows and they land tagged by tier, not in one undifferentiated pile.
Built for real files
Rows are parsed in your browser and streamed up in batches, so a 200MB export does not need to fit in memory anywhere — and the progress bar is measured, not guessed.
An editor that produces email HTML, not web HTML
Email clients are stuck around HTML 4. Outlook renders through Word. Gmail strips your stylesheet. The editor outputs nested tables with inline styles because that is what actually survives the trip.
Block editor with live preview
Headings, text, buttons, images, quotes, lists and dividers. The preview runs the same renderer that builds the real message, so what you see is what is sent.
Personalisation with fallbacks
Write {{first_name|there}} and nobody ever receives "Hi ,". Merge tags reach custom fields too, so {{custom.plan}} works out of the box.
Starter designs
Announcement, newsletter, event invite, and a plain-text-looking personal layout — which, in practice, is usually the one that performs best.
Or bring your own HTML
Paste a hand-built template and it is used verbatim. The compliance footer and tracking are appended for you.
The unglamorous work that decides whether any of it arrives
Most email problems are not content problems. Since 2024, Gmail and Yahoo reject bulk mail that fails authentication outright. These checks are built in rather than sold as an add-on.
Live SPF, DKIM and DMARC checks
Real DNS lookups against your sending domain, with specific instructions for whatever is missing or misconfigured — including the SPF ten-lookup limit that silently breaks records.
One-click unsubscribe (RFC 8058)
The List-Unsubscribe headers Gmail and Yahoo require from bulk senders. Their native unsubscribe button becomes a clean opt-out instead of a spam complaint.
Pre-send content audit
Scores your draft on trigger phrases, subject shape, text-to-image balance, link hygiene, URL shorteners and missing alt text — before you send, not after.
A suppression list that holds
Unsubscribes, hard bounces and spam complaints are blocked globally. An import can never resurrect someone who opted out, whatever the spreadsheet says.
include:zeptomail.zoho.com found · 4 of 10 lookups
Key published for selector: zoho
p=none — move to quarantine once reports look clean
Checked live against public DNS — not a checkbox someone ticked once.
Decide exactly how fast the mail goes out
Set a rate per minute, per ten minutes, per hour or per day. It is a rolling window measured against what actually left the building, so a restart or an overlapping run cannot cause a burst.
Rate limits you set
Thirty an hour while you warm a new domain, or two hundred a minute once it is established. Change it mid-send; the next batch picks up the new rate.
Spread across providers
Recipients are interleaved by mailbox provider rather than sent alphabetically, so Gmail does not receive twenty thousand messages in an unbroken block.
Pause and resume
Stop a send mid-flight, fix the thing you spotted, and carry on. Nothing is sent twice — the queue is claimed row by row.
Schedule ahead
Pick a date and time and it starts on its own. An account-wide hourly ceiling sits on top of every campaign as a safety net.
Your data, in your own database
Every open, click, bounce, complaint and unsubscribe is written to your Postgres instance as a row you can query. No export request, no API quota, no waiting.
Opens and clicks
Unique and total, per campaign and per contact, with click-to-open rate and a ranked list of which links people actually pressed.
Honest about the numbers
Open tracking undercounts — Apple Mail pre-fetches images and many clients block them. We say so in the interface rather than quietly inflating the figure.
Per-contact history
Open any contact and see every campaign they received, opened and clicked, alongside their tags, lists and custom fields.
Nothing locked in
It is a normal Postgres schema. Point any BI tool at it, or take the whole thing with you.
Try it with your own list
Import a CSV and see how much of it maps itself. Free for your first thousand contacts.