Migration Playbook

HubSpot HighLevel

HubSpot to HighLevel: The Complete Migration Playbook

A 36-step runbook across six phases — track your progress, and open the right tool at every step.

0 / 36 steps complete 0%
TL;DR

HubSpot to GoHighLevel migration requires API-level ETL to preserve relationships. CSV exports flatten data, workflows can't be exported, and both platforms enforce strict rate limits.

There is no native migration path from HubSpot to GoHighLevel; the platforms use fundamentally different data architectures. HubSpot employs a relational schema where Companies, Contacts, Deals, and Activities are connected via an explicit Associations API, while GoHighLevel is contact-centric with all entities radiating from a flat Contact record. Migrating requires custom transformation work to flatten multi-object relationships, re-link Opportunities to Contacts by ID, and recreate automation logic—CSV exports destroy associations and omit activity history entirely.

Read this first

Pair-specific gotchas that catch teams out. Each one has cost somebody a weekend.

Key constraint

Each GoHighLevel opportunity must be linked to a Contact. You cannot import opportunities without associated contact data. If your HubSpot deals have multi-contact associations, you need to decide which contact becomes the primary owner on the GHL side.

Picklist mapping matters

HubSpot enumeration fields use internal values (e.g., appointmentscheduled) that differ from display labels ("Appointment Scheduled"). Always map against internal values, not labels, to avoid silent mismatches. HubSpot properties are API-addressable by internal names, and GHL requires destination fields to exist before imports can map to them. (developers.hubspot.com)

Cross-object linking is lost

In HubSpot, a single email engagement can be linked to a Contact, a Deal, and a Company simultaneously. In GHL, a Note attaches to one Contact. You must decide on a primary Contact for each engagement. Use the associations extraction to pick the primary Contact, then store the original HubSpot engagement ID and associated object IDs in the note body or a custom field for audit purposes.

Authentication choice matters

For single-account migrations, use a Private Integration Token — simpler setup, no OAuth flow. For multi-location agency migrations, use OAuth 2.0 with proper token refresh handling.

Budget 40–60% of total migration time for workflow rebuilding

On a typical 10-pipeline HubSpot instance with 30+ workflows, manual workflow recreation often takes longer than the data migration itself. Audit and prioritize — not every HubSpot workflow needs to be recreated in GHL.

The runbook

Work top to bottom. Tick steps as you go — your progress is saved in this browser.

01 Discovery Agree scope, pipeline design and success criteria before touching data. 0/5

Objective A scope covering every object in the revenue model, with sales leadership signed up to the pipeline design.

  1. Inventory every object in HubSpot

    RevOps 1-2 days

    Count accounts, contacts, leads, deals or opportunities, activities, notes, emails, files, products and quotes. Activity and email history is usually the largest object by an order of magnitude and the one people forget to size.

    Data Profiler Get real record counts instead of estimating from memory
  2. Map the current pipeline and agree the target model

    Sales leadership 3-5 days

    Document every pipeline, stage, probability and required field, then agree the HighLevel model with sales leadership. Migrating a broken pipeline faithfully is a wasted opportunity; redesigning it mid-migration is a wasted migration.

    Stage changes alter historical conversion rates. Agree how you will restate reporting before you change the model.

  3. Catalogue integrations and automation

    RevOps 2-3 days

    List every system touching HubSpot: marketing automation, quoting, billing, ERP, data enrichment, dialler, BI. Each is a separate cutover task with its own owner, and each can silently write bad data into your new CRM.

  4. Capture the reporting that must survive

    RevOps 2 days

    Interview the people who actually live in the dashboards — forecast, pipeline coverage, rep activity, cohort conversion. Every one of these needs the underlying fields to migrate, which frequently expands the scope.

  5. Build the business case and pick the go-live date

    Project sponsor 2 days

    Model licence delta, implementation effort and productivity dip. Then choose the date deliberately: mid-quarter is disruptive, quarter-end is worse. Most teams land on the first week of a new quarter.

    COI & ROI Calculator Build the 36-month business case you will need for sign-off

