CRM migration

Migrate from erxes to HighLevel

Field-level mapping, validation, and rollback between erxes and HighLevel. We move data and schema; workflows are rebuilt natively in HighLevel.

erxes logo

erxes

Source

HighLevel

Destination

HighLevel logo

Compatibility

78%

7 of 9

objects map 1:1 between erxes and HighLevel.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from erxes to GoHighLevel is a structural migration from an open-source, plugin-based CRM to a SaaS all-in-one marketing and sales platform. erxes organizes data around Contacts, Companies, Deals in Pipelines, and Tasks with a plugin-activation model that affects data visibility. GoHighLevel consolidates CRM, pipelines, email, SMS, scheduling, and white-label capabilities into a single platform designed for agencies and service businesses. We extract erxes data through GraphQL paginated queries since no native bulk export UI exists, pre-create all destination custom fields in GoHighLevel before import, and handle the Contact-to-GoHighLevel-Contact and Company-to-GoHighLevel-Company 1:1 mappings. Automation workflows, sequences, channel credentials, and form configurations do not migrate; we deliver a written inventory of these for the customer's admin to rebuild in GoHighLevel's visual workflow builder.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

erxes logo

erxes

What's pushing teams away

  • Steep learning curve for non-technical teams who expect a point-and-click CRM without touching code or GraphQL
  • Limited enterprise-grade documentation and support outside the paid Enterprise tier leaves self-hosted teams troubleshooting alone
  • Plugin ecosystem lacks the third-party integrations available on established platforms, requiring custom development for niche tools
  • Mobile app has stability issues according to App Store reviews, with login failures reported by multiple users
  • Performance and stability can degrade with large datasets when running on underpowered self-hosted infrastructure

Choosing

HighLevel logo

HighLevel

What's pulling them in

  • Agencies choose HighLevel to consolidate CRM, email, SMS, scheduling, and funnels into one subscription, eliminating monthly bills for five to ten separate SaaS tools they previously stitched together.
  • The flat-rate pricing model bills per sub-account rather than per contact, so growing a contact database from 1,000 to 100,000 records does not trigger a billing surprise—a common pain point avoided by migrating customers.
  • White-label and sub-account capabilities let agencies resell HighLevel access to their own clients, turning a software cost center into a recurring revenue stream that justifies the subscription.
  • The platform ships a 14-day free trial with no credit card required, giving teams a low-friction entry point to validate fit before committing to the $97/month Starter tier.
  • Marketing agencies managing multiple client accounts use sub-accounts to maintain data isolation per client while operating under a single agency billing relationship with HighLevel.

Object mapping

How erxes objects map to HighLevel

Each row shows how a erxes object lands in HighLevel, including any object-level transformations, lookup resolution, or schema-design dependencies.

Typical mapping — final map is confirmed during the sample migration step.

erxes

Contact

maps to

HighLevel

Contact

1:1
Fully supported

erxes Contacts map directly to GoHighLevel Contacts. We extract standard fields (firstName, lastName, email, phone, position) and custom field values via GraphQL and import to GoHighLevel Contacts using the contacts API endpoint. Email serves as the dedupe key; duplicate emails trigger an update rather than a create. Custom fields require pre-creation in GoHighLevel before migration with matching field types (text, number, date, select) to avoid type mismatches.

erxes

Company

maps to

HighLevel

Company

1:1
Fully supported

erxes Company records map to GoHighLevel Companies. We extract companyName, industry, size, website, and address fields via GraphQL. Companies must import before Contacts so that the GoHighLevel companyId can be resolved and linked to Contact records during Contact import. The company domain serves as the dedupe key if domain normalization is needed.

erxes

Deal

maps to

HighLevel

Opportunity

1:1
Fully supported

erxes Deals map to GoHighLevel Opportunities. We extract dealName, amount, stage, pipelineId, and custom field values. The erxes pipelineId maps to a GoHighLevel Pipeline that we pre-create or match by name during schema setup. Stage names translate to GoHighLevel Pipeline Stage names, preserving order and probability percentages where they exist in erxes.

erxes

Pipeline

maps to

HighLevel

Pipeline

1:1
Fully supported

erxes Pipelines define the sales workflow stages for Deals. We map the full pipeline configuration including stage order, names, and probability mappings to GoHighLevel Pipelines. Each erxes pipeline becomes a GoHighLevel Pipeline; if the customer has multiple erxes pipelines, each maps to a separate GoHighLevel Pipeline with its own Stages configuration. Stage IDs are translated to destination stage IDs during Deal import.

erxes

Task

maps to

HighLevel

Task

1:1
Fully supported

erxes Tasks map to GoHighLevel Tasks. We extract task titles, descriptions, due dates, status (pending, in progress, complete), and owner assignments. Owner resolution uses email matching against GoHighLevel Users. Tasks attached to specific Deals link via GoHighLevel Opportunity ID lookup after Deal migration completes. Tasks attached to Contacts link via Contact ID lookup.

erxes

Conversation

maps to

HighLevel

Custom Object or Contact Notes

