Skip to content

Mailchimp → AcelleMail Migration — A Visual Walkthrough

Export contacts from Mailchimp's Audience screen, import into AcelleMail in 6 clicks. This guide covers the UI on both sides; advanced API-driven migration in the collapsible section for power users.

Before you start

You'll need:

  • A Mailchimp account with audience access (Member, Manager, or Owner role)
  • An AcelleMail installation up and running (any version 4.0+)
  • ~30 minutes for a list of <50k subscribers; longer for larger or for rebuilding automations

This guide walks the visual flow on both ends. No CLI required for the standard path.

Export from Mailchimp

In Mailchimp's left sidebar, click AudienceAll contacts. On the contacts page, click Export Audience in the top-right toolbar.

Mailchimp prepares a CSV in the background — refresh after ~30 seconds, the Download button activates. The file includes: email, every merge field (FNAME, LNAME, custom), tags (comma-separated), opt-in timestamps, source.

For campaign reports (open/click data), open any campaign → View ReportExport. This is optional for the migration itself; useful only if you want to import engagement history.

Import into AcelleMail (the same 6 clicks for every source)

Once you have the CSV exported from your previous platform, the import flow in AcelleMail is identical regardless of where the data came from.

1. Open your destination list

In AcelleMail's sidebar, click Audience → choose the list that will receive the migrated subscribers (or create a new one — New list button top-right).

Lists index

You'll see a per-list overview card with subscriber counts:

List overview

2. Click "Import" in the list toolbar

The wizard entrypoint is on the list detail page:

Import entry point

3. Upload your CSV

Drop the CSV file from the previous platform into the upload area:

Upload empty state

AcelleMail parses the file and confirms detection:

Upload success

4. Map the columns

The wizard auto-detects standard columns (email, first_name, last_name) and shows green Mapped to EMAIL chips. Adjust manually for any non-standard column from the source:

Map columns

5. Pick duplicate handling

In the same screen, choose what AcelleMail does when a subscriber already exists in this list:

  • Skip — keep the existing row, don't overwrite
  • Update — overwrite name/tags/custom fields with values from the CSV
  • Unsubscribe — mark existing rows as unsubscribed (rare; used when re-importing an opted-out list)

6. Run the import

Click Start import. The job runs in the background — close the popup, work elsewhere, return to Audience → [list] → Import to see progress:

Import history

You'll see PendingRunningComplete per import job, with rows-imported / rows-skipped / errors counts.

After the import

  • Verify list count matches your expected size (rows that failed validation appear in the Errors column with a downloadable error CSV).
  • Re-tag if needed — for behavioural data that doesn't fit a CSV column (e.g. "opened campaign X"), you may need to re-create the tag via segmentation rules.
  • Pause for warm-up — if the imported list is large (>10k) and your sending IP is new or recently rotated, run a short warm-up campaign to your most-engaged 10% before the full send. See IP warm-up best practices for the schedule.

Re-creating automations

Mailchimp's "customer journeys" map roughly to AcelleMail's Automation workflows (sidebar → Automations). The trigger types align:

Mailchimp journey trigger AcelleMail automation trigger
Joins audience Subscribed to list
Tag added Tag added
Campaign sent Campaign sent
Date in field Date relative
API event Custom event

Re-build each journey by clicking Automations → New automation → pick the equivalent trigger → add the same delays and email steps. Visual builder, no code.

Merge-tag syntax differences

Mailchimp uses *|FNAME|* for merge tags; AcelleMail uses {{ subscriber.first_name }}. The AcelleMail email builder has a merge-tag picker (right-side panel in the builder) — click to insert, no syntax to remember.

For raw HTML imports, find/replace patterns:

