Migrate from Freshsales to EspoCRM

Moving from Freshsales to self-hosted EspoCRM is mostly a data mapping and rebuild exercise: export once, map records, import with duplicate matching, then rebuild sequences and assignment rules.

On this page

Migrate from Freshsales to EspoCRM: what the move involves

If a Freshsales renewal, price increase or data residency requirement has forced a decision, the core work of moving to EspoCRM is a one-time project with three parts: a single full-range export from Freshsales, mapping contacts, accounts, deals and activities onto EspoCRM's records, and rebuilding the automation your sales team relies on. Most teams have an internal administrator own the export and field mapping, with an implementation partner handling hosting, the import and cutover. For most sales teams, the effort sits in the mapping and the automation rather than the file transfer, and the main risks are lost history and broken assignment. Treat this page as a planning guide. The figures for your own effort should come from a test migration on your data.

Start with the export, because it is the step you cannot easily repeat. Confirm what the export archive contains before you rely on it, and keep the untouched files as your source of truth. Check that custom fields, pipelines, deal stages and activity history are present, since an export covers record data and does not document your configuration. Map each Freshsales object to an EspoCRM entity and record the mapping field by field, including picklist values and record owners. Then import into a staging instance first. The EspoCRM import documentation describes how existing records are matched, so confirm which fields decide a duplicate before you run anything against production, or the same contact will end up in two records.

Which Freshsales capabilities map cleanly to EspoCRM

This table compares the main Freshsales capabilities with their closest EspoCRM equivalents and marks each as clean, needs rework or gap. Read the status column first, then the notes, and treat every row marked needs rework or gap as a scoping item before the migration plan is written.

Freshsales capabilityStatus in EspoCRMWhat to confirm or rebuild
Contacts and accountsCleanCore entities with standard fields. Map Freshsales contact and account fields to EspoCRM fields and confirm how each duplicate rule behaves on your data.
Deals and pipelinesNeeds reworkEspoCRM covers opportunities and stages, but Freshsales stage layouts and deal fields must be rebuilt in the Entity Manager and checked against reports.
Activities (calls, emails, meetings, tasks)Needs reworkActivity history can be imported where the export includes it. Confirm how each activity type is linked back to its contact, account or deal.
Custom fieldsNeeds reworkCreate matching custom fields before import. Confirm field types, picklist values and required flags so the import does not fail silently.
Email integrationNeeds reworkEspoCRM offers email integration through its own configuration and extensions. Confirm the mailbox and sync behavior you need, including Outlook or Google options, against current docs.
Phone and callingGapConfirm whether the VoIP extension covers your telephony provider and calling workflow. Do not assume parity with Freshsales built-in calling.
SequencesGapFreshsales sequences must be confirmed against EspoCRM's extensions, including the Sales Pack, before any cadence is promised to sales teams.
Workflows and automationNeeds reworkThe Advanced Pack, included in EspoCRM Cloud plans, provides workflows and Business Process Management. Rebuild each Freshsales automation and test it.
Assignment rulesNeeds reworkConfirm how round-robin or territory-style assignment can be built with workflows or formula scripts, and test with sample records.
Reports and dashboardsNeeds reworkThe Advanced Pack provides reports. Rebuild each dashboard the business uses and check that totals match the Freshsales export.
User roles and permissionsCleanRole-based access with teams. Map each Freshsales role to an EspoCRM role and verify record visibility with test users.

Which records and integrations move, and which must be rebuilt

Core CRM records move through a one-time full-range export and import into EspoCRM, while email, phone, marketing and sign-in connections must be configured again. Each card below marks one item to check before the Freshsales subscription ends.

Core records from the full-range export

The full-range admin export from Freshsales is the documented starting point for contacts, accounts, deals and activities. Run it once, store the emailed archive, and map each file's columns to EspoCRM entities before importing. Check record counts per type against Freshsales after each import, because a partial export is easy to miss. The sibling export page covers what the archive contains and how to plan the run.

Attachments, notes and custom objects

Notes, attachments and custom objects need explicit checking after the export, because they are the items most likely to be missing or stored in a different form. Confirm with Freshsales support whether attachment files are included in the archive and how custom fields and custom modules are represented. Keep a list of every custom object and file type, then verify each one in the export before the subscription ends.

