How do I move over from GoHighLevel?

Your fields, tags, pipelines and templates copy across automatically. Contacts go through the CSV importer. Automations have to be rebuilt — and here's the honest reason why.

Who this is for

The agency owner or admin doing the switch. Budget an afternoon for the setup, plus time to rebuild automations — that's the part that takes real work.

Before you begin

  • Admin access to your GoHighLevel account (you'll need to create a Private Integration Token).
  • Your GoHighLevel Location ID, from Settings → Business Profile.
  • A CSV export of your contacts from GoHighLevel.
  • Screenshots of any workflow you want rebuilt — you will need them, see below.

Steps

  1. In GoHighLevel: Settings → Private Integrations → Create. Give it read access to contacts, custom fields, tags, opportunities, calendars, users and workflows.
  2. Here: Agency Admin → Setup → Move from GoHighLevel. Paste the token and your Location ID, and connect.
  3. Run the dry run first. It reads your account, changes nothing, and shows you exactly what it found.
  4. Read the gap report, then run the import for the things you want.
  5. Export your contacts from GoHighLevel as CSV and bring them in with Import Leads or Import Clients.
  6. Point your existing funnels' forms at an inbound form URL.
  7. Rebuild your automations from the checklist the import leaves you.

A GoHighLevel "snapshot" is not a file

It's an internal share link that only installs into another GoHighLevel sub-account — there's no file to hand anyone. That's why this connects to their API instead of asking you to upload something. It's a GoHighLevel constraint, not ours.

What copies automatically

Custom fields (with their types and dropdown options), tags — including tags that aren't currently on anyone — pipelines and their stages, and email templates. Pipelines arrive switched OFF and marked "pending review" on purpose: a pipeline here controls who gets dialled and whether the AI is texting, so it should go live when you've looked at it, not the second it lands.

Why your automations can't copy across

GoHighLevel's API does not publish a workflow's steps — not to us, not to any tool. You can read a workflow's name, id and status and nothing else. So no product can move them for you, and anyone claiming otherwise is guessing at the contents. What the import gives you instead is every workflow recreated by name, switched off and empty, in an "Imported from GoHighLevel" folder: a rebuild checklist rather than a blank page. We'd rather hand you an accurate list than invent a drip and text your leads with a guess.

Rebuilding a workflow here

Almost everything you built there has a direct equivalent. Triggers: contact created, tag added or removed, opportunity/disposition changed, appointment booked, appointment status changed, custom field changed, form submitted, and date-based (birthday, renewal, anniversary, offset by days either side). Actions: send text, send email, wait, wait-until (a condition, a date on the lead, or the next sensible time of day), if/else, add or remove a tag, set a custom field, add a note, assign, notify a rep, fire a webhook, and add to or remove from another workflow. There's one action GoHighLevel has no answer to at all: hand the conversation to the AI, which closes and books for you instead of continuing to blast.

Why contacts go through the CSV importer instead

It's the better path, not the lazy one. The importer decides customer-versus-lead properly, detects duplicates against what you already have, and — the important one — carries your opt-outs across so nobody who unsubscribed over there gets texted over here. Pulling contacts blindly through the API would skip all of that.

What genuinely has no home here

Funnels, websites and landing pages — keep them where they are and connect their forms. Email open and click tracking, so a GoHighLevel automation that branches on "opened the email" has to be rebuilt around a reply or a booking instead (both are stronger signals anyway). Custom-code steps and GoHighLevel's own reporting widgets.

How to check it worked

  • Run the dry run and check the counts match what you see in GoHighLevel.
  • After importing, open Custom Fields and Pipelines and confirm they read the way you expect.
  • Import a small test batch of contacts before the whole book, and confirm your opt-outs came across as do-not-contact.
  • Submit one of your funnel's forms and watch the lead arrive.

Common mistakes

  • Expecting the workflows to come across. They can't — plan for the rebuild from day one rather than discovering it later.
  • Activating imported pipelines without reading them. They gate dialling and AI texting here.
  • Importing the whole contact book before testing a small batch.
  • Skipping the opt-out column when mapping the contact import. That's the one mistake with legal consequences.
  • Turning imported workflow shells on before rebuilding their steps. An empty workflow does nothing, but it looks live.

Troubleshooting

"Token rejected (401)" when connecting.The Private Integration Token is wrong, or was revoked in GoHighLevel.
Create a fresh one and paste it again — check for a trailing space.
"Token lacks permission (403)" for one resource.That scope wasn't ticked when the token was created.
Edit the integration in GoHighLevel, add the scope, and re-run. Everything else still imported — the report tells you exactly what was missed.
The import says the server isn't ready to store credentials.The credential encryption key isn't configured on this instance.
Ask your administrator — we won't store the token unencrypted, so this fails on purpose.

Related

Where this lives in the app

This is documentation for Virtual Closer. Book a walkthrough or sign in.