Mailchimp AcelleMail
`* FNAME
`* LNAME
`* EMAIL
`* UNSUB
`* ARCHIVE
Advanced: API-driven migration for large lists or scripted workflows

For lists >500k or for automation-heavy installs where you want to script the full migration, AcelleMail's REST API supports bulk subscriber creation + tagging.

Export from Mailchimp via Marketing API:

# Mailchimp dc = your datacenter (e.g. us21). API key from Audience → Settings.
curl -X GET "https://us21.api.mailchimp.com/3.0/lists/<list_id>/members?count=10000&offset=0" \
  -u "anystring:<MAILCHIMP_API_KEY>" \
  -o mailchimp-members.json

Paginate via offset until response members is empty.

Import into AcelleMail via REST API:

# AcelleMail API token from /account/api-tokens
ACELLE_TOKEN="..."
ACELLE_LIST_UID="..."

# One-at-a-time create (slow but reliable):
jq -c '.members[] | {email: .email_address, first_name: .merge_fields.FNAME, last_name: .merge_fields.LNAME, tags: [.tags[].name] | join(",")}' mailchimp-members.json \
  | while read subscriber; do
      curl -X POST "https://acellemail.com/api/v1/subscribers" \
        -H "Authorization: Bearer $ACELLE_TOKEN" \
        -H "Content-Type: application/json" \
        -d "{\"list_uid\":\"$ACELLE_LIST_UID\",\"subscriber\":$subscriber}"
    done

For >100k rows, the CSV import path through the UI is still faster (AcelleMail batches the inserts internally) — the API path is for when you need scripted reproducibility (e.g. CI-driven nightly sync from a CRM-of-record).

Programmatic automation rebuild is less common — every automation platform has subtly different step semantics, so manual rebuild via the visual builder is usually more reliable than scripting. The AcelleMail automation export/import API exists but mirrors AcelleMail's internal flow JSON, not Mailchimp's journey format.

Related articles

19 comments

15 comments

  1. Nadia
    For the IP warmup — is dedicated IP worth it at 25k subscribers? Or stick with shared SES?
    1. Admin
      Stick with shared SES. A dedicated IP wants 50k-100k/month on a regular schedule to stay warm. If you go weekly to that 25k, revisit it.
  2. Mai
    Completed this migration in Q1. The list-cleanup step is even more important than this guide makes it. We had 40k subscribers, exported, found that 6k were already on Mailchimp's suppression list. Importing those would've torched our new sender reputation.
    1. Admin
      6k out of 40k is a 15% hit, that's a real sender-reputation grenade and the guide undersells it. The export step in the walkthrough only covers the subscribed audience, which is why the suppression entries slip past people. Mailchimp keeps unsubscribed and cleaned addresses in separate exports from the main audience CSV, so you have to pull those too and diff them out before the import, not after. I'll rewrite the list-cleanup section to make that a hard step with the diff instructions instead of a note. If you still have the process you used to reconcile the two files, send it to [email protected] and I'll work it in and credit you.
  3. Aditi
    The 8-week timeline is reasonable for marketing-only migrations. If you have transactional email integrated (order confirmations, password resets), add 4-6 more weeks for the API rewiring. That part is underestimated everywhere.
  4. Thuỳ
    Reading this 2 weeks into our Mailchimp migration. The 8-week timeline is conservative but accurate — we tried to compress to 4 weeks and got bitten by exactly the DNS warmup mistake you describe.
  5. Sarah
    Tip for anyone planning this: do a dry-run of the import with a small test list first. We caught a CSV encoding issue (Excel saved BOM-prefixed UTF-8) that would've affected all 60k rows.
  6. Hùng
    what about subscribers who unsubscribed via Mailchimp's preference center? Does the suppression-list import capture those, or just outright unsubscribes?
    1. Admin
      Depends on what they did in the preference center. If they opted out of everything, Mailchimp flips their status to Unsubscribed and they land in the unsubscribed export, so the suppression import picks them up the same as a one-click unsubscribe. If they only deselected some groups or interests, Mailchimp keeps their status as Subscribed and that choice lives in the group fields, not in the status. Nothing in the suppression import knows about it, and those people will get everything you send unless you rebuild the segmentation on our side. Practical version: export your audience with the group columns included, not just the unsubscribed segment, and turn each group into a separate list or a tag before your first send. The walkthrough doesn't say this clearly enough. I'll add a note to the suppression-list step.
  7. Olufemi
    If your Mailchimp account has automations triggered by tags, document them carefully BEFORE export — the audit log goes away when you cancel the account and you'll need that reference during the rebuild.
  8. Lucas
    The cost-comparison table is the only honest one I've seen. Most 'AcelleMail vs X' content underestimates the ops cost of self-hosting
  9. Daniel
    Genuinely useful. The 'common pitfalls' section especially — that's where most migration guides hand-wave.
  10. Rafael
    Question on DNS migration step — when you say 'add new include alongside old', does that work with strict DMARC alignment or does mixing two SPF includes break the alignment check?
    1. Admin
      Mixing includes doesn't touch alignment. SPF alignment under DMARC only cares whether the Return-Path (envelope from) domain matches your From domain, and the number of includes in that record is irrelevant to the match. A record with both Mailchimp's and ours in it aligns exactly as well as one with either alone. The thing that actually bites during the overlap is the 10 DNS lookup limit. Mailchimp's include is a few lookups on its own, ours is a couple, and if you already have Google Workspace or a helpdesk in there you can tip over into permerror, which does fail SPF and does break alignment. Check the count with a lookup counter before you flip anything, not after. Keep both includes until the old sends drain, then drop Mailchimp's. If you're near the limit and can't wait, DKIM alignment alone is enough for DMARC to pass, so you're not exposed while you sort SPF out.
  11. Minh
    year 1 cost ended up matching this guide's estimate almost exactly. year 2 was even better because the vps upgrade we needed was a one-time $20/mo bump.
  12. Vera
    Did this last year. Confirming: the cron + worker setup is 80% of the install pain. Once those are running, the rest is documentation-following
  13. Carlos
    bookmarked. We're evaluating a move next quarter and this is the most operationally-realistic guide I've found... 👀
  14. Linh
    We migrated 90k subscribers last March. The parallel period suggestion (10-25-50-75) saved us — the AcelleMail side hit a deliverability dip on day 3 we wouldn't have caught at 100% cutover.
  15. James
    Pro tip: keep the Mailchimp account at the free tier for 90 days post-cutover, not 30. We had a partner system still calling the Mailchimp API and we wouldn't have known if we'd canceled at 30.

More in Migration & Comparison