Email sync and mailbox history

Email sync is a connection to rebuild, not data to import. Decide which mailboxes will log to EspoCRM and confirm the connector for your provider, since EspoCRM publishes official Google and Outlook extensions. Historical email may not come across with the export, so confirm with Freshsales support what it includes and plan how past correspondence will be kept accessible.

Phone and calling integration

Calling and call logging depend on your telephony provider, so the Freshsales phone setup must be recreated against EspoCRM's official VoIP extension or another supported option. Confirm which call activity types and recordings are exported, and test inbound and outbound calls with a small group of users before cutover. Ask your telephony provider whether its existing numbers and routing can be reused without changes.

Marketing tool connections

Marketing sync and lists that Freshsales pushes to or pulls from external tools must be rebuilt in EspoCRM. EspoCRM publishes an official MailChimp extension, and you should confirm whether any other marketing platform you use has a supported connector. List membership, unsubscribe status and consent fields should be checked after import, since they affect compliance as well as campaign reach.

Single sign-on and directory login

Users sign in to Freshsales with their own credentials, so EspoCRM needs a deliberate choice before users are invited. EspoCRM supports OpenID Connect sign-in since version 7.3, including optional user creation on first login and mapping identity provider groups to teams, and it also documents LDAP for Active Directory and OpenLDAP. EspoCRM's own two-factor authentication is not compatible with OIDC, so plan MFA at the identity provider and keep a fallback login method.

The migration sequence from inventory to decommission

This sequence moves Freshsales data, configuration and users into a self-hosted EspoCRM instance in controlled stages, with a written check at each step so that nothing is decommissioned until the archive and the reconciled records are confirmed. Each step produces an artifact the next step depends on.

  1. Inventory fields, automations and users

    Before touching data, list every custom field, pipeline stage, sequence, workflow, assignment rule, email template and user role in Freshsales, and note which ones your sales team actually uses. Your sales operations lead should own this list, with input from a finance or support contact who relies on reports. The step is done when you have a signed inventory that marks each item as migrate, rebuild or retire.

  2. Provision and configure the EspoCRM instance

    Stand up EspoCRM in your own cloud account or data center, using the supported server configuration for PHP, the database and the web server, and set up cron for background jobs. Your platform team configures backups, TLS, and the authentication method you have chosen, such as OIDC or LDAP, before any business data arrives. Confirm the version you deploy against the EspoCRM releases page and the server configuration docs. The step is done when a test user can log in, the scheduled jobs run, and a backup and restore have been rehearsed on an empty instance.

  3. Build the mapping workbook and run a test import

    Create a workbook that maps each Freshsales record type and field to an EspoCRM entity and field, including contacts, accounts, deals and activities, and records the transformation for picklists, dates, currencies and owners. Then import a small, representative sample using EspoCRM's import tool and check duplicate matching rules against it. The output is a field map signed by the sales operations lead and a test-import report that lists every rejected or mismatched row and its fix.

  4. Pilot with one sales team

    Move one team's pipeline, contacts and activity history into EspoCRM and have those users work in it for a defined period of normal selling. Track what breaks, including missing fields, wrong owners, lost email history and any workflow that behaves differently from Freshsales. Rebuild only the sequences and assignment rules the pilot needs, and fix the mapping before the next team starts. The pilot is signed off when the team lead confirms that their daily pipeline view and reports match the agreed requirements and the open issue list is closed or accepted in writing.

  5. Run both systems in parallel

    Keep Freshsales live for read and reference while the remaining teams work in EspoCRM, and run a scheduled delta import of records changed since the last load. Reconcile record counts by type and owner between the two systems at each cycle, and investigate every difference rather than overwriting it. The step produces a reconciliation log showing matched counts, duplicates resolved and any records that exist in only one system, with a named owner for each open difference.

  6. Cut over data and users

    Freeze edits in Freshsales, run the final full-range export, and import the remaining delta into EspoCRM. Switch all users to EspoCRM, confirm that assignment rules and workflows are active, and reconcile the final counts against the export. Freshsales should remain available in read-only form until the next step. The cutover is complete when the final reconciliation is signed by the sales operations lead and every user has logged in to EspoCRM and confirmed access.

  7. Archive the export and decommission Freshsales

    Store the full-range export archive, the mapping workbook, the reconciliation logs and the signed inventory in your retention location, and confirm that your legal, finance and compliance owners accept them as the record of the old system. Then cancel the Freshsales subscription at the end of its billing term and remove its integrations and API keys. The step is done when the archive has been verified as readable, the subscription cancellation is confirmed in writing, and the decommission checklist is filed with the owner's sign-off.

