Skip to content

Brevo (Sendinblue) → AcelleMail Migration — Visual Walkthrough

Export contacts from Brevo, upload to AcelleMail in 6 clicks. UI walkthrough on both sides plus optional API-driven migration for large lists.

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 ContactsLists → 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).

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.

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

12 comments

9 comments

  1. femi.adeyemi
    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
  2. danrey.dev
    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.
  3. emma.whitaker
    How do you handle the Mailchimp-style merge tags in old templates? We have ~50 templates with *|FNAME|* and dont want to manually rewrite each.
    1. admin
      Good catch. The bounds (200/32) are hardcoded in the runtime. We've discussed making them configurable; not a near-term priority but it's tracked.
  4. ravi.kumar.del…
    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.
  5. y.yamamoto
    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...
  6. linhpm.devs
    genuinely useful. the 'common pitfalls' section especially — that's where most migration guides hand-wave
  7. anna.k.pm
    Does this guide assume self-hosted Acelle or does it work with the hosted offering too?
    1. admin
      There's no built-in way today. Two workarounds: (1) cron + custom script polling the API every N minutes, (2) webhook-driven if your event source supports it. Most operators go with #2.
  8. aditi.s.bom
    What about subscribers who unsubscribed via Mailchimp's preference center? Does the suppression-list import capture those, or just outright unsubscribes?
    1. admin
      we don't recommend that approach in production. it works in dev but has subtle race conditions under concurrent load. stick with the documented pattern.
  9. v.petrova.ru
    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.

More in Migration & Comparison