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 Audience → All 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 Report → Export. 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).

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

2. Click "Import" in the list toolbar#
The wizard entrypoint is on the list detail page:

3. Upload your CSV#
Drop the CSV file from the previous platform into the upload area:

AcelleMail parses the file and confirms detection:

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:

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:

You'll see Pending → Running → Complete 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#