HubSpot → HighLevel specifics

Cost consolidation
HubSpot's per-seat, per-Hub pricing adds up fast. GoHighLevel bundles CRM, pipeline management, funnels, SMS/email, appointment scheduling, and reputation management into a single subscription — typically $297–$497/month with unlimited sub-accounts.
Agency model fit
GoHighLevel was built for agencies. Its sub-account architecture lets you spin up isolated client environments, white-label the entire platform, and resell it as your own SaaS product. HubSpot's partner model doesn't offer this.
Operational simplicity
HubSpot's power comes from configurability — Workflows, custom objects, multi-tier permission sets, Operations Hub custom code. Teams running fewer than ~50 users who primarily need lead capture, pipeline management, and marketing automation often find GHL covers 80% of those use cases with less admin overhead.
Trigger logic is different
HubSpot uses enrollment triggers with re-enrollment rules; GHL uses event-based triggers with action sequences
Branching logic differs
HubSpot's if/then branches with multiple conditions must be restructured into GHL's condition nodes

Don't move on until

  • Object counts confirmed for accounts, contacts, deals and activities
  • Target pipeline and stage model agreed with sales leadership
  • Reporting requirements captured from the people who use the reports
02 Data Audit CRM data is usually dirtier than anyone expects. Find out how dirty. 0/7

Objective A profiled export with duplicates, ownership gaps and relationship integrity all quantified and triaged.

  1. Export and profile every object

    Data engineer 2 days

    Profile null rates, distinct values and type consistency across all objects. Pay attention to fields sales reps were supposed to fill in: an 80% null rate on a field your forecast depends on is a business finding, not a data one.

    Data Profiler Profile the HubSpot export for nulls, outliers and type drift
  2. Quantify duplicates and agree the merge policy

    RevOps 2-4 days

    Measure duplicate accounts (same company, different spellings and suffixes) and contacts (same email, or same person at a renamed company). Agree survivorship rules before merging: which record wins, which fields, and what happens to the activity history on the loser.

    Merging before you have agreed survivorship rules destroys history irreversibly. Decide first, merge second.

    Data Cleaner Strip empty rows, stray whitespace and dead columns
  3. Verify relationship integrity

    Data engineer 1-2 days

    Check every deal has a valid account, every contact a valid account, every activity a valid parent. Referential breaks are the defect that turns a clean-looking load into a CRM where the pipeline report does not tie to the account list.

  4. Resolve ownership and the user map

    RevOps 1-2 days

    Build the HubSpot user → HighLevel user map, including leavers. Every record needs a valid owner: records assigned to deactivated users either fail to load or land unassigned, and unassigned pipeline is pipeline nobody works.

    Records owned by deactivated users are a top cause of load failures. Decide the reassignment target before you start.

  5. Scan for PII and regional compliance

    Compliance / DPO 1-2 days

    CRMs hold marketing consent, lawful basis and unsubscribe state. Confirm these fields migrate intact and that consent provenance survives — losing consent records is a regulatory problem, not a data-quality one.

    PII & Compliance Scanner Find regulated fields before they land in a new system
  6. Clean, normalise and archive the pre-state

    Data engineer 2 days

    Normalise country and state values, phone formats, currencies and casing, and standardise all timestamps to UTC. Keep an untouched copy of the raw export — it is your only reference if a mapping decision turns out wrong.

  7. Batch endpoints count as one request

    HubSpot's batch create/update endpoints process up to 100 records per call. Use them aggressively during extraction. This is the single most effective way to stay under burst limits.

HubSpot → HighLevel specifics

Relationships are destroyed
A CSV export flattens multi-object associations. Company → Contact → Deal linkages become disconnected rows.
Activities don't export via CSV
Notes, call logs, emails, meetings — none come through HubSpot's standard CSV export. You need the Engagements API for those.
Custom object data requires separate exports
and cannot be re-associated via CSV import on the GHL side.
The CRM Search API is your real bottleneck
At 5 requests/second shared across all object searches (contacts, deals, companies), deduplication checks during import become painfully slow. The Search API returns up to 200 records per response.
429 errors require exponential backoff with jitter
Don't use fixed sleep() intervals. Implement a token-bucket rate limiter and honor the Retry-After header.