lossy
Fully supported

erxes multi-channel Conversations (email, SMS, chat, WhatsApp) require configuration-level mapping. The conversation body, metadata, and linked customer association migrate to GoHighLevel as structured notes attached to the related Contact or Company record. Message threading order is preserved by setting the GoHighLevel note createdAt timestamp to the original erxes server-side createdAt value. Channel-specific metadata (SMS sender ID, chat thread ID) migrates as custom note fields.

erxes

Custom Fields

maps to

HighLevel

Custom Fields

lossy
Mapping required

erxes custom fields on Contacts, Companies, and Deals require pre-creation in GoHighLevel before migration. We map field types: erxes text fields map to GoHighLevel text fields, erxes select fields map to GoHighLevel dropdown fields, erxes date fields map to GoHighLevel date fields. erxes has no type enforcement on ingest, so we validate each value against the defined field type and flag mismatches rather than writing invalid data to GoHighLevel.

erxes

User

maps to

HighLevel

User

1:1
Fully supported

erxes Users (team members) map to GoHighLevel Users by email match. We extract user records including name, email, role, and status. Role and permission configurations in erxes have no direct GoHighLevel equivalent, so we document the original permission structure for the customer's admin to reconfigure manually in GoHighLevel's team management settings. Inactive erxes users can be mapped to inactive GoHighLevel users or excluded based on customer preference.

erxes

Channel

maps to

HighLevel

Channel Configuration

1:1
Fully supported

erxes Channels define communication mediums (email, SMS, chat) connected to the platform. Channel credentials (API keys, webhook URLs, SMTP configurations) do not migrate because they are platform-specific secrets. We deliver a channel inventory document listing each erxes channel, its type, connected integration, and recommended GoHighLevel channel setup steps so the customer's admin can reconfigure the integrations after migration.

Gotchas + challenges

What specifically takes care here

Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.

erxes logo

erxes gotchas

High

No native bulk export in Community edition

Medium

Plugin activation state affects data visibility

Medium

Custom fields have no type enforcement during import

Low

Conversation message ordering depends on server timestamps

HighLevel logo

HighLevel gotchas

High

Sub-account architecture creates isolated data silos per client

High

Usage-based telecom and AI costs are not in the subscription price

Medium

Workflows have no native equivalent in most destination CRMs

Medium

API rate limits cap bulk migration throughput at 100 requests per 10 seconds per sub-account

Low

White-label configuration and branding assets do not export via API

Pair-specific challenges

  • erxes bulk export requires GraphQL pagination

    erxes ships no native bulk export UI or CSV export in its open-source edition. All data must be extracted via individual GraphQL queries against the API. We paginate through query results programmatically using cursor-based pagination, but datasets over 50,000 records require chunking strategies and careful rate-limit management. We extract in waves: Contacts first, then Companies, then Deals with pipeline resolution, then Tasks, then Conversations. If the erxes instance is running on underpowered infrastructure, extraction may timeout on large queries and require smaller batch sizes.

  • erxes plugin activation state gates data access

    erxes modules (Sales, Marketing, Operations, Commerce) must be activated in the plugin configuration for their data objects to be accessible via the GraphQL API. If a customer has deactivated a plugin before migration, related Deals, Tasks, or Conversations return null or empty results even if records exist in the underlying database. We audit all plugin states during pre-migration discovery and request that customers activate all relevant plugins before extraction begins. We cannot extract data from plugin modules that are disabled.

  • GoHighLevel Custom Fields must pre-exist before import

    GoHighLevel enforces field types on import; attempting to write a text value to a numeric custom field will reject the record. Unlike erxes which has no type enforcement, GoHighLevel custom fields must be created in the UI or via API before any data is imported into them. We pre-create all destination custom fields during the schema setup phase, matching erxes field names to GoHighLevel field names and validating type compatibility before any import records are submitted.

  • Automation workflows do not migrate between platforms

    erxes Automation Workflows and GoHighLevel Workflows are architecturally different. erxes workflows use trigger-action sequences defined per plugin with GraphQL-level conditions; GoHighLevel uses a visual workflow builder with drag-and-drop triggers, conditions, time delays, and multi-channel actions. We do not migrate automation logic as code. We extract the structure of every active erxes workflow (triggers, conditions, actions) into a written inventory document with GoHighLevel equivalents so the customer's admin can rebuild them in the GoHighLevel Workflow Builder. Complex workflows referencing specific object IDs will require redesign rather than direct translation.

Migration approach

