Migrate from Mailchimp
Moving a Mailchimp audience to SendRaven.
Mailchimp exports an audience as a zip of CSVs, one per status: subscribed, unsubscribed, cleaned, and non-subscribed. Each imports into SendRaven with a file-level status, and the tags and merge fields come across as tags and custom properties.
The thing to get right is that the unsubscribed and cleaned files have no status column. They are separate files, and the import needs to be told what everyone in each one is. It guesses from the timestamp column only those files carry, and asks you to confirm.
Export steps checked 6 September 2026 against mailchimp.com. Weighing it up? SendRaven vs Mailchimp.
- Audience → All contacts. Pick the audience if you have more than one.
- Export Audience, then Export as CSV. Mailchimp prepares a zip and emails you when it is ready; for a large audience that takes a few minutes.
- Unzip it. You get subscribed_members_export.csv, unsubscribed_members_export.csv, cleaned_members_export.csv and, if you collect them, nonsubscribed_members_export.csv.
- Import the subscribed file first, then the other two with their status. Leave the non-subscribed file out: those people never opted in.
Before you start
Who should switch from Mailchimp, and who should stay.
Stay with Mailchimp if
- A marketing team builds campaigns in the drag-and-drop editor and does not want to touch HTML. SendRaven has no visual builder.
- You depend on Mailchimp's integrations with your store or CRM, its landing pages, or reporting a marketing team already reads.
- Your list is small enough that Mailchimp costs you little. The move takes an afternoon and saves little.
- You need a sending reputation with years behind it today. SendRaven is new, a new sending domain warms up over days, and we do not quote deliverability figures we have not earned.
Switch to SendRaven if
- Your list is much bigger than the part you mail. Mailchimp counts subscribed, unsubscribed and non-subscribed contacts toward the price of a plan; SendRaven charges for emails sent, and a contact costs nothing.
- You send from code, or an AI agent does. Transactional email, campaigns, automations and replies are one API and one plan here; at Mailchimp, transactional is Mailchimp Transactional (Mandrill), a paid add-on.
- Replies matter. Answers to a newsletter or a sequence come back as threads your application or agent can read, and an automation stops for someone who replied.
- An agent will touch the list or the sends, and you want a daily send limit, a recipient allowlist or human approval on the key it holds.
Facts about Mailchimp from its own documentation, last verified 17 September 2026.
Compared
What changes when you move from Mailchimp.
| What changes the architecture or the bill | SendRaven | Mailchimp |
|---|---|---|
| Priced per email sent, never per contact | Yes One meter. A contact is free. | No by contacts |
| Transactional, campaigns and automations on one plan | Yes One key, one plan, one dashboard, one suppression list. | Partly transactional is Mandrill, a paid add-on |
| The reply is a thread, not a webhook | Yes Joined on Message-ID to the message it answers. | No |
| One query for what is awaiting a reply | Yes GET /v1/threads?awaiting_reply=true | No |
| Per-key daily cap and recipient allowlist | Yes daily_send_limit and allowed_recipients on the key, checked on every send. | No |
| Human approval hold on a key | Yes requires_approval drafts the message and waits for a person. | No |
| Unsubscribe cancels queued sends and ends the sequence | Yes Two writes: suppress the address, cancel what is scheduled for it. | No not documented |
From Mailchimp's own pricing and documentation, last verified 16 September 2026. A “No” means not offered or not documented on that date. Everything else is on SendRaven vs Mailchimp.
What moves
What comes across, and what you rebuild.
| In Mailchimp | In SendRaven |
|---|---|
| Contacts, names | Email Address, First Name, Last Name are matched automatically. |
| Tags | The TAGS column, comma-separated. Lower-cased on import; "VIP" and "vip" become one tag. |
| Merge fields | Any other column becomes a custom property, typed from its values. Mailchimp's own telemetry (MEMBER_RATING, OPTIN_IP, LATITUDE and so on) is ignored by default. |
| Groups | Each group appears as its own column. Import it as a property, or as a tag; for a preference people manage themselves, make it a topic and load it with POST /v1/topics/{key}/import. |
| Unsubscribed and cleaned | The separate files, imported with "everyone in this file is unsubscribed" and "…bounced". |
| Templates | Export each as HTML and replace merge tags with {{variables}}. The unsubscribe link and headers are added by SendRaven. |
| Automations | Rebuilt as SendRaven automations. Customer Journeys do not export. |
Migrate with MCP
Or hand the export to your agent.
Connect SendRaven's MCP server to an agent that can read files, such as Claude Code or Cursor, point it at the unzipped export, and ask. It works through the same tools and the same limits as the API key it holds, so an agent on a key with approval turned on can prepare the migration and cannot send the campaign.
The agent can add and verify the sending domain (add_sending_domain, verify_sending_domain), import contacts with their status and tags (import_contacts, up to 5,000 per call), size the result (count_segment), and draft and preview the first campaign (create_broadcast, preview_broadcast).
My Mailchimp export is unzipped in ./mailchimp-export.
1. Import subscribed_members_export.csv into the SendRaven
audience "Newsletter" with names, tags and merge fields.
Tag anyone with MEMBER_RATING 4 or 5 as mc-engaged.
2. Import unsubscribed_members_export.csv with status
unsubscribed, and cleaned_members_export.csv with status
bounced. Use source "Mailchimp". Skip the non-subscribed file.
3. Report the counts from every import, and compare the
suppressed total with the number of rows in those two files.
4. Draft a campaign from news.example.com to the saved segment
"mc-engaged", preview it, and do not send it.- Opt-outs go in before any campaign exists. The import never resubscribes someone who opted out, so asking the agent to run it again is safe.
- The audience and the saved segment on the mc-engaged tag are created in the dashboard, or with POST /v1/audiences and POST /v1/segments; the MCP server has no tool for either.
- Every contact passed to import_contacts goes through the model's context. That is fine for a few thousand. For a larger list, ask the agent to write a short script that posts the same rows to POST /v1/audiences/{id}/contacts in batches of 5,000, or use the dashboard's CSV import: the result is the same.
- Publishing the DNS records is still yours. The Domains page lists each record with a guide for your DNS provider.
Connect the SendRaven MCP server to your client, then paste the prompt with your own audience, segment and domain names.
The file
What the export looks like, and how the import reads it.
Every file has the same columns: "Email Address", "First Name", "Last Name", "Address", "Phone Number", "TAGS", then Mailchimp's housekeeping (MEMBER_RATING, OPTIN_TIME, OPTIN_IP, CONFIRM_TIME, LATITUDE, TIMEZONE, LAST_CHANGED, EUID, NOTES and so on), and one column per merge field and per group.
The unsubscribed file adds UNSUB_TIME, UNSUB_CAMPAIGN_TITLE and UNSUB_REASON; the cleaned file adds the time it was cleaned. Those are how the import recognises which file it is looking at.
"Address" is the postal address. The import knows the difference from "Email Address", but if you ever rename headers, keep the word email in the address column.
The part that matters
Bring the opt-outs.
Mailchimp's unsubscribed members and cleaned members are the list you must not lose. Cleaned means the address hard bounced; Mailchimp stopped sending to it and so should you. Import the unsubscribed file with the status "everyone in this file is unsubscribed" and the cleaned file with "…bounced". The first suppresses each address for marketing, the second for everything.
Do this before the first campaign, not after. If you only import the subscribed file, SendRaven has no way of knowing those people exist, let alone that they opted out.
Templates and sending
The copy and the code.
Mailchimp templates export as HTML: Campaigns → Templates, the dropdown next to the template, Export as HTML. Paste the HTML into a SendRaven template and replace the merge tags: *|FNAME|* becomes {{first_name}}, *|EMAIL|* becomes {{email}}, and a custom merge field becomes {{its_key}}. Remove *|UNSUB|* and the footer around it. SendRaven adds the unsubscribe link and the List-Unsubscribe headers to every marketing send itself.
The drag-and-drop layouts do not survive the trip as editable blocks, only as the HTML they produced. That is fine for a newsletter; it is the reason to keep the design simple.
Mandrill, if you used it for transactional mail, is a separate migration: it is an API, and the switch is the same as from any sending API: verify the domain, replace the send call, keep the old key alive for a day.
# The same import, from the API. One file at a time, with its status.
curl -X POST https://api.sendraven.ai/v1/audiences/aud_123/contacts?source=Mailchimp \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '[
{ "email": "ana@example.com", "first_name": "Ana", "tags": ["vip"], "status": "subscribed" },
{ "email": "bo@example.com", "status": "unsubscribed" },
{ "email": "cy@example.com", "status": "bounced" }
]'What it costs
Estimate the bill by emails sent, not contacts.
- Emails a month
- 200,000
- SendRaven, Standard plan
- $85.00 a month
- For the 50,000 contacts
- $0
On a new sending domain, the first campaign to all 50,000 goes out over 8 days: the warm-up pauses it at each day's ceiling and resumes it at midnight UTC. The ceiling keeps rising for 14 days from the first send, then comes off. Published plan prices, before tax. Transactional mail, if you move it too, counts on the same meter; replies are never metered.
Then, in order
The steps every migration shares.
Verify your domain first
Add the domain under Domains and publish the DNS records it gives you. Use a subdomain you have not sent from before if you can (mail.yourdomain.com for transactional, news.yourdomain.com for campaigns), so the two reputations stay separate. Nothing sends until this is green, and it can take a while for DNS to settle, so start it before the export.
Import the subscribers
Contacts → Import a CSV. Pick or create the list, upload the export, and check the column mapping: address, names, tags, and which columns become custom properties. Re-running the same file is safe: existing contacts are updated, not duplicated.
Import the opt-outs
Then the unsubscribed, bounced and complained lists, with the matching status. Each one is flagged and suppressed before your first send: unsubscribes for marketing only, bounces and complaints for everything. An import never resubscribes someone who has opted out here.
Check the counts
The audience page shows how many were imported, updated and suppressed. Compare the suppressed count to what the old provider reported. If it is far off, the status column was read differently from how you meant. The mapping step shows what each value became.
Switch the API key
For transactional mail, point the code at POST /v1/emails with a SendRaven key. The request shape is from, to, subject, html or text, and an Idempotency-Key header. Keep the old key alive for a day in case something still points at it.
Send the first campaign to the engaged part of the list
A new domain has no history, and mailbox providers judge it on the first few thousand messages. Opens and clicks start from your first SendRaven send, so use the old provider's engagement: tag the recently engaged people on import, send the first campaign to a segment on that tag, then widen. A new sending domain also warms up, so a large first campaign spreads over several days on its own. The reputation gate refuses a campaign once the bounce or complaint rate is already high; it cannot refuse the one that gets you there.
Safe cut-over
Run both for a cycle, and keep a way back.
- Keep the Mailchimp account and plan for one billing cycle. Importing into SendRaven changes nothing there, so going back is sending the next campaign from Mailchimp.
- Split the list; never double it. Send the first SendRaven campaigns to the engaged segment and keep mailing everyone else from Mailchimp, then move the rest across as the new domain's warm-up allows. Nobody should get the same campaign from both.
- While both are live, opt-outs have to travel both ways. Before each SendRaven campaign, export Mailchimp's unsubscribed and cleaned members again and re-import them. Before each Mailchimp campaign, add the people who unsubscribed at SendRaven (the Suppressions page, or GET /v1/suppressions) to Mailchimp.
- Cut over once the whole list has had a SendRaven campaign and its bounce and complaint figures look like Mailchimp's did. Then downgrade Mailchimp, after one last export of its unsubscribes.
Questions
Asked by people leaving Mailchimp.
What about people who are "pending"?
Pending means they signed up but never confirmed double opt-in. They did not opt out, but they did not opt in either. The import leaves them out rather than guessing, and the mapping step says how many there were. If you want them, ask them again from SendRaven with a confirmation email.
Do my Mailchimp groups become anything?
A group is a column in the export, so it imports as a custom property or a tag. If people manage that preference themselves (product updates yes, promotions no), create a topic for it and load the members with the topics import endpoint, so the preference page shows it and an opt-out from one topic does not touch the others.
Will my open and click history come across?
No. Engagement dates start from your first SendRaven send. For the first campaign, use Mailchimp's own engagement to pick the segment (export only the members it rates as engaged) rather than mailing the whole list from a domain with no history.

Start with the domain.
3,000 emails a month, inbound included, and no charge until you switch paid sending on. Verify the domain today and import the list once the DNS has settled. The other guides are on the migrate page.