Don't move on until

  • Duplicate rate quantified per object with a merge policy agreed
  • Every record has a valid owner mapped to a target user
  • Relationship integrity verified — no orphaned deals or contacts
03 Field Mapping Map objects, relationships and picklists — in that order. 0/6

Objective A signed mapping spec that covers objects, relationships, picklist values and currency handling.

  1. Map objects and their relationships first

    Solution architect 2-3 days

    Establish how HubSpot objects correspond to HighLevel objects before any field work. Leads-versus-contacts, accounts-versus-organisations and deal hierarchies differ structurally between CRMs, and a field map built on the wrong object model has to be redone.

    Schema Mapper Opens pre-loaded with the HubSpot → HighLevel field pair
  2. Generate and then hand-review the field map

    Solution architect 2-3 days

    Auto-match both schemas, then review every row. Look hardest at anything named "type", "source", "stage" or "status", where names match and meanings do not.

  3. Map every picklist value, including retired ones

    RevOps 2 days

    Enumerate all values on both sides — deal stages, lead sources, industries, statuses — and map each explicitly, including values no longer offered but still present on old records. Unmapped values either fail the row or land as blanks that quietly break segmentation.

    Historical records often carry picklist values that were retired years ago and no longer appear in the UI.

  4. Decide currency, amount and date handling

    Finance / RevOps 1-2 days

    If you sell in multiple currencies, confirm how HighLevel stores amounts, exchange rates and dated conversion rates. Recalculating historical deal values at today's rate silently rewrites your revenue history.

    Multi-currency deals re-converted at current rates will not tie to your historical reporting or your finance system.

  5. Determine the load order

    Data engineer 1 day

    Sequence the load so parents exist before children: users, then accounts, then contacts, then deals, then activities and notes. Keep source IDs in custom fields so relationships can be rebuilt by lookup rather than guesswork.

  6. Freeze the spec and sign off

    Project manager 1 day

    Version-control the mapping, walk RevOps and sales leadership through the decisions that change reporting, and get written sign-off before the pilot.

Don't move on until

  • Object and relationship model mapped and reviewed
  • Every picklist value explicitly mapped, including dead values
  • Load order determined so parents always exist before children
04 Test Migration Pilot with related records, not a flat sample. 0/6

Objective A pilot load whose relationships, ownership and roll-up reporting all verify against source.

  1. Configure the HighLevel sandbox to match the agreed model

    Solution architect 3-5 days

    Build the pipelines, stages, custom fields, record types and user roles first. Load into a default configuration and you will only discover the configuration defects at full scale.

  2. Select a connected pilot slice

    Data engineer 0.5 day

    Take complete account trees — 50-100 accounts with all their contacts, deals, activities and files — rather than a flat random sample. Relationship defects are the whole point of a CRM pilot and a flat sample cannot expose them.

  3. Run the load in dependency order with full logging

    Data engineer 1-2 days

    Load users, accounts, contacts, deals, then activities, logging every request against its source ID. Note which failures are transient (rate limits, timeouts) and which are structural (validation, missing parent).

  4. Verify relationships and roll-ups

    RevOps 1-2 days

    Confirm every deal sits on the right account with the right owner and stage, and that pipeline totals per account and per rep match HubSpot exactly. Roll-up mismatches almost always mean a relationship or currency defect upstream.

    Migration Validation Tool Diff the pilot batch against source before scaling up
  5. Measure throughput and project the full load

    Data engineer 1 day

    Record actual records-per-hour under HighLevel's API limits and extrapolate, remembering activity history usually dominates volume. If the projection exceeds your window, split the load or trim activity scope now.

  6. Let reps work the pilot data

    Sales leadership 2-3 days

    Put two or three reps in the sandbox against their own accounts. They spot missing context, wrong owners and unusable notes far faster than any reconciliation script, and their buy-in is what makes adoption work.

