Migration guide
Migrate from Mailchimp to Volanea.
This migration is less about a send call and more about moving a list and its automations — Mailchimp is app-first, Volanea is API-first. The payoff: no per-contact billing (Mailchimp charges even for unsubscribed contacts), and transactional email included instead of a Mandrill add-on.
Undecided? Read the honest Volanea vs Mailchimp comparison first.
Create the project and verify your domain
Sign up (free, no card), add your sending domain, and install the DKIM/SPF records Volanea shows you — fresh records, separate from Mailchimp's. Keep Mailchimp live for now: nothing gaps while DNS propagates, and verification is one click once it does.
Swap the send call
This is the heart of it — one call replaced by one call. Grab your secret key from project settings first.
before — mailchimp transactional (mandrill)
import mailchimp from "@mailchimp/mailchimp_transactional";
const client = mailchimp(process.env.MANDRILL_API_KEY!);
await client.messages.send({
message: {
from_email: "shop@yourdomain.com",
to: [{ email: "ada@example.com" }],
subject: "Your order shipped",
html: "<p>On its way, Ada.</p>",
},
});after — volanea
// npm i @volanea/sdk (or plain fetch — it's one POST)
import { Volanea } from "@volanea/sdk";
const volanea = new Volanea({ apiKey: process.env.VOLANEA_SECRET_KEY! });
await volanea.send(
{
to: "ada@example.com",
subject: "Your order shipped",
html: "<p>On its way, {{firstName}}.</p>",
variables: { firstName: "Ada" },
},
{ idempotencyKey: "order-4921" }, // retries become safe replays
);- The audience move is the real work: export from Mailchimp (Audience → Export), import the CSV into Volanea — columns map by header, unsubscribed status is preserved.
- Mailchimp merge tags (*|FNAME|*) become {{firstName}}-style variables in Volanea templates.
- Campaigns are created via dashboard or API; automations rebuild as workflows triggered by events, segment entry, or contact creation.
Bring your contacts
Export your list from Mailchimp as CSV and import it in the Volanea dashboard (or POST /v1/contacts/import). Columns map by header, imports run as a background job with live progress, and re-runs dedupe by email — a partial import is never a disaster. Unsubscribed contacts keep their status, so nobody who opted out gets mailed by mistake.
Re-point your webhooks
Register your endpoint in Volanea (the response includes the whsec_… signing secret), then translate the event names your handler listens for:
| Mailchimp | Volanea |
|---|---|
| send | email.sent |
| open | email.opened |
| click | email.clicked |
| hard_bounce | email.bounced |
| spam | email.complained |
| unsub | contact.unsubscribed |
Every delivery is HMAC-signed in the X-Volanea-Signature header and retried with backoff for ~24 hours — the docs include a drop-in verifier.
Test, then flip
Send through your test key (sk_test_…) first — messages render and log fully but deliver nothing, so you can assert on the whole pipeline in CI. When the domain is verified and the test sends look right, swap in the live key, watch the first real sends land in the dashboard, and retire the Mailchimp credentials.
Watch for the gotchas
- Export the unsubscribed and cleaned segments too, not just subscribers — importing them preserves suppression, which protects your new domain's reputation.
- Mailchimp's drag-and-drop templates export as HTML — paste into a Volanea template and swap merge tags for {{variables}}.
- There's no visual editor here; if a non-technical marketer builds your emails from scratch weekly, weigh that honestly before moving.