How EspoCRM import, duplicate matching and the API fit the cutover

Treat the import as a rehearsal before it becomes the cutover. Load the Freshsales export into a copy of your EspoCRM instance before production is touched, running on the same database engine and version you will use live. EspoCRM's import documentation describes how source columns are mapped to entity fields and how incoming rows are checked against existing records to flag duplicates. Confirm in your version which fields the duplicate check uses for accounts and contacts, and whether a match updates the existing record or only skips the row. Then compare record counts per entity against the Freshsales export and spot-check owners, teams and account links on a sample of deals. A sensible production order is accounts, then contacts, then deals, then activities, so each linked record already exists when it is referenced. Let the rehearsal results, not the first attempt, set that order and the duplicate settings.

The REST API is the second route in. It fits bulk loading that is too large for a manual import, and ongoing sync during a parallel run in which both systems receive changes. Create a dedicated API user with a role that grants access only to the entities the integration touches, and authenticate with HMAC, which the EspoCRM API documentation describes as the most secure of the supported methods. The same documentation says basic authentication is not recommended, so do not use it. Store API keys and secrets in your secrets manager, not in scripts kept in shared repositories. Background work also depends on the server. EspoCRM needs cron or a scheduled task running for background jobs, so confirm that the cron entry exists, runs as the correct user and succeeds before cutover. Jobs that depend on it will otherwise sit idle without an obvious error.

Formula Script is where Freshsales logic is most often lost. Field defaults, validation and calculations that run on save belong in before-save scripts configured in the Entity Manager. API before-save scripts cover writes that arrive through the REST API, so a bulk load can trigger rules that a user in the interface would never see. Export a list of your Freshsales automations before cutover and classify each as field logic, notification, assignment or sequence. Rebuild the field logic in Formula Script, and rebuild workflows and BPM with the Advanced Pack, which the EspoCRM pricing page includes in cloud plans. Confirm how that extension is licensed and installed on your own servers. Test every rebuilt rule on the rehearsal copy, because a before-save script that fires during import can overwrite the owner or stage values you just mapped.

How the migration changes by team size and starting point

A small sales team with a short pipeline, a handful of standard fields and few or no sequences has the lightest migration. The record count is usually the smallest driver, and most of the effort goes into the export, one round of field mapping and a check that contacts, accounts, deals and activities link correctly after import. Because the configuration is close to EspoCRM's defaults, much of the work is confirming choices rather than building new ones.

  • Export scope: Run the full-range admin export once, then confirm the emailed ZIP includes every record type you rely on.
  • Field mapping: Map standard fields to EspoCRM's built-in entities and note only a few custom fields to recreate.
  • Duplicate matching: Set EspoCRM's import duplicate rules on email and account name, then review a small sample of matches by hand.
  • Assignment: Recreate owner assignment with a few teams or simple rules, if any are needed at all.
  • Cutover: Plan a short window to freeze edits in Freshsales, import, and compare record counts.

Check with your team that no active workflow depends on a Freshsales automation you have forgotten, since those must be rebuilt by hand.

What drives the cost and duration of the move

This table lists the drivers that change how long the move takes and what it costs, with the cost components behind them. Read each row as a question to ask your implementation partner, and use the last row as the checklist for a written quote.