Don't move on until

  • Relationships intact across the whole pilot slice
  • Pipeline roll-ups match source for the pilot accounts
  • Reps have worked pilot records and confirmed they are usable
05 Cutover Switch the revenue system with the pipeline intact. 0/6

Objective All in-scope CRM data live in HighLevel, integrations repointed, and reps selling on day one.

  1. Pre-load history ahead of the freeze

    Data engineer 5-10 days

    Load closed deals, historical activities and inactive accounts while HubSpot stays live. Only open pipeline and the final delta need to move inside the window.

  2. Publish the cutover runbook

    Project manager 1 day

    A timed sequence with owners and abort criteria: freeze, final export, delta load, integration switch, smoke test, go/no-go, rep enablement. Pick a window that avoids quarter-end and month-end close.

  3. Freeze HubSpot and take the final delta

    RevOps 2-4 hours

    Set HubSpot read-only and export everything changed since the pre-load. Reps updating deals during an unenforced freeze is the classic way to lose the most recent — and most valuable — pipeline changes.

    A rep who updates a deal in the old CRM during the freeze will lose that update permanently.

  4. Load the delta and reconcile the pipeline

    RevOps 2-6 hours

    Run the delta, then verify open pipeline value and count per rep against HubSpot before anything else. If the pipeline number is wrong on day one, reps stop trusting the system and never fully come back.

    Migration Validation Tool Confirm the final delta landed before you reopen
  5. Repoint every integration and verify with real records

    IT / integrations 4-8 hours

    Switch marketing automation, quoting, billing, enrichment, dialler and BI connections, then push a live record through each path. An unrepointed integration writing into the old CRM causes divergence that gets harder to reconcile every day.

    Two-way integrations left pointing at the old CRM will keep writing there. Disable them before you switch, not after.

    Cron Expression Builder Schedule the delta syncs that run through the freeze
  6. Go/no-go, then enable the reps

    Project sponsor 1-2 days

    Call the decision explicitly against the exit criteria. Run enablement on real data with their own accounts on screen, and keep HubSpot read-only rather than cancelled until validation closes.

Don't move on until

  • Historical load complete and reconciled before the freeze
  • All integrations repointed and verified end to end
  • Reps logged in with pipeline visible and correct
06 Validation Prove the revenue numbers tie out, then close the project. 0/6

Objective Reconciled data, forecast parity with pre-migration reporting, and signed acceptance.

  1. Reconcile every object

    Data engineer 2 days

    Compare counts and values across accounts, contacts, deals, activities and files, plus field-level spot checks on a random sample. Produce a single report suitable for audit and for finance.

    Migration Validation Tool Reconcile HubSpot and HighLevel record-for-record
  2. Tie the pipeline and forecast to baseline

    RevOps 2-3 days

    Rebuild forecast, pipeline coverage and win-rate reporting and compare to pre-migration figures. Every variance needs an explanation — most trace back to stage or currency mapping decisions made in Field Mapping.

    Stage-model changes will legitimately shift historical conversion rates. Restate the baseline rather than chasing the difference as a defect.

  3. Verify ownership, visibility and permissions

    RevOps 1-2 days

    Confirm every record has the right owner and that sharing rules, territories and role hierarchy give each rep exactly the visibility intended. Over-broad visibility in a CRM is a data-protection issue as much as a config one.

  4. Re-profile for field completeness

    Data engineer 1 day

    Compare loaded null rates against the source profile per field. A field that arrived empty while counts matched is the failure counts alone cannot detect.

    Data Profiler Prove field completeness held up through the load
  5. Test automation and integration write-back

    RevOps 2 days

    Fire every workflow, assignment rule, sequence and notification, and confirm each integration writes correctly in both directions. Automation is rebuilt rather than migrated, so it is unproven until observed.

  6. Sign off and schedule decommission

    Project sponsor 1 day

    Get written acceptance against the Discovery criteria, keep HubSpot read-only for 30-90 days with a final archive export taken, then diarise cancellation so the contract does not auto-renew.

