By James Crook — GHL specialist, helpful nerd, and founder of AC2GHL.com
Switching from ActiveCampaign to GoHighLevel is a good move. But a major consideration in moving isn't just the benefits of the new software... it's how to get there.
Especially if you've been using ActiveCampaign for any length of time - chances are you've go thousands of contacts, pages of automations, custom fields, notes, a lot of history! How on earth will you get all of it across without losing anything?
That's why I've written this guide. It covers everything.
I've done this migration for dozens of accounts across a bunch of different industries now, and I'm going to walk you through every step and share my own checklist that I use to make sure nothing gets forgotten.
One hurdle that might have lead you here is that contact notes don't come with your CSV export from ActiveCampaign. This is a limitation from AC. Notes are simply not exported into the CSV file.
So, if you want your notes migrated along with everything else, you need API access to pull them out of AC. This isn't particularly difficult if you're a coder used to dealing with APIs and scripts... but for many "normal" GHL users it starts to feel cumbersome.
Which is why, if at any point this feels like too much to tackle yourself, I offer a done-for-you migration service for $299. This service is fixed fee, 48-hr turnaround, notes included, with data verification.
But of course, if you are here because you want to do it yourself, read on!
The number one mistake people make is rushing... which leads to other more serious mistakes. So before you touch anything, spend 30 minutes doing a quick checklist inventory first.
Note the scope of what you have in ActiveCampaign:
How many contacts (and how many are active/subscribed)?
How many lists, and do you actually still use all of them?
How many tags — and are they all still relevant?
Custom fields — what are they called and what data do they hold?
Notes on contacts — do you have important notes that need to come across? (More on this below — notes are NOT included in a standard CSV export from AC)
Deals/pipelines — how many pipelines, how many stages?
Active automations — which ones are actually running right now?
Email campaigns — templates you want to keep?
Forms — where are they embedded?
Write all of this down in a simple spreadsheet is fine. This becomes your migration checklist and your verification document afterwards.
Also check:
Do you have a GHL account already set up, or are you starting fresh?
Is your GHL sub-account ready for the migration destination?
Do you have admin access to both platforms?
Do you have a deadline to complete this? (Ideally, include some overlap)
Get your GHL account ready to receive your data before you start exporting anything.
ActiveCampaign custom fields won't automatically exist in GHL. You need to create them manually before importing contacts, otherwise those fields get lost during import.
In GHL, go to Settings > Custom Fields and recreate every custom field from your AC account. Match the field types as closely as possible:
Important: Copy and paste the exact field names you use in GHL, and what field they are matching in AC. It can get confusing if you have a lot of custom fields. For example I have worked with some health practitioners who have over a hundred custom contact fields that may have similar values and names.
"Deals" from ActiveCampaign are the equivalent of "Opportunities" in GoHighLevel. If you're planning to migrate these then build your pipeline structure in GHL before you import.
Go to Opportunities > Pipelines and create a pipeline that mirrors your AC deal stages.
You don't have to copy it exactly word for word — but you need the stages to exist before you can map deals to them. So I find it's usually easiest to match everything closely and then if any obvious name or stage changes come up, note them down and make the change after everything is mapped across.
GHL creates the tags themselves automatically during import (or whenever a tag is being added), so you don't need to pre-create them at all.
But if you have workflow automations that use tags as triggers, note that those workflows will run! So you need to be aware of what tags are in your system already and what will happen if you import a bunch of new contacts along with their tags. If you're working in a brand new GHL install then there's most likely no automations set up at all yes, so all good.
Log into ActiveCampaign
Go to Contacts in the left menu
Click Export (top right)
Select all the fields you want — usually select them all, but at minimum: Email, First Name, Last Name, Phone, all your custom fields, and Tags
Download the CSV and save it somewhere safe
If you have multiple lists, export them separately so you can tag them appropriately on import (e.g. add a "List: Newsletter" tag during import to preserve list membership logic).
Open the CSV in Google Sheets or Excel and do the following:
Remove duplicate rows (filter by email and check for duplicates)
Fix phone number formats – GHL requires E.164 format (eg. +14155551234)
Fix date formats — GHL requires YYYY-MM-DD (eg. 2024-03-15, not 15/03/2024)
Save as UTF-8 — this prevents special characters from breaking on import
Remove line breaks and emojis from any text fields
Check for obviously broken emails (missing @, no domain, etc.)
Check your Tags column — AC exports tags as a comma-separated list in one cell, which GHL usually handles fine, but check it looks correct
You can do these updates in your spreadsheet software (eg Excel) then save as a new CSV so you can always get back the originals if you need to try again. Getting a clean CSV at this point saves you headaches later, but sometimes it takes a couple of failed imports to discover and fix any problems.
In GHL, go to Contacts > Import Contacts
Choose whether you're importing Contacts only, or Contacts + Opportunities
Upload your cleaned CSV
Map your fields carefully. The field mapping screen shows each column in your CSV on the left, and asks you to match it to a GHL field on the right. Take your time here. Mistakes in field mapping mean data ends up in the wrong place or gets lost entirely.
On the next screen, you can assign additional tags to all contacts in this import — use this to tag them as "Imported from ActiveCampaign" and the date, for verification purposes
Click Import and wait for it to process
For large lists (over 10,000 contacts), split your CSV into separate files of 5,000 to avoid timeout issues.
When working with large imports I also like to make a "test" CSV of the first 50 lines, so I can test if it's working before committing to the whole file.
Don't just assume it worked. Open 10–15 random contacts and verify:
Name and email correct?
Custom fields populated? (Check for blank fields where you know there should be values)
Tags applied?
Email subscription status correct?
If anything looks wrong, fix it now before you go any further. If you change values in the CSV file to fix a problem, doing another import will over-write the values based on the contact's email address and phone – so you can redo the test import and see if your values are updated correctly.
This step is only needed if you actively use Deals in AC. If you don't use Deals then you can skip this step entirely.
In ActiveCampaign, go to Deals
Use the filter to select the deals you want (typically Open deals, but you may want Won/Lost too for history)
Click the gear icon > Export
Download the CSV
Your deals CSV should include: Deal Title, Value, Stage, Pipeline, Contact Email, Owner, and any relevant custom deal fields.
GHL can import Contacts and Opportunities together from a single CSV, or separately. I prefer to do them separately simply so that if something goes wrong at any stage there's less mess to wade through.
If your deals CSV includes the contact's email address, GHL will link the opportunity to the existing contact record.
To import:
Go to Contacts > Import Contacts
Select Contacts and Opportunities
Upload your deals CSV
Map the fields:
Deal Title > Opportunity Name
Value > Opportunity Value
Stage > Pipeline Stage (must match exactly what you created in Step 1)
Contact Email > Email (this links the deal to the contact)
Note: GHL pipeline stages are case-sensitive during import. Meaning that if your stage in GHL is "Proposal Sent" but your CSV says "proposal sent", it won't match. So double-check your stage names.
This is one of the most important sections in this entire guide, because in my businesses and other projects the "notes" are some of the most important data on contacts. It's where we keeps records about calls, conversations, past history, buying behaviour, anything the contact tells us that could be useful.
But – Contact notes are not included in ActiveCampaign's CSV export.
So when you export your contacts, you get all their field data, tags, and list memberships etc – but any notes saved on those contact records or deals stay behind in AC. They're simply not part of the export file.
This matters a lot if your team has been logging call notes, meeting summaries, client history, or anything relationship-critical against your contacts. If you cancel your AC account too early, all that information is gone.
There are three realistic options:
Option A: Export the notes to a CSV using the ActiveCampaign API, then use the GHL API to import them. This is the safest way to do a true notes migration. AC has an API endpoint that returns all notes for a contact, including the note content, date, and author. And GHL API lets you write them in to the new system.
BUT... this option requires coding — you need to be comfortable with API calls, handling pagination, and rate limiting. Even if you're somewhat handy with code this will take some messing around.
Once the notes are exported into a CSV the hardest part is done. But you then have to bring them into GHL.
There's actually two choices: importing the notes into GHL using code via the GHL Notes API is the best way if you have more notes. Or you can import them by uploading a CSV through the Contacts page in GHL (suitable if each contact only has one or two notes).
Option B: Manually copy the most important notes. If you only have a handful of contacts with truly critical notes, copy them by hand into GHL (either do it yourself or have an admin do it if you have one). Low tech but painful, slow and error-prone.
Option C: Leave notes in AC and keep it active as a reference. If it's not critical for your notes to be visible in the GHL immediately, this can be a simple option. You keep your AC account on the cheapest plan for 3-6 months and use it as an archive, then cancel when/if the notes are manually migrated or no longer relevant. You don't lose any data during the crossover... but it's a pain because you're logging into two systems to find what you need.
This is one of the key reasons people use a done-for-you migration service. I can handle the API extraction including notes and import them directly into your GHL contact records, including the original note date and author name. It's included in my ActiveCampaign to GoHighLevel migration service which makes it really easy.
If you're doing this yourself and notes matter to your business, use Option A or B from above.
Here's an important note: you cannot automatically migrate ActiveCampaign automations to GoHighLevel.
Automations have to be rebuilt. Anyone telling you otherwise is misleading you.
That said, rebuilding them in GHL is often better than the original — GHL's workflow builder is more powerful than AC's automation tool and has more options – but does have a learning curve (like any powerful software).
List all your active automations in AC (from your pre-migration checklist)
Screenshot or document each one — entry triggers, conditions, wait steps, emails sent, tags applied, deal movements
Prioritise — which automations are running right now and sending leads or customers through a sequence? Do those first.
Rebuild in GHL Workflows — go to Automation > Workflows > New Workflow
These are the common equivalents to use when triggering your new automations.
ActiveCampaign Trigger = GHL Equivalent
Contact is added to a list = Tag is applied to contact
Form is submitted = Form submitted
Tag is added = Tag applied
Deal stage changes = Opportunity stage changed
Email is opened = Email opened
Link is clicked = Email link clicked
Date-based (birthday, anniversary) = Date is... trigger
While you're rebuilding, take advantage of GHL features that AC doesn't have natively:
SMS messages (no third-party integration needed)
Missed call text-back (game-changer for service businesses)
Voicemail drops
Two-way conversation inbox (SMS + email + FB Messenger in one place)
Appointment booking triggers
AI Conversations
When recreating your automations, you don't have to simply replicate what you had in AC... you can take this opportunity to improve it.
ActiveCampaign email templates can actually be "imported" into GHL using a share link, which is pretty cool.
Here's how to do it:
In ActiveCampaign:
Go to Campaigns > Campaign Templates
Find the template you want
Click the gear icon > Share
Copy the share link
In GoHighLevel:
Go to Marketing > Emails > Email Templates
Click Create New Template > Import Template
Paste the share link
Name it and save
This works reasonably well for simple templates, but complex layouts will need some manual cleaning up in GHL's email builder after import.
Forms need to be rebuilt in GHL. But this is straightforward for basic forms:
Note the fields in each AC form
In GHL, go to Sites > Forms
Create a new form with matching fields
Set the form actions (apply tags, start workflows, etc.)
Update the embed code on your website to point to the new GHL form
PS. Don't remove or replace the old AC forms on your website, until your new GHL forms are live and tested.
Before you redirect any traffic to GHL:
Submit a test contact through each form and verify they appear in GHL correctly
Check that the right tags are applied and the right workflow fires
Send yourself a test email from each workflow
Check your pipeline — does a test deal appear in the right stage?
If you have SMS, test an SMS workflow
Check that appointment booking works if you've set up GHL calendars
Refer to the simple spreadsheet checklist you made at the start of this process, which lists everything to migrate. Test each one.
Once the data migration is done and tested, the next steps ensure you and your team can actually use GHL at least as well as your previous system:
Train your team – if you have a team (whether admin, marketing, sales, delivery or any other) they'll need to know how to do their job in GHL. This might seem obvious but not everyone thinks about how to bring their team along for the ride.
Switch new leads to GHL — update any forms, ads, or lead sources pointing to AC to point to GHL instead
Let existing AC sequences finish — don't abruptly pull contacts out of active AC automations, especially followups or email sequences. Letting them complete the sequence in AC is easier than trying to replicate them into the same step in a new GHL automation.
Keep AC active for 2-4 weeks or longer — just in case you need to go back and refer to something, or discover some data that's been missed during import
Cancel AC — once you're confident everything is running correctly in GHL
Bad phone number format blocks the import: GHL requires that the phone number is imported in the exact E.164 format, basically meaning It has the country code then number, with no other characters like spaces, braces or dashes. Eg +14155551234 in USA or +61412345678 in Aus. However – phone numbers in AC are stored the same way they're typed in, so they are often messy. If GHL receives the wrong number format on import that row will fail (and none of that contact's data is saved). So you need a step to standardise or clean the data, in between the AC export and the GHL import.
Tags not importing: Check that your Tags column in the CSV is comma-separated with no extra spaces. "Tag1, Tag2" (with a space) can cause issues, so use "Tag1,Tag2".
Custom field data missing after import: You probably forgot to create the field itself in GHL before importing, or the field names didn't match exactly during mapping and weren't selected manually. Re-import the contacts with the fields corrected.
Deals not linking to contacts: The email address in your deals CSV doesn't match the email address on the contact in GHL. Check for typos or format differences.
Email deliverability drops after migration: This is a big one, but not directly related to the migration. In GHL you need to set up your sending domain in GHL (DKIM, SPF, DMARC). Don't skip it or your email is almost certain to get marked as spam. Go to Settings > Email Services > Domain and follow the setup process – this topic could be its own walkthrough and is beyond the scope of this page.
Workflows not firing: Check that the trigger conditions are exactly right and the workflows are published. GHL workflows can be picky about tag formatting, contact status, and trigger timing. Test with a fresh test contact.
AC subscription status not preserved: When you export from AC, include the subscription status field. Map it correctly during GHL import to the matching DND field. Or import them with an "unsubscribed" tag instead, and set a proper DND with a workflow automation. And double-check you have it right because this is important! Unsubscribed contacts must stay unsubscribed... this is a legal requirement and also frustrating for contacts if their status is incorrect.
Yes, of course "it depends"... but here's a ballpark for a DIY migration at each stage:
– Pre-migration audit and planning ~ 1-2 hours
– Setting up GHL structure (fields, pipelines) ~ 1-3 hours
– Exporting and cleaning contacts CSV ~ 1-5 hours (Can vary a lot depending on data quality)
– Importing contacts and verifying ~ 1-2 hours
– Migrating deals ~ 1-2 hours
– Migrating notes via API ~ 1-3 hours if you're somewhat technical, more if not
– Rebuilding automations (per automation) ~ 30-90 minutes each
– Rebuilding email templates ~ 30-60 minutes each
– Rebuilding forms 15-30 ~ minutes each Testing 1-3 hours
So in my experience, for a typical small business with 5,000 contacts, 3-6 simple automations, and a handful of forms, expect 1-2 days of work if you're doing it yourself for the first time.
And this is really just the migration – you'll also need to allow time to get familiar with GHL itself, and start using the new features you have access to!
This guide is designed to show you how to do this for yourself. But if you're looking at it now and thinking you'd rather hand this off, that's exactly what AC2GHL.com is for 😊
For a flat $299, I'll migrate all your contacts, deals, notes (via API), custom fields, and tags — with a full post-migration data verification report and a 48-hour turnaround. No hourly billing, no scope creep, no lost notes.
And if you also need automations rebuilt, forms recreated, or a full GHL setup, I can quote that separately as well.
James Crook is a GoHighLevel specialist based in Geelong, Australia, with 15+ years of marketing agency experience. He helps small businesses worldwide switch to GHL without the headache.

After 15+ years running a marketing agency, working with 500+ small businesses, and moving to GoHighLevel for all my own projects...
I've made it my mission to help small business owners make the switch from ActiveCampaign to GHL as painlessly as possible.
I believe the simplest way is best. That's why I offer a clear, fixed-fee service for straightforward migrations — no hourly billing, no scope creep, no surprises.
I'll talk with you in plain English and handle the technical heavy lifting, so you can focus on running your business.
Book a free call and let's get your migration sorted.
$299, no surprises, no stress.