DriverWhy it changes cost or effortHow to keep it down
Record volume and attachmentsFreshsales full-range exports include contacts, accounts, deals, activities and attachments in one emailed ZIP. Larger volumes lengthen export checks, staging imports and reconciliation, and attachments need separate storage sizing on the EspoCRM server.Confirm the record and file counts from the export before scoping. Archive closed records older than your retention policy and move large attachment sets to a planned, separate import batch.
Custom fields and pipelinesEach custom Freshsales field or pipeline needs a matching EspoCRM field, stage list or layout. Field type mismatches, such as picklists stored as free text, create mapping rework.Inventory fields and pipelines in a mapping sheet before any import. Retire unused fields, and agree stage definitions with sales leads before configuration starts.
Automation and sequence rebuildFreshsales workflows, sequences and assignment rules do not transfer as-is. EspoCRM rebuilds them with workflows and BPM in the Advanced Pack or with Formula Script, and each rule is designed, tested and signed off separately.List every active rule and sequence with its owner and purpose. Rebuild only the rules still in use, and test them against sample records before go-live.
Integration countEmail, phone, calendar, marketing and data-warehouse connections each need a new connector, credentials and testing. Official EspoCRM extensions cover several common cases, but others may need custom API work.Count live integrations and decide which are required on day one. Confirm each extension and API path against your own environment before quoting.
Identity setupSingle sign-on through OpenID Connect or LDAP, group-to-team mapping and API user roles add configuration and security review. EspoCRM's own two-factor authentication is not compatible with OIDC, so the identity design must be settled first.Decide the identity provider and team model early. Use dedicated API users with role-based permissions, and confirm the authentication method your security team accepts.
Hosting and backup designRecurring hosting covers the server, database, TLS, patching and backups. The EspoCRM server requires PHP, a supported database and scheduled jobs, and backup and restore must be tested, not assumed.Choose the install path that matches your team, such as the Docker-based installation script or your own stack. Ask for a documented restore test as a deliverable.
Data cleansing and duplicate matchingDuplicate contacts and accounts from Freshsales can distort EspoCRM matching during import. Cleansing takes business time from sales operations, and it is the driver most often underestimated.Deduplicate and standardize email addresses, phone formats and owner fields in the source before export. Agree matching rules with the business owner of the data.
User training and parallel runSales users need training on new layouts, workflows and mobile use. A parallel run keeps Freshsales read-only or active while EspoCRM is checked, which adds licence and admin time until cutover.Train by role with real records. Keep the parallel run short and define exit criteria, such as reconciled counts and signed-off reports, before the run starts.
Cost components and quote requestOne-time costs cover analysis, mapping, configuration, migration, testing and training. Recurring costs cover hosting, backups, upgrades, extension licences where needed and administration. Freshsales subscription fees continue until the contract ends.Ask the quote to show each one-time and recurring item separately, the assumptions behind each, the record counts used, the test and sign-off steps, and what is excluded.

What usually goes wrong and how to prevent it

Most failed Freshsales to EspoCRM moves fail in predictable places: the export, the import keys, the history, the routing rules and the cutover itself. Each card below names one failure, why it matters for this migration, and the check that prevents it. Treat them as a pre-cutover checklist rather than a post-launch fix list.

Incomplete export from limits

Freshsales limits how often you can export, so a team that runs several partial exports can miss records or double count them. Plan a single full-range export, record its date and record counts for each entity, and reconcile those counts against the records loaded in EspoCRM. Confirm the current limits and the link lifetime in your own account before you schedule the export, because a missed window can delay cutover.

Duplicates from weak matching keys

If you import contacts by name alone, people with shared names or changed job titles are either duplicated or merged into the wrong record. Use the email address as the primary matching key for contacts and the company domain or normalized name for accounts, and run EspoCRM's duplicate checks on a test import first. Review a sample of matches by hand before the full load.

Lost activity history

Activities such as calls, meetings and notes are linked to contacts, accounts and deals by IDs that do not carry over automatically. If those links are dropped, sales reps lose the timeline that justified their pipeline. Import parent records first, keep the Freshsales IDs in a custom field as an external reference, and then import activities against those references. Spot-check a handful of active deals afterward.

Assignment rules routing deals wrongly

Freshsales territory or round-robin logic does not transfer, so rebuilt rules in EspoCRM can send deals to inactive users, former employees or the wrong team. Map each Freshsales owner to an active EspoCRM user and team before import, then test each rule with sample records owned by each region or segment. Ask the sales lead to sign off on the routing for open deals before go-live.

Sequences not recreated