Don't move on until

  • Full reconciliation report complete across all objects
  • Forecast and pipeline reports tie to pre-migration baselines
  • Acceptance signed and HubSpot decommission scheduled

Field mapping reference

The field-by-field mapping for each object. Use this as the starting point for your mapping spec.

Object GoHighLevel Equivalent 11 fields high

HubSpot's unlimited custom objects with many-to-many associations must be condensed into GoHighLevel's 10-object-per-sub-account limit with a simpler schema.

HubSpot fieldHighLevel fieldNotes
Companies (or renamed "Accounts") Companies 1:1 mapping. GHL Companies are loosely coupled to Contacts. Contacts and Companies import separately.
Contacts Contacts Direct mapping. GHL's core entity.
Deals Opportunities (in Pipelines) Must be linked to a Contact. Create pipelines/stages first, then import.
Tickets Opportunities (separate pipeline) or Custom Object GHL has no native Tickets object. Use a dedicated "Support" pipeline or a Custom Object.
Custom Objects Custom Objects (max 10) Map highest-priority objects first. If HubSpot has >10, consolidate or drop.
Engagements (Notes) Notes Can be migrated via API. Loses cross-object linking.
Engagements (Tasks) Tasks Basic mapping. No multi-object association in GHL.
Engagements (Emails, Calls, Meetings) Notes (as text records) GHL has no equivalent engagement type. Flatten to notes or accept data loss.
Products Products (under Payments) Manual recreation or API.
Workflows Workflows (manual rebuild) Cannot be exported from HubSpot. Must be rebuilt from scratch.
Association labels Crosswalk table + custom metadata Preserve in staging even if GHL cannot use them everywhere. Easy to lose during CSV-only migrations.
HubSpot GoHighLevel 14 fields
HubSpot fieldHighLevel fieldNotes
hs_object_id Custom Field (hubspot_id) Keep for crosswalks and audit
firstname firstName Direct
lastname lastName Direct
email email Lowercase, validate duplicates
phone phone Normalize to E.164 format
company companyName Direct (or link to Company object)
lifecyclestage Tag or Custom Field Map internal values — not display labels
dealstage Pipeline Stage Map to pre-created pipeline stages
dealname name (Opportunity) Direct
amount monetaryValue Normalize currency/precision
closedate Custom Field Convert epoch timestamps to ISO 8601
hubspot_owner_id assignedTo Map HubSpot owner IDs → GHL user IDs
hs_lead_status Tag or Custom Field Map picklist values
Custom properties Custom Fields Create custom fields in GHL first
Mapping Engagements GHL 5 fields
HubSpot fieldHighLevel fieldNotes
Notes Notes Direct body text mapping. Loses multi-object association — attach to primary Contact only.
Tasks Tasks Map hs_task_subject → task title, hs_task_body → description, hs_task_status → completion status.
Emails Notes (as text) Concatenate subject, direction (inbound/outbound), sender, recipients, and body into a structured note. Prefix with [EMAIL] for searchability.
Calls Notes (as text) Include call direction, duration, disposition, and any call body/notes. Prefix with [CALL].
Meetings Notes (as text) Include meeting title, start/end time, attendees, and body. Prefix with [MEETING].

Risk matrix

Per-object risk for this pair. Plan extra validation around anything marked high.

