Section 01
Why teams migrate to GoHighLevel
The four shapes a GoHighLevel migration takes, and what makes the platform easier — or harder — than the category average.
HighLevel, Inc. (commonly branded GoHighLevel or GHL) is a Dallas, Texas-based all-in-one operating system aimed at marketing agencies and their SMB clients, with stated reach of 1M+ businesses on platform 1. The product bundles CRM, funnels, websites, email, SMS/voice via LC Phone, Workflows, Calendars and a white-label SaaS-resale mode under a single Agency / Sub-account hierarchy.
The typical GoHighLevel customer is a digital agency reselling the platform to dozens or hundreds of small-business clients under its own brand, or an SMB on the receiving end of that resale — gyms, dental practices, real-estate teams, home services.
Compared with HubSpot or Salesforce, GoHighLevel positions on bundled marketing-plus-CRM at a flat monthly fee starting at $97/mo Starter, $297/mo Unlimited, $497/mo SaaS Pro; compared with ActiveCampaign or Keap, it positions on Funnels, Websites and Phone System being native rather than integrated.
The shapes of migration that actually land on GoHighLevel tend to fall into four patterns. First, stack consolidation: a business replacing Pipedrive plus Mailchimp plus Calendly plus ClickFunnels with a single GHL Sub-account. Second, agency replatforming, where an agency moves its entire client book off ActiveCampaign, Keap or HubSpot and stands up one Sub-account per client.
Third, HubSpot or Salesforce exits driven by total cost of ownership — practitioners report leaving HubSpot at sub-$2M ARR to escape contact-tier pricing and per-seat fees 27. Fourth, vendor exits from ClickFunnels, Skool, ConvertKit or Keap, where the source is decommissioned in favour of GHL's bundled offering.
What makes migrating *to* GoHighLevel easier than the category average is the CSV import wizard — separate guided flows for Contacts, Opportunities, Companies and Custom Objects, with auto-mapping, preview, dedupe-by-unique-field controls, and a Bulk Actions monitor that lets you pause, resume or cancel a running import 318.
What makes it harder than the average is the Agency / Sub-account / Location hierarchy — every Contact lives inside exactly one Sub-account (also called a Location), so cross-client data sharing is structural, not a setting; and the Custom Objects cap of 10 per Location with a 1,000 records-per-association limit that bites real-world many-to-many use cases 1014.
On top of those structural limits, the A2P 10DLC SMS registration requirement must be completed before LC Phone can send a single text — Brand plus Campaign approval takes 1-3 weeks of carrier vetting.
Automations, Funnels, Websites, Workflows and lead-scoring rules do not import — they are rebuilt inside GHL from documentation. Teams that scope for that rebuild work up front finish on time; teams that assume parity do not.
Workflows are the rebuild tax of every GoHighLevel migration. Budget for it before you sign.
Section 02
The GoHighLevel data model you need to map into
Objects, custom fields, associations, and the unique-field upsert keys you'll wire on every record — the destination schema decoded.
GoHighLevel's CRM is built around a compact set of standard objects scoped to a single Sub-account (Location), plus Custom Objects, Custom Fields, Custom Values, and Associations that connect records across object types 2. The three core standard objects — Contacts, Opportunities, Companies — can be renamed to match your team's terminology, but the underlying data keys stay constant 2.
Before mapping a field on the source side, you need to know which destination object the row belongs on, what Sub-account it lands in, what fields are required, and which value will serve as its unique-field match key. The table below summarises the objects you will touch.
| Object | Stores | Required on import | Tier |
|---|---|---|---|
| Contacts | Individual people — leads, customers, members | One of: First Name, Last Name, Email, Phone | All plans |
| Opportunities | Deals / pipeline records linked to a Contact | Name, Pipeline, Stage, Contact | All plans |
| Companies | Organisations linked to Contacts and Opportunities | Name (or domain via dedupe rule) | All plans |
| Pipelines & Stages | Stage configuration for Opportunities | Pipeline name, ordered Stage list | All plans; create before import |
| Custom Objects | Customer-defined record types (Pets, Cars, Policies) | Schema first; primary display field per object | All plans, max 10 per Location [10] |
| Notes & Tasks | Free-text annotations and follow-ups on Contacts | Body / title, owner, due date for Tasks | All plans; Rich Text limited |
| Appointments | Calendar bookings tied to Contacts | Calendar, Contact, start/end timestamps | All plans; calendars created first |
| Conversations (SMS, email, call, chat) | Inbound and outbound message history | Contact, channel, direction, body, timestamp; A2P 10DLC for SMS | All plans; usage-billed |
| Transactions & Orders | Historical payment and order records | Contact, amount, currency, status, source | All plans via Payments CSV import [33] |
| Custom Values | Sub-account-wide key/value merge variables | Name (auto-generates the merge key) | All plans |
Contacts use Email and/or Phone as the dedupe key, controlled by the Sub-account-level *Allow Duplicate Contact* setting and respected by both the UI import and the Contacts upsert path 21. Upsert honours the configured priority: if Email matches one record and Phone another, the platform updates the match on the first field in the configured order and ignores the second to prevent merging two distinct records 21.
Opportunities and Companies do not have a single natural unique key, so the practical pattern is to either let GHL assign Record IDs and store them back in the source after first import, or to create a custom field of type Single Line Text with Unique Field enabled and use it as your external ID.
Unique Fields can be flagged on a Custom Object field at creation — downgrading is permitted but irreversible — and the limit is 10 unique fields per object, enforced across UI, Workflows and Forms 11.
Custom field types in GoHighLevel are constrained but well-defined. Plan your mapping spreadsheet against the catalogue below.
| Field type | Limits | Notes |
|---|---|---|
| Single Line Text / Multi Line Text | Standard text storage | Unique-field eligible on Custom Objects (Single Line only) 11 |
| Number / Phone | Numeric / E.164 phone | Both eligible for Unique Field flag 11 |
| Email address validation | Validated on form/import entry | |
| Date Picker | Date-only | Stored without timezone; UTC midnight by convention |
| Dropdown (single) | Single-select picklist | Pre-create exact values; map by display label, not ID 40 |
| Dropdown (multiple) / Checkbox Group | 50+ options, no practical cap 39 | Multi-select; semicolon-delimited on CSV import |
| Radio Select / URL | Standard input types | Field-object scope cannot be changed after creation 39 |
| File Upload (Custom Field on Contacts) | Per-record file storage | Cannot bulk-load via CSV; upload via the UI one-by-one 62 |
| Custom Objects per Location | 10 per Location across all plans 10 | Plus 10 unique fields per Custom Object 11 |
| Custom Values (Sub-account) | Key/value merge variables, foldered | Auto-generates custom_values.<key> merge token 32 |
Relationships are modelled as Associations with optional Association Labels — a Contact labelled *Buyer* on an Opportunity, or a Pet (Custom Object) labelled *Owned By* a Contact 914. Supported relationship types include One-to-One, One-to-N (N ≤ 1,000), One-to-Many and Many-to-Many, with limits visually enforced in the UI 9.
Standard objects (Contacts, Opportunities, Companies) and Custom Objects all participate in Associations the same way, including cross-object Workflow actions like *Add Associated Records to Workflow* and *Find Object Record* by Record ID, External ID or field filter 14. There is no native cascade-delete from a parent to its associated children — you build that behaviour into a Workflow if your source platform relied on it.
Section 03
Pre-migration prep — the work before you touch GoHighLevel
What must be true on the source, the destination, and across the team before the first row hits the GHL import wizard.
The single best predictor of a clean GoHighLevel migration is how much work you do on the source side before the first import button is pressed. Practitioners running CRM consolidations report that the bulk of post-go-live cleanup traces directly to a dirty source export — duplicate emails, mixed-case domains, unresolved owners, picklist values that do not exist on the destination.
Treat the source export as raw material. Normalise it once, outside GoHighLevel, and the import becomes a non-event.
That means email lowercased, phone normalised to E.164, dropdown values converted to exact GHL picklist labels, dates in a consistent format, owners resolved to GoHighLevel user emails, and historical activity restructured into Notes — since GHL has no first-class historical-activity import beyond Notes and Transactions.
Source-side prep
- Audit and dedup the source database before export. GHL's native merge tool keeps Master record data and *permanently* discards the Child contact's conflicting fields, so resolving duplicates upstream is safer than relying on post-import merges 4245.
- Normalise emails to lowercase and phones to E.164 before export — practitioners report 5% exact-email duplicate rates and 10-25% fuzzy-match false positives on B2B contact lists, both of which break GHL's email/phone dedupe priority logic.
- Convert source dropdown values to the exact GHL picklist labels for every dropdown field. GHL maps by display label, and an unknown value is imported as blank with no row-level error.
- Stamp a stable external ID on every record — UUID or the source primary key — and store it in a GHL Single Line Text field flagged Unique for re-runs and reconciliation 11.
- Decide what is in scope for historical activities. Calls, emails and meetings older than ~12-24 months are usually best represented as a single summary Note per contact rather than one Note per row.
Destination-side prep
- Create a Sandbox account from the Marketplace Developer Portal under Testing → Create App Test Account before touching production. Sandbox accounts are isolated and throttled — the right place to dry-run the import flow before it touches the live Sub-account 12.
- Provision Users at the Agency level, set permission levels, and assign each User to the Sub-accounts they need. Owner assignment during CSV import requires a valid HighLevel user email — unresolved rows land unowned and silently break owner-based Workflows 40.
- Pre-create every Custom Field on the right object with the right type — field-to-object scope cannot be changed after creation 39. Naming a custom field with the substring
scoretriggers automatic numeric-scoring in Forms, Surveys and Quizzes, which is often unexpected 38. - Build Pipelines and Stages before importing Opportunities — GHL rejects rows whose Stage does not exist on the named Pipeline. If consolidating multiple source pipelines, keep them separate for 90+ days post-go-live, then merge once reporting has stabilised.
- Define Custom Objects, primary fields, unique fields, and Associations before importing any records — Custom Object bulk import requires the schema to exist with all fields created 35.
- Register A2P 10DLC for SMS through Settings → Phone Numbers → Trust Center the moment the Sub-account is created. Brand plus Campaign registration plus carrier vetting typically takes 1-3 weeks; LC Phone cannot send any SMS until 10DLC is approved.
People prep
Cutover only works if humans cooperate. Lock down a source-system freeze window — 24-72 hours for a single Sub-account, 1-2 weeks for an Agency moving 50+ client Sub-accounts — and communicate it to every department touching the source. Train Sub-account Admins on Contacts, Opportunities, Conversations and Workflow basics before go-live, not after.
A small-business migration runs one to three business days; an agency rollout across dozens of Sub-accounts with Snapshots runs two to six weeks.
Section 04
Import mechanisms: UI wizard, CSV, and Snapshots
Multiple paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall.
GoHighLevel exposes several load paths and the right one depends on dataset size, object mix, Sub-account count, and whether the migration needs to be repeatable. The UI Import Wizard covers most one-shot migrations under a few hundred thousand records. Snapshots clone configuration (not records) across Sub-accounts. Third-party tools sit on top.
UI Import Wizard
The native CSV importer lives at Contacts → Bulk Actions → Import Contacts, with separate object-specific flows for Opportunities, Companies and Custom Object records reached from the corresponding object index page 51835.
Each wizard is a multi-step flow: upload file → choose mode (Create only, Update only, Create + Update) → map CSV columns to GHL fields with preview data → review and start the import 835. Once running, the import is monitored under Bulk Actions, where you can pause, resume or cancel 35.
Limits are tight relative to other CRMs. The format is CSV only — Excel .xlsx and Google Sheets are rejected by the Companies and Custom Object importers 835. Only Sub-account Admin users can run imports 51. The CSV must be a single sheet, must have required fields populated, must use one Primary Column, and dropdown values must match the GHL field options exactly. File size caps sit at 100 MB on paid tiers, 50 MB on lower tiers 44.
Snapshots
Snapshots are GoHighLevel's template-clone mechanism — they capture configuration (Custom Fields, Pipelines, Workflows, Funnels, Email/SMS templates, Calendars, Triggers, Custom Values) from a source Sub-account and apply it to one or more destinations in a single load 43. Snapshots do not move records — they only move structure, so they are the wrong tool for a data migration but the right tool when an agency is standing up 25 client Sub-accounts that should share the same Workflows.
Snapshot push-updates can be reverted at the bulk-action level, but there is no native rollback for the original snapshot apply 49.
Third-party staging tools
ETL and iPaaS vendors — Make.com, Zapier, n8n, Workato — are used either for reverse-ETL through a warehouse, or for one-shot transformation that handles dedup, picklist remapping and owner-email resolution before the cleaned file hits the UI wizard. Marketplace apps like *Import Custom Fields* fill the multi-object bulk gap 55.
Under 10,000 records on standard objects → UI Wizard. 10,000–100,000 → UI Wizard in batched CSVs. Cloning configuration across Sub-accounts → Snapshots.
Section 05
Mapping your data into GoHighLevel
The longest section — because field mapping is where almost every migration that fails actually breaks.
Mapping is where every migration earns its scars. The schema decisions in your mapping spreadsheet determine whether reports work on day two, Workflows fire correctly on day five, and your sales team trusts the data on day thirty.
Work object by object in GHL's dependency order: Companies first, then Contacts, then Opportunities (which require an existing Contact), then Custom Object records, then Notes/Tasks/Appointments, then Transactions and Orders.
Contacts
Common source → GoHighLevel Contact mapping
- email→email (unique-field-eligible)
Lowercase before import; honours Allow Duplicate Contact setting on upsert 21
- first_name / last_name→firstName / lastName
GHL accepts either via Contact ID; one of name/email/phone required 51
- phone→phone
Normalise to E.164 before import; phone is also a dedupe key candidate
- company_name→companyName field OR Company-object association
Decide upfront — flat text field vs full Company record
- owner / assigned_to→Assigned User
Map by HighLevel user email; missing email → unowned row 40
- lifecycle / stage→Tag OR custom Dropdown field
GHL has no native lifecycle property; Tags or a custom dropdown are the patterns
- lead source / utm_source→source (system field) OR custom Single Line Text
sourceis settable on Contacts via CSV - created_at→Custom Date field (e.g. legacy_created_at)
GHL
dateAddedis system-managed and stamped to import day - tags→tags (array)
Comma-delimited on CSV import; create-on-the-fly is allowed
Opportunities and pipelines
Recreate every Pipeline and every Stage in GoHighLevel before importing Opportunities. Each Opportunity row requires Pipeline name (or ID), Stage name (or ID), Opportunity name, monetary Value, and a Contact reference (by Contact ID, email or phone). Rows that target a non-existent Stage on the named Pipeline are rejected during the CSV preview step.
Opportunity stage history is not preserved by the import — only the current Stage lands. If you need stage-transition history for reporting, export the source transition timestamps and store them in custom Date fields like stage_entered_at_<stage>.
Common source → GoHighLevel Opportunity mapping
- deal_name / opportunity_name→name
Required
- stage / pipeline_stage→Stage (must exist on named Pipeline)
Pre-create Pipelines and Stages 40
- amount / value→monetaryValue
Number; strip currency symbols before import
- close_date→Custom Date field (e.g. close_date)
No native closeDate on GHL Opportunities — store in custom field
- owner→assignedTo
Map by user email; controls Opportunity dashboards
- primary_contact→Contact reference (required)
By Contact ID, email or phone; rows without a Contact are rejected
- account / company→Company association
Set via the Associations step or a follow-up update import
- source_record_id→Custom Single Line Text, flagged Unique
Your reconciliation key for re-runs and rollback
Companies
Companies are imported via CRM → Import / Export → Bulk Import Companies, CSV only, with the same three modes — Create, Update, Create + Update 8. Map company_name to GHL's primary field and choose your unique field (typically a custom domain Single Line Text flagged Unique, or a source_company_id external ID).
Decide on the *Update Empty Values* behaviour — by default, the import will not overwrite existing non-blank values with incoming blanks, which protects partially-enriched records from being wiped by an incomplete refresh 8.
Custom-field mapping strategy
Resist the urge to map every source custom field one-to-one. Migrate only the fields used by an active Workflow, Form, or Report in the last 12 months. Excess fields slow the field picker, weaken Smart List performance, and waste storage.
For dropdown fields whose source values do not match the destination, either extend the destination dropdown with the missing values, collapse adjacent values during transform, or introduce a parallel Single Line Text field that holds the legacy value verbatim.
Source formula or calculated fields do not import — GHL has no formula-field type. Pre-compute the value in the export step and store it in a Number or Single Line Text custom field. Salesforce Record Types have no GHL equivalent — segment via Tags or a custom Dropdown instead.
Historical activities — calls, emails, notes, tasks
GoHighLevel has no first-class historical-Activity import equivalent to HubSpot's *Activity Date* field. Practitioners load historical call/email/meeting records as Notes on the corresponding Contact with the original timestamp prepended in the body (e.g. [2024-03-12 10:42 - Inbound Call - 12m]), accepting the Note's createdAt will be stamped to import day 61. Future-dated meetings with operational meaning are recreated as Appointments on the appropriate Calendar.
Email threads rarely round-trip cleanly — GHL's Conversations module is purpose-built for new threads, with no public bulk-import path for Conversations history. Store the last 12 months of email subject lines and metadata as Notes, and link to a static archive (S3, Google Drive) for the full body if audit retention is required.
Files and attachments
Attachments cannot be bulk-loaded from CSV. The supported per-record path is a File Upload custom field on the Contact, populated by uploading the file via the UI one record at a time 62. For SMS attachments or email attachments above 20 MB, GHL auto-moves the file to the Media Library and inserts a media-library link rather than attaching the binary inline 60.
Per-file size caps for documents (PDF, Word, Excel, PowerPoint, CSV, ZIP) sit at 100 MB on paid tiers and 50 MB on lower tiers, applied uniformly to Media Library uploads 44. For large attachment estates (hundreds of GB across thousands of contacts), the pattern most teams adopt is: keep originals in S3 or Google Drive, store a deep link in a custom URL field, and only inline-upload the most-referenced subset.
Audit trail, ownership and original timestamps
GoHighLevel system properties — dateAdded on Contacts, Opportunity createdAt, Custom Object record createdAt and updatedAt — are platform-managed and cannot be overridden during CSV import. Rows that arrive on May 1 are stamped May 1 even if the source record was created in 2019.
To preserve the original audit trail, create custom Date fields like legacy_created_at, legacy_updated_at, and a legacy_created_by Single Line Text holding the source user email on every object before import, and populate them from the source export.
Owner assignment only works if the Owner column resolves to a valid HighLevel User email at import time; unresolved rows land unowned with no row-level error 40. Audit Logs are retained for 60 days at the Sub-account level under Settings → Audit Logs — long enough to investigate post-import discrepancies but not a permanent compliance archive 92.
CRM-specific: workflows, A2P 10DLC, lead scoring, calendar sync
Workflows do not import from any source platform — every Automation, Campaign, Sequence, Drip, or Salesforce Flow is rebuilt by hand in GHL's visual Workflow builder. This is the single largest line item in any GHL migration. Audit the source's automations filtered by last-triggered-in-90-days, document each as a flowchart, then rebuild under Automation → Workflows.
A2P 10DLC SMS registration must be completed before LC Phone can send any text message to US numbers. Submit Brand Registration with EIN, business address and contact, then Campaign Registration with sample message templates and opt-in flow; carrier vetting and approval takes 1-3 weeks. Build this lead time into the cutover plan or your sales team will go live without SMS.
Lead scoring is not a first-class GHL object. Build a numeric custom field lead_score plus a Workflow that increments it on trigger events (form fill, email open, page view). Historical scores land in legacy_lead_score and the new field accrues forward.
Email and Google/Outlook Calendar sync is set up per-User under Calendars → Settings → Connections after Users are provisioned and before go-live — but do not enable two-way sync during the import window or the connector will backfill duplicate Appointments against the same Contacts you are loading 140148.
Section 06
The pitfalls that derail GoHighLevel migrations
Nine specific failure modes — ranked by impact, each tied to the exact GoHighLevel mechanism that breaks.
High impact
A2P 10DLC SMS registration left to the last week
LC Phone cannot send a single SMS to a US number until A2P 10DLC Brand and Campaign registration are approved by carriers — a process that takes 1-3 weeks and requires EIN, business address, sample message templates and opt-in evidence. Teams that schedule cutover two weeks out and submit 10DLC the week before discover at go-live that their sales team has been migrated to a phone system that cannot text anyone. Submit 10DLC the same week the Sub-account is created.
High impact
Custom Object association cap of 1,000 records
Each GoHighLevel Custom Object association — Contact ↔ Custom Object, Custom Object ↔ Custom Object — is capped at 1,000 linked records per association, which practitioners report making the feature unusable when a Contact has 1,000+ associated Properties, Vehicles, Policies or Family Members 14. Once you cross the ceiling, additional associations silently fail. Detect this in the source export, restructure relationships, or split the parent record before import. 14
High impact
Custom Object limit of 10 per Location
Every Location (Sub-account) maxes out at 10 Custom Objects across all plans, raised in October 2025 from a previous lower cap 10. Agencies running verticals like insurance (Policies, Claims, Beneficiaries, Carriers…), real estate (Properties, Listings, Showings, Offers, Inspections…) or healthcare quickly hit the ceiling. Audit the source schema against the 10-object budget before signing the migration scope — if you need 15 Custom Objects, GoHighLevel is the wrong destination platform and finding that out before cutover is cheap. 10
High impact
Workflow rebuild scope underestimated by 5-10x
No source platform's Automations, Sequences, Campaigns, Flows or Process Builders import to GoHighLevel. Every active automation is rebuilt by hand in the visual Workflow builder, including triggers, actions, conditional branches, wait steps, and SMS/email templates. Teams that quote a Salesforce-to-GHL migration based on contact count alone miss that 200 Flows is several weeks of rebuild work per Sub-account. Inventory active automations (filter source by last-triggered-in-90-days) and quote separately on Workflow rebuild 72. 72
High impact
createdAt and dateAdded cannot be overridden
GoHighLevel's system timestamps — Contact dateAdded, Opportunity createdAt, Custom Object createdAt and updatedAt, Note createdAt, Appointment createdAt — are platform-managed and ignored if you send them during import. Teams discover this on day two when Smart Lists filtered by *Date Added* return everything stamped to import day 96. Create legacy_created_at and legacy_updated_at custom Date fields on every object, populate them from the source export, and rewrite all historical-period Smart Lists to use the legacy fields. 96
Medium impact
Contact merge permanently discards Child record fields
GoHighLevel's deduplication merge tool keeps the Master record's data and permanently discards conflicting values from the Child record unless you manually pick fields during the review step. The merge is irreversible — there is no undo 45147. Teams running post-import merges on a few hundred duplicates without per-field review lose data they did not realise was on the Child record. Always dedup upstream where you can inspect both rows, or use field-level conflict selection on every merge. 45
Medium impact
CSV-only imports reject Excel and Google Sheets
The Companies and Custom Object bulk import wizards accept CSV (.csv) only — Excel .xlsx and Google Sheets are rejected at the upload step 835. Teams handing the migration to a non-technical Sub-account Admin who exports from Excel discover this at upload and lose a day to format conversion. The Google-Sheet MIME type is supported in the Media Library 44 but not in the import wizard. Document the CSV requirement in the runbook. 8
Medium impact
GDPR data residency — no EU hosting option
GoHighLevel is hosted on US infrastructure with EU-U.S. Data Privacy Framework certification and SCCs for cross-border transfers, but there is no EU data-residency option — all customer data sits in US data centres regardless of where the agency or end-customer is based 120122. EU agencies under strict residency requirements (German BDSG, French CNIL, Italian Garante guidance) need to evaluate this before migrating, and the long-running self-host request thread remains under review with no committed delivery 122. 122
Low impact
HIPAA add-on is one-way and costs $297/mo
HighLevel accounts are not HIPAA-compliant by default. The HIPAA Compliance package is an account-wide add-on at US$297 per month enabling ePHI encryption, BAA signing, audit logging and MFA enforcement 129. Once enabled it applies to every Location and cannot be disabled — there is no downgrade path. Healthcare-adjacent agencies need to budget the line item and confirm it is enabled before any PHI lands on the platform, because adding it later does not retroactively secure historical data. 129
Section 07
Validation and cutover
What to verify after the import job, in what order — and how to fail safely when something is wrong.
Validation is the bridge between the import finishing and users being allowed in. The pattern that works on GoHighLevel migrations is three-stage: a test load of 10 percent of records with stakeholder spot-checks, the full load with real-time Bulk Actions monitoring, and a 30-day post-migration data-quality audit. The most reliable signal is having Sub-account Admins verify their own records — they know what right looks like better than any reconciliation script.
Build a reconciliation spreadsheet that compares source and destination on each count below. Anything outside a 0.5 percent variance gets investigated before users get login access.
- Total Contacts imported vs source — minus deliberately excluded rows (role-based emails, unsubscribed lists, opted-out contacts).
- Total Companies imported vs source — checking that domain-based or name-based dedupe did not over-merge distinct organisations.
- Total Opportunities per Pipeline per Stage vs source, plus sum of
monetaryValueper Pipeline — a non-trivial dollar variance usually signals a stage-mapping error or a currency-precision drop. - Total Notes per Contact vs source — a date-bucketed histogram comparison confirms historical-activity-as-Notes round-tripped.
- Custom Object record counts per object vs source — and association counts per Contact / per Custom Object record to confirm no parent crossed the 1,000-association cap 14.
- Owner distribution — group by
assignedToand confirm no record landed unowned that should not have 40. - Unique-field integrity — count distinct emails on Contacts, distinct domains on Companies, distinct external IDs on Opportunities; any duplicates indicate the dedup transform missed cases.
- Tag distribution — confirm Tags created during import match the source's expected segmentation taxonomy.
On top of reconciliation, run a manual spot-check: pick 30 random Contacts across Sub-accounts and verify each field against the source UI. Pick five high-value Opportunities and trace the full association graph — primary Contact, Company, Custom Object children, Notes, Appointments. If a non-trivial discrepancy shows up in three or more, halt the load, fix the root cause, and re-import affected rows by external ID.
GoHighLevel ships Restore Deleted Contacts at Contacts → Restore, which centralises records deleted within the retention window so you can recover them without re-importing 100. This is a safety net for accidental bulk-delete but it is not a bulk-rollback for an import gone wrong — there is no native *undo the last import* button.
The real rollback strategy remains: export everything from the source to S3 before the import starts, stamp every imported row with an import_batch_id custom field, and if catastrophe strikes, run Bulk Actions → Delete filtered by that batch ID and re-import from the cleaned source. Third-party backup tools like HighGuard.cloud add daily snapshots with one-click restore, but they are an add-on rather than a default.
Cutover sequencing: (1) source goes read-only; (2) final delta export captures changes during the test-import window; (3) delta is imported; (4) reconciliation runs; (5) two-way calendar sync is enabled per User after validation passes 148; (6) Users get login access and a 48-hour hyper-care window with the migration lead on call; (7) source decommission is scheduled for 30 to 90 days out, never the same day.
Section 08
Migration partners and tools
Certified Admins, Developer Partners, iPaaS vendors, specialist migration shops — what each is good for and how to choose.
HighLevel's official ecosystem splits into two directories: the Certified Admin Directory of practitioners who install and operate GHL Sub-accounts for end-clients, and the Developer Partner Program of vetted shops that build custom integrations and ship Marketplace apps 110. Certified Admins fit one-shot migrations; Developer Partners fit ongoing iPaaS-style work against a warehouse, ERP or vertical SaaS.
Specialist shops with explicit migration practices include HashStudioz, ClonePartner, The Funnels Guys, GetAutomized, AutomateToGrow and Expert Level — each runs fixed-scope packages alongside ongoing retainer services. HighLevel Virtual offers white-label staffed-team packages starting at $439/month for 40 hours, which some agencies use to run their entire client-migration backlog.
On the iPaaS side, Make.com, Zapier, n8n, Workato and Pabbly Connect all carry GoHighLevel connectors. Their role is the staging layer into a warehouse, the field-conversion layer that maps dropdowns to GHL picklists, and post-migration the ongoing-sync layer. Marketplace apps like *Import Custom Fields* by Innexum fill the gap left by GHL not shipping a native multi-object bulk loader 55.
Managed-migration cost ranges vary widely. A clean Pipedrive-to-GHL or ActiveCampaign-to-GHL move of under 25,000 contacts with no Custom Objects, no historical activity preservation and one Sub-account often lands in the $2,000–$8,000 range with a setup fee plus per-object pricing.
A Salesforce-to-GHL or HubSpot-to-GHL project with Opportunity history, multiple Pipelines, Custom Objects, Workflow rebuilds and an Agency-wide rollout across 25 client Sub-accounts typically runs $25,000–$120,000, with the upper end driven by Sub-account count, Workflow rebuild scope and A2P 10DLC submissions across all client brands.
For teams that want to outsource the migration end-to-end, FlitStack specialises in GoHighLevel migrations and handles the Agency-versus-Sub-account architecture decisions, field mapping, dropdown-value conversion, Custom Object schema design within the 10-per-Location cap, Workflow rebuild scoping, and A2P 10DLC Brand and Campaign submission described in Sections 5 and 7 of this guide. Pricing is fixed-fee, based on record count, Sub-account count and source platform, with separate line items for Custom Objects, Workflow rebuild scope and historical-activity-as-Notes depth so the scope is transparent before signature.
This is one of several legitimate paths — the right choice for any given team depends on whether they want a Certified Admin, a Developer Partner for the integration work, an iPaaS-first approach, or a specialist migration vendor. Explore FlitStack →
Section 09
Frequently asked questions
The eight questions every GoHighLevel migration team works through before they sign the scope.
References
Sources
- 1 GoHighLevel — official site
- 2 Rename standard objects in your CRM — HighLevel Support
- 8 Bulk import Companies using a CSV file — HighLevel Support
- 9 Association limits — HighLevel Support
- 10 Custom Objects in all plans + higher limit — HighLevel Support
- 11 Unique field support for Custom Objects — HighLevel Support
- 12 GHL Marketplace Sandbox Accounts: setup and usage
- 14 Raise Custom Object Association Limit — Current 1,000 Limit (HighLevel Ideas)
- 21 Upsert Contact — HighLevel Support
- 23 HighLevel platform limits — HighLevel Support
- 27 HighLevel authentication & integration — HighLevel Support
- 31 Importing Contacts and Opportunities via CSV — HighLevel Support
- 32 Custom Values settings — HighLevel Support
- 33 Import Transactions and Orders using CSV — HighLevel Support
- 35 Bulk import Custom Object records (CSV) — HighLevel Support
- 38 Quick add & edit custom fields in Forms & Surveys
- 39 How to create and use Custom Fields within HighLevel
- 40 Troubleshooting bulk imports via CSV — HighLevel Support
- 42 Manage and merge duplicate Contacts in HighLevel
- 43 ActiveCampaign to HighLevel migration guide
- 44 Complete guide to Media Storage — HighLevel Support
- 45 How to merge duplicate Contacts in HighLevel
- 49 Revert snapshot update (HighLevel Ideas)
- 51 CSV file format for importing objects — HighLevel Support
- 55 Bulk import Custom Objects (HighLevel Ideas)
- 60 Attachments made easy in Conversations — HighLevel Support
- 61 Workflow Action: Add to Notes — HighLevel Support
- 62 Adding files to Contacts using a custom field
- 72 Salesforce to HighLevel migration guide — HighLevel Support
- 92 Audit Logs in HighLevel — track changes & user activity
- 96 Comment created_at timestamps overwritten during import — analogous pattern (Beads issue #735)
- 100 Restore deleted contacts or undo bulk deletes — HighLevel Support
- 110 HighLevel Partner Program — Certified Admins & Developer Partners
- 120 HighLevel — Data Privacy & Security
- 122 Self-hosting option for GoHighLevel to support GDPR / data residency (HighLevel Ideas)
- 129 HIPAA compliance with HighLevel — Support Portal
- 140 Re-integrate Google Calendar for a User — HighLevel Support
- 147 How to merge duplicate Contacts in HighLevel — Support Portal
- 148 How to enable two-way Calendar sync in GoHighLevel (Google & Outlook)
Need help running this migration?
FlitStack AI runs HighLevel migrations end-to-end.
Fixed-fee pricing, a hands-on migration engineer, full field mapping and validation. The work described in this guide — done for you.