Freshsales sequences are not a file you can import, so cadences stop silently after cutover unless someone rebuilds them. Inventory every active sequence, its steps, templates and enrollment criteria, then rebuild each one in EspoCRM workflows or the Advanced Pack, and confirm with the owner that the steps match. Check which tooling your team already depends on before you retire the old cadence.

Users locked out after cutover

Users who sign in through a corporate identity provider or with passwords reset during import often cannot log in on day one. Decide early whether EspoCRM uses local accounts, LDAP or OpenID Connect, test a sign-in for each role, and keep a fallback login method for administrators. Confirm that EspoCRM's own two-factor authentication is handled according to the chosen sign-in method.

Missing backups before cutover

Without a verified backup of the EspoCRM database and attachments, a bad import cannot be rolled back, and the Freshsales export is the only copy of the original data. Take a database backup before every import run, store the Freshsales export in a restricted location, and test a restore on a separate instance. Keep both sources until the team has signed off that the counts reconcile.

Questions buyers ask before moving from Freshsales to EspoCRM

How much does it cost to move from Freshsales to EspoCRM?

The EspoCRM software carries no license fee, because it is licensed under AGPL-3.0 and the open-source edition can be downloaded and self-hosted for free. Your costs are what it takes to run it. Recurring costs include servers or a cloud account, backups, storage, certificates, and staff or partner time for upgrades and user support. One-time costs include the migration work: exporting data, mapping fields, testing imports, rebuilding workflows and training users. The main saving is the end of the Freshsales per-user subscription. If you prefer a hosted option, the EspoCRM pricing page lists EspoCRM Cloud at 15 US dollars per user per month on Basic (minimum 3 users), 25 on Enterprise (minimum 5 users) and 69 on the highest plan (minimum 10 users), with the Advanced Pack included. Ask every quote to separate one-time migration fees from recurring hosting and support.

How long does a Freshsales to EspoCRM migration take?

No duration can be given from the information available, so confirm it in the written scope. The timeline depends mainly on the volume of contacts, accounts, deals, activities and attachments, the number of custom fields and pipelines that need mapping, the number of workflows and sequences to rebuild, and the integrations to replace, such as email, phone, calendar and web forms. Each import round, duplicate review and user acceptance test adds time, and so do decisions that sales operations has to make. Teams with clean data and a short field list finish sooner. A fixed-scope engagement lists phases, deliverables and dates in writing before work starts. Ask for the phase list, the number of test cycles included, what your team must review and by when, and how a repeated export is handled if the first one is incomplete.

What does our team need to provide before the migration starts?

Your team needs to provide access and decisions that only your organization can make. The main items are:

  • A Freshsales administrator who can run the full-range export and confirm which record types it contains.
  • A target environment in your own cloud account, data center or private network, with DNS, TLS certificates and a mail relay agreed.
  • A list of users, roles, teams and territories, and the rules that assign leads and deals today.
  • A sign-off on the field mapping, including which custom fields are kept, renamed or retired.
  • A rule for duplicates, such as which fields identify the same contact or company and which record wins.
  • Named business owners who will test pipelines, reports and email logging before cutover.

Agree these items in writing with the scope, because most delays come from open decisions rather than technical problems.

Can an internal admin run the migration without outside help?

Yes, a capable internal administrator can run the migration alone, but it depends on skills beyond CRM configuration. The admin needs to be comfortable with Linux server administration, a supported database (MySQL, MariaDB or PostgreSQL), scheduled tasks and backups, plus EspoCRM's Entity Manager, import tool and permissions model. Smaller datasets with few custom fields are the easiest to handle in-house. Risk grows with large volumes, complex territory rules, many integrations and a short cutover window, because a failed import can leave duplicated or partial records. Ask yourself who will patch and upgrade the system after go-live, who holds the backup and restore procedure, and who covers absences. If those answers are unclear, a fixed-scope engagement can cover planning, implementation, testing and documentation, with ongoing support available as a retainer.

Do Freshsales sequences and workflows move to EspoCRM automatically?