ObjectRiskNotes
Contacts low Contacts are the core entity in both platforms and map relatively directly, though custom field mapping and deduplication still require attention.
Companies medium HubSpot Companies are first-class relational objects, but GoHighLevel treats them as loosely coupled groupings with a separate import flow from Contacts.
Deals / Opportunities high HubSpot Deals exist independently and link to multiple Contacts and Companies, while GoHighLevel Opportunities must each be linked to a single valid Contact ID.
Custom Objects high HubSpot's unlimited custom objects with many-to-many associations must be condensed into GoHighLevel's 10-object-per-sub-account limit with a simpler schema.
Activities (Calls, Emails, Meetings) high HubSpot's Engagements API stores rich cross-object activity history that has no equivalent unified model in GoHighLevel, requiring API extraction and lossy transformation.
Notes and Tasks medium Notes and Tasks can be migrated via API to GoHighLevel's corresponding objects, but they lose their multi-object associations from HubSpot.
Pipelines and Stages medium Pipeline structures must be manually recreated in GoHighLevel before importing Opportunities, and multi-pipeline configurations require careful stage-mapping.
Custom Fields medium Custom field types and picklist values must be pre-created in GoHighLevel and carefully mapped, as field type mismatches can silently drop or corrupt data during import.
Associations and Relationships high HubSpot's labeled, many-to-many associations across all objects are completely destroyed in CSV export and require dependency-ordered API writes with ID crosswalk tables to partially reconstruct.
Workflows and Automations high HubSpot Workflows with branching logic, custom code actions, and multi-object triggers cannot be exported and must be entirely rebuilt in GoHighLevel's different workflow engine.

The hard parts

What makes this specific migration difficult, beyond the mechanics.

Relational to Contact-Centric Mapping

HubSpot's any-to-any object associations must be translated into GoHighLevel's flat, contact-centric model where every Opportunity requires a single linked Contact ID.

Multi-Contact Deal Associations

HubSpot Deals can associate with multiple Contacts natively, but GoHighLevel requires selecting a single primary contact per Opportunity or enabling a duplicate opportunities toggle.

Activity and Engagement History

HubSpot's first-class Engagements API stores calls, emails, meetings, and notes linked across multiple objects, but GoHighLevel has no unified engagement model and CSV exports exclude activity data entirely.

Custom Object Schema Limits

HubSpot Enterprise supports unlimited custom object definitions with many-to-many associations, while GoHighLevel caps custom objects at 10 per sub-account with a simpler relational model.

API Rate Limit Constraints

Both platforms enforce strict rate limits—GoHighLevel allows only 100 requests per 10 seconds—requiring careful batching, retry logic, and throttling for any bulk data transfer.

Automation Logic Recreation

HubSpot Workflows with if/then branching and custom code actions cannot be exported and must be manually rebuilt as GoHighLevel Workflows with their own trigger-action-condition model.

Tools used in this playbook

All free, all run entirely in your browser — nothing is uploaded.

FAQ

Can I export HubSpot workflows to GoHighLevel?

No. HubSpot workflows cannot be exported via API or CSV. The only exports available are a metadata spreadsheet and a PNG screenshot, both of which omit performance data, workflow history, and email content. All workflow logic — triggers, conditions, branches, delays, and actions — must be manually documented and rebuilt from scratch in GoHighLevel's workflow builder.

What are GoHighLevel's API rate limits for migration?

GoHighLevel's V2 API enforces a burst limit of 100 requests per 10 seconds and a daily limit of 200,000 requests per app per Location. Contacts are returned in pages of up to 100 records, paginated via cursor-based startAfterId parameters. The V1 API reached end-of-support on December 31, 2025.

Does GoHighLevel support custom objects from HubSpot?

Yes. GoHighLevel supports up to 10 custom objects per sub-account on all plans, with 1:1, 1:Many, and Many:Many relationships. However, custom objects are not yet supported in Email Campaigns, Conversations, Calendars, Funnels, or Payments — so if your HubSpot custom object drives one of those processes, you'll need to flatten it into standard fields or tags.

How long does a HubSpot to GoHighLevel migration take?

A small migration (under 5K contacts, flat data) can be done in 2–5 days via CSV. A complex migration with custom objects, multi-pipeline deals, and activity history typically takes 2–6 weeks via API, with 40–60% of that time spent rebuilding workflows manually.

Will I lose data migrating from HubSpot to GoHighLevel?

Potential data loss areas include: email, call, and meeting engagement history (GHL has no equivalent engagement type — these must be flattened to notes), multi-contact deal associations (GHL opportunities link to one primary contact), HubSpot workflow logic (must be manually rebuilt), and custom objects beyond GHL's 10-object limit. Proper planning mitigates most risks.

Or skip all of this and let us handle it

Book a 30-minute call and we'll scope your migration in a single session.