Six steps for a successful erxes to HighLevel data migration

  1. Discovery and plugin audit

    We audit the source erxes instance across activated plugins (Sales, Marketing, Operations, Commerce), custom field definitions per object, pipeline and stage configuration, and user count. We confirm all relevant plugins are active before extraction begins because disabled plugins hide their data from the GraphQL API. We also inventory existing workflows and channels for the handoff document. The discovery output is a written migration scope and a GoHighLevel account configuration checklist.

  2. GoHighLevel schema pre-creation

    Before any data extraction, we create all required GoHighLevel custom fields, Pipelines, Pipeline Stages, and Custom Objects. We map erxes custom field names and types to typed GoHighLevel field definitions. Pipeline stages are configured with names and order matching erxes. This phase ensures that when we submit import records, the destination schema is ready to accept them without type errors or missing field rejections.

  3. GraphQL extraction with pagination

    We extract erxes data through GraphQL paginated queries. Extraction order follows dependency hierarchy: Companies first, then Contacts with companyId resolution, then Pipelines, then Deals with pipelineId and stageId resolution, then Tasks with owner email lookup, then Conversations with Contact ID resolution. Each extraction wave produces a row-count reconciliation report. For datasets over 50,000 records, we chunk extraction into batches to avoid API timeouts and handle rate-limit responses with exponential backoff.

  4. User reconciliation and GoHighLevel team provisioning

    We extract every distinct erxes User referenced on Contacts, Deals, and Tasks and match by email against the GoHighLevel destination account's team members. Users without a matching GoHighLevel account go to a reconciliation queue. The customer's GoHighLevel admin provisions any missing team members (active or inactive per customer preference) before record import resumes. Owner assignments cannot resolve until User mapping is complete.

  5. Production import in dependency order

    We import records into GoHighLevel in dependency order: Companies first, then Contacts with companyId linked, then Pipelines and Stages, then Deals with pipelineId, stageId, and ownerId resolved, then Tasks with contactId or opportunityId linked, then Conversation history as structured notes. Each phase emits a row-count and field-coverage report before the next phase begins. We use GoHighLevel REST API batch endpoints with rate-limit handling.

  6. Cutover, validation, and workflow handoff

    We freeze erxes writes during cutover and run a final delta migration of any records modified during the migration window. We validate imported record counts, spot-check field coverage, and confirm parent-record lookups resolved correctly. We deliver the Automation Workflow Inventory document and the Channel Reconfiguration Checklist to the customer's admin team. We support a three-day hypercare window for reconciliation issues. We do not rebuild erxes automations in GoHighLevel; that is documented for the customer's admin to handle as a separate configuration task.

Platform deep dives

Context on both ends of the pair

erxes logo

erxes

Source

Strengths

  • True open-source with MIT license gives full code access and modification rights without vendor lock-in
  • Self-hosting option on DigitalOcean, AWS, or on-premise infrastructure provides complete data residency control
  • All-in-one platform consolidating marketing, sales, operations, and customer service modules
  • Plugin-based architecture allows activating only needed functionality without paying for unused features
  • Free Community edition offers generous feature set comparable to paid SaaS CRM tiers

Weaknesses

  • Steep technical learning curve requiring GraphQL knowledge and React familiarity for deep customization
  • Limited third-party integration marketplace compared to established CRM platforms
  • Documentation gaps make self-service troubleshooting difficult outside of paid support tiers
  • Mobile application stability issues reported in user reviews with authentication failures
  • Performance can degrade with large data volumes on underpowered self-hosted deployments
HighLevel logo

HighLevel

Destination

Strengths

  • Consolidates CRM, marketing automation, email, SMS, scheduling, and funnels into one platform at a predictable flat monthly rate.
  • Supports unlimited contacts and unlimited users on all paid tiers, removing per-record billing anxiety as databases grow.
  • Offers white-label and sub-account capabilities that let agencies resell access and manage multiple client environments under one billing relationship.
  • Includes built-in review management, reputation monitoring, and AI agents as native features rather than third-party add-ons.
  • Exports Contacts and Companies via a scalable async bulk CSV system that handles multi-million-row datasets without blocking the UI.

Weaknesses

  • The breadth of features creates a steep learning curve; advanced automations and Workflow configuration require significant time investment that smaller teams may not recover.
  • The platform charges usage-based fees for telecommunications and AI features that are not included in the base subscription, leading to bill surprises.
  • Recurring user reports on Reddit and G2 describe bugs, errors, and slow support response times that disrupt live marketing and sales operations.
  • Sub-account architecture, while powerful for agencies, adds migration complexity when identifying which client data lives in which isolated environment.
  • The platform is designed for agencies and SMBs; larger enterprises requiring deep reporting, custom objects at scale, or complex role-based access may outgrow its capabilities.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across erxes and HighLevel.

  • Object compatibility

    B

    2 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    erxes: Not publicly documented.

  • Data volume sensitivity

    B

    erxes doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your erxes to HighLevel migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about erxes to HighLevel data migrations

Answers to the questions buyers ask most during erxes to HighLevel migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your erxes to HighLevel migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between two and four weeks for accounts under 15,000 Contacts and 3,000 Deals with no custom objects and a straightforward pipeline structure. Migrations with multiple custom field configurations, large engagement histories (over 100,000 conversation records), or multi-pipeline Deal structures move to five to eight weeks because of GraphQL extraction chunking, GoHighLevel custom field pre-creation, and parent-record lookup resolution.

Adjacent paths

Related migrations to explore

Ready when you are

Move from erxes.
Land in HighLevel, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day