Plan on rebuilding them rather than assuming they transfer. Your export contains record data, and the exact scope of what it includes should be confirmed in your own export before you design the cutover. In EspoCRM, automation is built with workflows and Business Process Management, which are part of the official Advanced Pack and included in all EspoCRM Cloud plans. Field-level logic can be written in Formula Script in before-save scripts, workflows and BPM. Reports are also provided by the Advanced Pack. Inventory every sequence, assignment rule, notification and scheduled action in Freshsales, then assign each one a target in EspoCRM, a replacement or a decision to retire it. Test each rebuilt rule against sample records, because an automation that fires on the wrong stage can send messages to the wrong people.

How do we run Freshsales and EspoCRM in parallel during the move?

Run them in parallel for testing and validation, but define one system of record at each point in time. Start with a full export and import into a test instance, then repeat the import on a schedule as the team tests pipelines, reports and email logging. Before cutover, agree a freeze window, take a final export from Freshsales, run a last import into EspoCRM and reconcile counts for contacts, accounts, deals and activities. After cutover, keep Freshsales read-only for a defined period so staff can check historical records. Confirm the export limits in Freshsales before planning the final run, because the number of exports you can take in a day affects how many attempts fit into a cutover window. Document who approves the switch and how users are told where to work.

What hosting does EspoCRM need and how is it kept running?

EspoCRM runs on PHP with a supported database and a web server. The server configuration documentation lists PHP 8.3 to 8.5, MySQL 8.0 or newer, MariaDB 10.6 or newer or PostgreSQL 15, and Apache, Nginx or IIS as the web server. Cron or a scheduled task is required for background jobs, so plan for it from the start. For Ubuntu, Debian and Linux Mint, the installation by script deploys a Docker-based stack with Nginx and MariaDB, optional Let's Encrypt certificates, and a command.sh utility for backups, restores and upgrades. Operations work includes monitoring, patching the host, testing restores, reviewing extensions and planning upgrades. Confirm the supported versions for the release you choose before the environment is built, because version support changes over time.

How does duplicate matching work when importing records into EspoCRM?

EspoCRM's import tool can check incoming rows against existing records using fields you choose, so a contact that already exists can be updated or skipped instead of being created twice. Choose match fields that are stable and unique in your data, such as a verified email address for contacts or a registration number for accounts, and decide in advance whether an import updates, skips or creates on a match. Test the setting on a sample file first, because matching on a field that is often blank or shared, such as a generic company mailbox, merges records that should stay apart. Keep the source export, the mapping file and a log of each run, so you can explain any difference to the business. Read the EspoCRM import documentation before setting rules, and confirm the behavior on your version during testing.

How DeployOpen scopes and runs a Freshsales to EspoCRM migration

DeployOpen is a Chainscore Labs company that plans, implements, integrates, hardens, backs up, upgrades and documents self-hosted open-source platforms inside the client's own infrastructure, including the cloud accounts, data centers or air-gapped networks where the EspoCRM instance will run. For a Freshsales move, the first deliverable is a written scope that names the hosting target, the database engine (MySQL 8.0 or newer, MariaDB 10.6 or newer, or PostgreSQL 15), the record types in scope, the users and teams that need access, and the integrations to keep or retire, such as email, calendar and phone. Engagements are fixed-scope, so deliverables and timelines are agreed in writing before any work starts. A quote follows from that written scope, not the other way round.

Scoping a migration also means deciding what is out of the first cut. Typical decisions include whether Freshsales sequences and workflows are rebuilt in EspoCRM's Advanced Pack or in native workflows, whether the Freshsales export is reconciled against a test import first, who signs off the duplicate matching rules, and how the cutover window and the Freshsales subscription end date are aligned. Your team should confirm the Advanced Pack licensing and any other extensions you need directly with EspoCRM before the scope is final, and confirm the Freshsales plan terms and export limits with Freshworks. Hardening, backups and runbooks are normally separate line items in the written scope so they can be priced and reviewed on their own.

After go-live, many organizations keep a retainer for upgrades, backups, security patching and continuous testing of the EspoCRM instance. Ongoing support is available as a retainer and is scoped in writing in the same way as the migration. Ask any implementation partner, DeployOpen included, to show the written scope, the deliverables list, the acceptance criteria and the support terms before you sign, and to explain which costs are one-time and which recur. DeployOpen prepares systems, controls and evidence for compliance assessments, but it does not issue audit reports, attestations or certifications, so any audit or certification question remains with your independent auditor or certification body.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.