Skip to content

ConvertKit (Kit) → AcelleMail Migration — Visual Walkthrough

Export subscribers from ConvertKit (now Kit), import into AcelleMail in 6 clicks. Visual walkthrough on both sides with API-driven option.

Before you start

You'll need:

  • A ConvertKit (Kit) account with subscriber-export permission
  • An AcelleMail installation up and running
  • ~30 minutes for <100k subscribers

ConvertKit was rebranded to Kit in 2024. The UI shifted but the export flow remains the same — this guide uses the current Kit screen names.

Export from Kit (ConvertKit)

In Kit's top nav, click Subscribers. Filter by tag, segment, form, or "all subscribers" — whichever scope you want to migrate. Then click Export in the toolbar.

Kit asks for format (CSV) and field selection — pick all the custom fields you've defined. The file prepares in the background; Account → Imports & Exports shows the download link when ready (usually <5 minutes).

Exported CSV includes: email, first name, all custom fields, tags (comma-separated), confirmed-at timestamp, source.

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 Kit (ConvertKit) automations

Kit's automations (formerly called "sequences" + "rules") map to AcelleMail's Automations. Equivalent triggers:

Kit trigger AcelleMail trigger
Subscribes via form Subscribed to list
Tag added Tag added
Clicks link in email Link clicked
Purchases (via integration) Custom event (API)
Date condition Date relative
Form submission Subscribed to list (form's target list)

Kit's "Visual Automations" (drag-and-drop sequence builder) closely mirror AcelleMail's automation canvas — the rebuild is largely 1:1 with the same node primitives.

Merge-tag syntax differences

Kit (ConvertKit) AcelleMail
{{ subscriber.first_name }} {{ subscriber.first_name }} (no change!)
{{ subscriber.email_address }} {{ subscriber.email }}
{{ subscription.unsubscribe_url }} {{ unsubscribe_url }}

Kit uses Liquid templating, very close to AcelleMail's own syntax. Most templates copy-paste with only the email_addressemail rename and unsubscribe-URL rename.

Advanced: API-driven migration with Kit's subscribers endpoint

Export from Kit via API:

# Kit (v4) API key from Account → API & Apps
curl -X GET "https://api.kit.com/v4/subscribers?per_page=1000" \
  -H "Authorization: Bearer <KIT_API_KEY>" \
  -o kit-subscribers.json

Paginate via after cursor; loop until response pagination.has_next_page is false.

Import into AcelleMail:

ACELLE_TOKEN="..."
ACELLE_LIST_UID="..."

jq -c '.subscribers[] | {email: .email_address, first_name: .first_name}' kit-subscribers.json \
  | while read sub; do
      curl -X POST "https://acellemail.com/api/v1/subscribers" \
        -H "Authorization: Bearer $ACELLE_TOKEN" \
        -d "{\"list_uid\":\"$ACELLE_LIST_UID\",\"subscriber\":$sub}"
    done

For Kit's "Commerce" features (paid subscriptions, products), AcelleMail doesn't have direct equivalents — those workflows typically stay on Kit or move to a dedicated subscription tool.

Related articles

29 comments

19 comments

  1. Linh
    for the IP warmup — is dedicated IP worth it at 25k subscribers? Or stick with shared SES?
    1. Admin
      Shared SES at 25k. Dedicated IPs want north of 100k sends a month to hold a reputation, below that you just collect cold-IP penalties between sends.
  2. Lucas
    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...
    1. Admin
      You're right that the 8 weeks assumes marketing only. The walkthrough was written for the broadcast/sequence side and it should say so up front instead of leaving people to find out at week 6. Transactional is a different job anyway. It's not a list import, it's every service that calls out to send a receipt or a reset link, and each of those has its own retry logic, templates and failure handling to re-point. 4-6 weeks sounds about right for anything with a few integrations, more if the sends are scattered across services nobody owns anymore. I'll add a scope note at the top of the article and a short section on what changes when transactional is in the picture. If you went through that rewiring yourself and remember where the time actually went, tell me and I'll put the real breakdown in rather than my guess at it.
  3. Tomas
    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.
  4. Carlos
    year 1 cost ended up matching this guide's estimate almost exactly. Year 2 was even better because the VPS upgrade we needed was one-time $20/mo bump.
    1. Admin
      That's the whole shape of the cost difference, and it's worth naming. Kit re-prices you every time you cross a subscriber tier, so year 2 costs more than year 1 by default. A VPS bump is a step you take once and then flatten out on. If you can say what list size and monthly send volume triggered the $20 bump, I'll add it to the sizing table in the guide. That section is vaguer than it should be.
  5. David
    Does this guide assume self-hosted Acelle or does it work with the hosted offering too?
    1. Admin
      Both. Only difference is the sending server section, which is already done for you on hosted. Self-hosted, set up SMTP/SES before the first send or the migrated campaigns just queue.
  6. Emma
    What about subscribers who unsubscribed via Mailchimp's preference center? Does the suppression-list import capture those, or just outright unsubscribes?
    1. Admin
      Full opt-outs go to `unsubscribed` and get picked up. Group-level opt-outs stay `subscribed`, so they're not in any suppression list. Export the audience with group columns and map those to lists or tags.
  7. James
    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.
  8. Anna
    genuinely useful. the 'common pitfalls' section especially — that's where most migration guides hand-wave fwiw
  9. Hùng
    i'd push back on the 'random recipient split' for the parallel period. if your campaigns are time-sensitive (flash sales etc), random splitting causes weird timing fragmentation. we split by audience segment instead — simpler ops
    1. Admin
      Fair. Random split exists in the walkthrough for one narrow reason: it keeps deliverability signals comparable between the two ESPs while you're still deciding, since the same segment can have very different engagement. For flash sales that tradeoff is worthless, you just want everyone hit at once. Segment split is the better default for anything time-sensitive, and honestly for most people running a short parallel period. I'll rewrite that section to lead with segment split and keep random as the "I'm A/B testing the ESPs themselves" case.
  10. Priya
    Adding: don't forget to igrate your webhook integrations too. We forgot ours and Shopify-cart-recovery silently stopped working for 3 weeks before anyone noticed.
  11. Isabella
    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 wouldnt have caught at 100% cutover
  12. Aisha
    How do you handle the Mailchimp-style merge tags in old templates? We have ~50 templates with *|FNAME|* and don't want to manually rewrite each.
    1. Admin
      No auto rewriter yet. Find-and-replace the exported HTML before import, it's a fixed substitution table once you've named your custom fields. Watch the *|IF:...|* blocks, those have no equivalent.
  13. Minh
    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
      Two includes in one SPF record don't affect alignment at all. Alignment is decided by the domain in your envelope Return-Path versus the domain in your From: header, so it doesn't matter how many include mechanisms are sitting in the record or whose they are. Strict vs relaxed only changes whether a subdomain Return-Path counts, and that's a property of your bounce domain setup, not of the include list. What the "add alongside old" step can actually break is the 10 DNS lookup limit. ConvertKit's include plus ours plus whatever else you already have (Google, a CRM, a helpdesk) adds up fast, and blowing past 10 gives you a permerror, which most receivers treat as an SPF fail. Check the count before you add the second include, and drop the ConvertKit include as soon as your last broadcast from them has drained. I'll add a note about the lookup limit to that step in the article, it's a fair gap.
  14. Ravi
    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 youll need that reference during the rebuild.
    1. Admin
      Same for Kit. The CSV export doesn't carry the tag-to-sequence links, so screenshot every automation's trigger before you cancel.
  15. Quân
    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
  16. Brian
    the cost-comparison table is the only honest one ive seen. most 'acellemail vs x' content underestimates the ops cost of self-hosting...
  17. Akira
    Bookmarked. We're evaluating a move next quarter and this is the most operationally-realistic guide I've found
  18. Rafael
    Did this last year. Confirming: the cron + worker setup is 80% of the install pain. Once those are running, the rest is documentation-following.
    1. Admin
      That matches what we see in support. The ConvertKit export itself is boring, one CSV per sequence plus the subscriber dump, and the import screen handles it. Then people hit the cron and queue worker step and stall there, usually because the cron is added under the wrong user so it runs but can't write to storage/logs. If the sequences you migrated stayed idle after import, that's almost always the worker, not the mapping. I'd rather this article said that up front instead of at the end, so I'll move the cron/worker section above the export walkthrough.
  19. Sofia
    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 OM-prefixed UTF-8) that would've affected all 60k rows.

More in Migration & Comparison