CRM migration
Field-level mapping, validation, and rollback between erxes and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
erxes
Source
Freshsales
Destination
Compatibility
6 of 8
objects map 1:1 between erxes and Freshsales.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from erxes to Freshsales is a platform architecture shift from self-hosted open-source to cloud-native SaaS. erxes organizes data around Contacts, Companies, Deals in Pipelines, and Tasks under a plugin-based XOS architecture with no native bulk export; all extraction runs through GraphQL queries against plugin-activated modules. Freshsales uses the Freshworks CRM model with Leads, Contacts, Accounts, Deals, and Tasks, offering CSV import and a built-in CRM Migration tool for supported sources. We handle the schema translation between erxes plugin modules and Freshsales object types, map custom fields to Freshsales properties, and migrate engagement history through CSV with the activity timeline preserved. Automations, Channels, and plugin-specific configurations do not migrate; we deliver a written inventory for manual rebuild. The pricing shift from erxes Community (free self-hosted) to Freshsales Growth ($9/user/month) or Pro ($39/user/month) introduces per-seat cost that erxes self-hosted deployments avoid, and the customer manages infrastructure directly in erxes versus Freshsales managing availability.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a erxes object lands in Freshsales, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
erxes
Contact
Freshsales
Lead or Contact (split based on lifecycle status)
1:1erxes Contacts map to Freshsales Lead if the contact represents an unqualified prospect, or to Freshsales Contact if the contact is associated with a company and represents an active sales relationship. We determine the split by examining erxes custom fields for lifecycle status indicators, or by applying a default rule (all erxes Contacts migrate as Freshsales Contacts unless the customer specifies a Lead qualification criteria). The erxes primaryEmail becomes the Freshsales email field, used as the dedupe key. Custom field values on erxes Contacts map to Freshsales custom properties on the corresponding object.
erxes
Company
Freshsales
Account
1:1erxes Company records map directly to Freshsales Account. The Company name becomes Account Name, and the primaryEmail or website maps to the corresponding Freshsales Account fields. erxes Companies linked to Contacts via companyId create the Account-Contact relationship in Freshsales during the Contact import phase. We resolve the Account record first so that the AccountId lookup is satisfied when Contacts are imported.
erxes
Deal
Freshsales
Deal
1:1erxes Deals map to Freshsales Deals. The erxes deal amount, stage name, and pipeline assignment migrate to Freshsales Deal amount, deal stage, and pipeline. We map erxes Pipeline and Stage names to Freshsales pipeline and stage configurations that the customer pre-configures in Freshsales before migration. Closed-won and closed-lost statuses from erxes map to Freshsales deal statuses with probability percentages preserved.
erxes
Pipeline
Freshsales
Pipeline
lossyerxes Pipelines define the sales workflow stages for Deals. We map erxes pipeline configurations including stage order, stage names, and probability mappings to Freshsales pipeline and stage configurations. The customer configures the Freshsales pipeline structure before migration, and we map the erxes stage IDs to the corresponding Freshsales stage IDs during import. Stage sequence and probability percentages transfer directly.
erxes
Task
Freshsales
Task
1:1erxes Tasks migrate to Freshsales Tasks with title, description, due date, status, and owner assignment preserved. The erxes userId mapping resolves to Freshsales User records by email match. Tasks linked to specific Deals or Contacts carry the corresponding Freshsales lookup ID after parent record resolution. Task priority and status (open, completed) map directly to Freshsales Task fields.
erxes
Conversation
Freshsales
Note or Custom Object
1:1erxes multi-channel Conversations (email, SMS, chat, WhatsApp) migrate to Freshsales as Notes attached to the corresponding Contact or Account record, or to a custom Conversation object if the customer configures one at Enterprise tier. The Conversation body, channel type, and customer association transfer, but channel-specific metadata (WhatsApp template IDs, SMS carrier information) does not have a Freshsales equivalent and is flagged in the migration report. Message threading order depends on erxes server timestamps, which we preserve as Note createdAt values.
erxes
Custom Field (on Contact, Company, Deal, Task)
Freshsales
Custom Field
lossyerxes custom fields defined on Contacts, Companies, Deals, and Tasks migrate to Freshsales custom fields on the corresponding objects. We map the erxes field schema (field name, data type) to Freshsales field types: text fields to Text, date fields to Date, dropdowns to Picklist, multi-select to Multi-select Picklist. The customer pre-creates the destination custom fields in Freshsales before migration so that the field API names are available for mapping. erxes custom fields have no type enforcement on ingest, so we validate against erxes field definitions before mapping to prevent type mismatches in Freshsales.
erxes
User/Team Member
Freshsales
User
1:1erxes Users map to Freshsales User records by email match. Role and permission configurations in erxes (team-based access control) do not have a direct Freshsales equivalent because Freshsales uses a simpler role-permission model (Admin, Standard). We migrate User records with name, email, and active status, and the customer's Freshsales admin reviews role assignments post-migration. Any erxes User without a matching Freshsales User email goes to a reconciliation queue for manual provisioning.
| erxes | Freshsales | Compatibility | |
|---|---|---|---|
| Contact | Lead or Contact (split based on lifecycle status)1:1 | Fully supported | |
| Company | Account1:1 | Fully supported | |
| Deal | Deal1:1 | Fully supported | |
| Pipeline | Pipelinelossy | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Conversation | Note or Custom Object1:1 | Fully supported | |
| Custom Field (on Contact, Company, Deal, Task) | Custom Fieldlossy | Fully supported | |
| User/Team Member | User1:1 | Fully supported |
Gotchas + challenges
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 gotchas
No native bulk export in Community edition
Plugin activation state affects data visibility
Custom fields have no type enforcement during import
Conversation message ordering depends on server timestamps
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
Pre-migration audit and plugin activation check
We audit the source erxes instance to identify all active plugins, data volumes per object (Contacts, Companies, Deals, Tasks, Conversations), custom field definitions, pipeline configurations, and user accounts. We confirm that all plugins relevant to the migration scope are active before extraction begins. We document any deactivated plugins and flag inaccessible data for the customer to activate or manually export.
Freshsales account provisioning and custom field creation
The customer provisions a Freshsales account at the appropriate tier (Growth, Pro, or Enterprise) and configures the pipeline and stage structure before migration. We provide a custom field manifest listing every erxes custom field that needs a corresponding Freshsales property, with the recommended Freshsales field type for each. The customer creates these custom fields in Freshsales before data import begins so that the field API names are available for mapping.
GraphQL extraction with pagination and chunking
We extract data from erxes via GraphQL queries against the plugin-activated API endpoints. Extraction runs in pagination batches (typically 100-500 records per query) with cursor-based navigation for large datasets. We implement rate-limit handling with exponential backoff and retry logic to manage API throttling. Conversation messages extract separately with server timestamp preservation for timeline ordering. The extraction outputs CSV files per object type ready for Freshsales import formatting.
Data transformation and field mapping
We transform extracted data into Freshsales CSV format with correct column headers, field type validation, and the Lead-Contact split rule applied to Contact records. Custom field values map from erxes field names to Freshsales custom property API names. Owner resolution matches erxes user emails to Freshsales User emails. Any records with missing required fields or invalid data formats go to an error queue for customer review before import.
Sandbox import validation and reconciliation
If the customer has a Freshsales sandbox or is willing to provision one for validation, we run a test import with a representative data subset to verify mapping accuracy, identify field mismatches, and confirm that custom fields accept the mapped values. We generate a reconciliation report comparing record counts between erxes source and Freshsales destination, and spot-check 25-50 records field by field. Any corrections to the mapping or Freshsales custom field configuration happen at this stage.
Production import and cutover
We run the full production import into Freshsales in dependency order: Accounts (from Companies), Users (validated by email match), Contacts (with AccountId resolved), Deals (with pipeline and stage mapped), Tasks, and Conversation history (as Notes or custom Conversation records). Each phase emits a reconciliation report. We freeze erxes writes during the final delta migration window, import any records modified during the migration window, then hand off to the customer for Freshsales go-live. We do not migrate Automations, Channels, or Workflows; we deliver a written inventory of these for the customer's admin to rebuild.
Platform deep dives
erxes
Source
Strengths
Weaknesses
Freshsales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across erxes and Freshsales.
Object compatibility
2 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
erxes: Not publicly documented.
Data volume sensitivity
erxes doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during erxes to Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your erxes to Freshsales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave erxes
Other ways to arrive at Freshsales
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.