Before you start#
You'll need:
- A Brevo account with contact-list export permission
- An AcelleMail installation up and running
- ~30 minutes for <50k contacts
Export from Brevo#
In Brevo's left sidebar, click Contacts → Lists → choose the list to export. On the list detail page, click Export contacts in the top-right.
Brevo asks for export format — pick CSV. The file is prepared in the background; check Export history for the download link (usually <2 minutes).
The exported CSV includes: email, all custom attributes (FIRSTNAME, LASTNAME, custom fields), list memberships, opt-in date, blacklist status.
For attribute mapping, note Brevo's field names — they map to AcelleMail's custom fields in the next step.
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.
Rebuilding workflows#
Brevo's "automations" map to AcelleMail's Automation workflows. Equivalent triggers:
| Brevo trigger |
AcelleMail trigger |
| Subscribed to list |
Subscribed to list |
| Custom attribute change |
Field value change |
| Date attribute matches |
Date relative |
| Webhook event |
Custom event (API) |
| Email opened/clicked in campaign |
Link clicked |
Re-create each automation via Automations → New automation in AcelleMail — same drag-and-drop builder, same step types.
Merge-tag syntax differences#
Brevo uses {{contact.FIRSTNAME}}; AcelleMail uses {{ subscriber.first_name }}. Find/replace patterns:
| Brevo |
AcelleMail |
{{contact.FIRSTNAME}} |
{{ subscriber.first_name }} |
{{contact.LASTNAME}} |
{{ subscriber.last_name }} |
{{contact.EMAIL}} |
{{ subscriber.email }} |
{{mirror}} |
{{ web_view_url }} |
{{unsubscribe}} |
{{ unsubscribe_url }} |
Advanced: API-driven migration for large lists
For lists >500k or scripted CI-driven sync, both platforms expose REST APIs.
Export from Brevo via API:
curl -X GET "https://api.brevo.com/v3/contacts?limit=1000&offset=0" \
-H "api-key: <BREVO_API_KEY>" \
-o brevo-contacts.json
Brevo's API returns 1000-row pages; paginate via offset.
Import into AcelleMail via REST API:
ACELLE_TOKEN="..."
ACELLE_LIST_UID="..."
jq -c '.contacts[] | {email: .email, first_name: .attributes.FIRSTNAME, last_name: .attributes.LASTNAME}' brevo-contacts.json \
| while read subscriber; do
curl -X POST "https://acellemail.com/api/v1/subscribers" \
-H "Authorization: Bearer $ACELLE_TOKEN" \
-d "{\"list_uid\":\"$ACELLE_LIST_UID\",\"subscriber\":$subscriber}"
done
The CSV-through-UI path is faster for one-time migration; API path is for scheduled sync.
Related articles#