Section 01
Why teams migrate to Freshsales
The four shapes a Freshsales migration takes, and what makes the platform easier — or harder — than the category average.
Freshsales is the sales CRM inside the Freshworks Customer Engagement Suite, the company also known for Freshdesk and Freshservice. The product was originally launched as a standalone CRM and is now sold as Freshsales Suite — the bundled CRM, marketing automation, chat and telephony offering that succeeded the older Freshsales Classic and Freshmarketer Classic SKUs 1.
The typical Freshsales customer is a small to mid-market sales team — 10 to 200 reps — that wants pipeline, sequences and Freddy AI scoring without the per-seat cost and admin overhead of Salesforce. Compared with HubSpot Sales Hub, Freshsales positions itself on flat per-user pricing instead of a contact-tier model; compared with Pipedrive, it positions on the integrated Freshworks suite (one tenant for sales, marketing and support) plus Freddy AI deal insights.
The shapes of migration that actually land on Freshsales tend to fall into four patterns. First, HubSpot exits, driven by contact-tier pricing creep at the $2M–$10M revenue band where the bill triples as the list grows without any new feature usage 2. Second, Pipedrive consolidations, where a team needs marketing automation, telephony and chat alongside the deal pipeline and would rather have one vendor than four.
Third, Salesforce downsizes — teams that bought Sales Cloud for the brand and never used Apex, Flows or the AppExchange, and want a flat-rate CRM with the same Leads/Accounts/Opportunities mental model. Fourth, Freshsales Classic upgrades — existing customers being moved by Freshworks itself onto Freshsales Suite under the published plan-mapping table 1.
Each shape has a different difficulty profile: a Pipedrive migration usually has clean object parity, while a Salesforce migration brings rich automation that does not move across at all.
What makes migrating *to* Freshsales easier than the category average is the native CRM Migration tool itself — Freshworks ships pre-built importers from Pipedrive, Salesforce, Zoho and HubSpot that accept the source platform's own zip export and map default and custom fields automatically up to 25,000 records for instantaneous import 12.
What makes it harder than the average is the per-tier custom-field cap — the Sprout (Free) plan allows zero custom fields per entity, Blossom (Growth) allows 10, and only Forest (Enterprise) opens up to 450 across the core modules 3. Teams who do not check this number against their source schema discover mid-import that they need to upgrade the tier before they can even land the data.
Workflows, Sales Sequences, Freddy AI scoring rules and reports do not import — they are rebuilt from documentation. Teams that scope for that work up front finish on time; teams that assume parity do not.
Teams that scope for the rebuild work up front finish on time; teams that assume parity do not.
Section 02
The Freshsales data model you need to map into
Objects, custom fields, relationships, and the upsert keys you'll wire on every record — the destination schema decoded.
Freshsales is built around a small set of standard modules plus optional Custom Modules on higher tiers. The platform's object model splits people into two records — Leads for unqualified inbound and Contacts for qualified prospects associated with an Account. Leads were temporarily removed in the older Freshsales Classic generation and reintroduced in the current Suite as a separate module; do not assume your source platform's single People object collapses neatly into one Freshsales module.
Before you can map a field on the source side, you need to know exactly which destination module the row belongs on, what fields it requires, and which value will serve as its unique identifier for upsert. The table below summarises the modules you will touch in a Freshsales Suite migration.
| Object | Stores | Required on import | Tier |
|---|---|---|---|
| Contacts | Qualified people associated with an Account | Last name (email recommended as unique key) | All plans |
| Leads | Unqualified inbound prospects before account association | Last name, email | All plans (reintroduced in Freshsales Suite) |
| Accounts (Sales Accounts) | Companies / organisations | Name | All plans |
| Deals | Revenue opportunities in a pipeline stage | Deal name, sales pipeline, deal stage, deal value | All plans |
| Notes | Free-text notes attached to any record | Body, target record | All plans (20 MB attachment cap per note) |
| Tasks | Open or completed to-do items with owners and due dates | Title, owner, due date | All plans |
| Appointments | Calendar meetings logged against records | Title, start time, attendees | All plans |
| Documents / Files | Trackable attachments | File, owning record | 150 MB per file; storage scales with seat count |
| Products | Catalogue of sellable items linked to deals | Name, price | Pro and above |
| Custom Modules | Customer-defined record types | Schema defined first; per-field requirements | Enterprise (Forest) — up to 310 custom fields per module |
Contacts and Leads use email as the de-facto unique identifier — Freddy AI's duplicate detection on the Pro plan matches new records against existing rows on email. Accounts use name plus an optional custom cf_domain_name property as the practical upsert key, since the Sales Accounts bulk upsert path requires you to declare which property carries the unique value 4.
Deals and Custom Module records have no natural unique key, so create a single-line text custom field, mark it unique, and use it as your external ID during bulk upsert.
Custom field availability is the most important number in this section. Freshsales caps custom fields *per entity* by plan tier — Sprout offers zero, Blossom 10, Garden 150, Estate 305 and Forest 450, with Custom Modules getting their own 310-field ceiling on Forest 3.
| Field type | Limits | Notes |
|---|---|---|
| Text field (single-line) | 255 chars | Stores any alphanumeric string |
| Paragraph / multi-line text | ~65,000 chars | Line breaks preserved on import |
| Number | Integer or decimal | Strip currency symbols and thousands separators |
| Date | YYYY-MM-DD | Timezone-stripped — date values can shift by one day on import 5 |
| Datetime | ISO-8601 | Stored in account timezone |
| Dropdown (single-select) | ~250 options | Picklist values are case-sensitive on import |
| Multi-select / checkbox | ~250 options | Semicolon-delimited on CSV/XLSX import 6 |
| Lookup / relationship | Enterprise only for cross-module lookups | Required field on Custom Modules to bind parent records |
| Formula field | Enterprise / Forest only | Does not import — rebuild on-platform |
| Custom fields per entity | 0 / 10 / 150 / 305 / 450 (Sprout → Blossom → Garden → Estate → Forest) | Custom Modules get a separate 310-field cap on Forest 3 |
Relationships in Freshsales are modelled as lookups between modules: Contacts associate to one or more Accounts, Deals associate to a primary Contact and an Account, and Custom Modules associate via lookup fields to standard modules 7. There is no master-detail-style cascade-delete: deleting a parent does not delete children, which is behaviour you may need to reproduce in a workflow if your source platform relied on it.
Custom Modules (Forest / Enterprise) participate in lookups the same way standard modules do. They are loaded via the same bulk upsert path and accept their own custom fields, with the 310-cap noted above 3.
Section 03
Pre-migration prep — the work before you touch Freshsales
What must be true on the source, the destination, and across the team before the first row hits the import tool.
The single best predictor of a clean Freshsales migration is how much work you do on the source side before the first import button is pressed. Freshworks Support's own best-practice article warns that fixing errors after the load is more expensive than fixing them in the CSV, and recommends a final clean run after a deliberate test load 9.
Configure Freshsales fully — users, custom fields, territories, pipelines — *before* the import, not after. Source-side fixes are an order of magnitude cheaper than destination-side cleanup.
Treat the source export as raw material that needs to be shaped to Freshsales's expected formats — email lowercased, phone normalised, picklist values made case-exact, multi-select values joined with semicolons, dates rewritten to YYYY-MM-DD, and owners resolved to Freshsales user email addresses that already exist in the destination.
Source-side prep
- Audit and dedup the source database before export. Freddy AI duplicate detection on the Freshsales side is Pro-and-above and runs *after* records land — case-variant emails will become two contacts unless you normalise upstream.
- Normalise emails to lowercase, trim whitespace, and strip role-based addresses (info@, sales@) that you do not want to flood the Contacts module with.
- Match picklist values case-exactly — Freshsales drop-down imports treat the value as case-sensitive, and a row whose
Stage = Newwill fail to map to a picklist value namednew11. - Convert multi-select values to semicolon-delimited strings in the CSV/XLSX — Freshsales splits on
;for multi-select fields and will treat a comma-separated value as a single literal string 6. - Stamp a stable external ID on every record in the source export — a UUID or the source platform's primary key — and store it in a custom unique field so re-runs and reconciliation are deterministic.
- Decide what is in scope for historical activities. Notes, Tasks and Appointments can be imported, but past Email conversations require the Freshsales email-sync historical import which runs *after* mailbox connection 13.
Destination-side prep
- Create a Sandbox under Admin Settings → Other SFA Settings → Sandbox if you are on the Forest / Enterprise plan — Sandbox is gated to that tier, only org admins can create one, and you can have one sandbox at a time 8. On lower tiers, use a free trial account as a throwaway dry-run instance.
- Provision users first under Admin Settings → Users with the exact email address you will reference in the
Sales Ownercolumn, otherwise unmatched owners default to the importing admin and silently break owner-based workflows 14. - Pre-create every custom field on the right module with the right type — Sprout supports zero custom fields, and even on paid tiers a Number field cannot be retroactively changed to Decimal after data lands 3.
- Build sales pipelines and deal stages before importing any deals — Freshsales rejects deal rows whose stage does not exist on the named pipeline.
- Configure territories and round-robin assignment rules so they run on imported data correctly 9. Workflow Automation rules should be paused during the import to avoid triggering notifications on backfilled records.
- Define Custom Modules and their lookup fields before importing. Custom Module schemas must exist before records of that type can be loaded.
People prep
Cutover only works if humans cooperate. Lock down a source-system freeze window — typically 24 to 72 hours — and communicate it to every department that touches the CRM. Train sales reps on Freshsales Kanban deal boards, the Contacts/Leads split and the Freddy AI insights panel before go-live, not after.
A small Pipedrive-to-Freshsales migration under 25,000 records runs as an instantaneous import 12; anything larger is queued by Freshworks and processed in off-peak hours over one to two business days. Build the human runway accordingly.
Section 04
Import mechanisms: UI wizard and CRM Migration tool
Two main paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.
Freshsales exposes two main load paths and the right one depends on dataset size and source platform. The native UI Import covers most one-shot migrations under 25,000 records. The CRM Migration tool ships pre-built importers from Pipedrive, Salesforce, Zoho and HubSpot. Third-party ETL tools sit on top of both and add staging, transformation and dedup layers.
UI Import (CSV / XLSX)
The native import lives on each module's list-view page — click Contacts → Import Contacts, Deals → Import Deals, or the equivalent on Accounts and Leads 6. The import accepts CSV and XLSX files up to 5 MB per file 11 and requires a column that maps to Last Name for Contact and Lead imports.
It offers two modes: Create new records only, or Create new + update existing — the upsert path that matches on a chosen unique field 6.
Multi-select fields require values separated by semicolons (;) in the CSV — comma separation is treated as a single string 6. Mandatory custom fields block the import if the column is missing or empty 11; bad rows are reported in an error-log email sent to the importing admin after the job finishes. The right call: UI for one-shot loads under 25,000 records on standard modules, or any time you want a visual mapping review before commit.
CRM Migration tool (pre-built source importers)
Freshsales ships a CRM Migration experience that accepts the source platform's own zip export and runs a static field mapping. The Salesforce variant accepts the standard Salesforce data export zip and imports Leads, Contacts, Accounts, Opportunities, Events and Tasks CSV files directly 15. The Pipedrive variant runs the same pattern with a zip export and maps default plus custom fields by exact name 12.
Custom-field auto-mapping requires the destination custom field to exist *with the exact same display name* as in the source export, so the prep step in Section 3 — creating Freshsales custom fields with matching names — is non-optional. The CRM Migration tool handles up to 25,000 records as an instantaneous load; over that, Freshworks queues a migration request and processes in 1–2 business days during off-peak hours 12.
Third-party staging tools
Tools like Airbyte, Fivetran, Stitch and Hevo all expose a Freshsales source/destination connector. Their role in a one-time migration is rarely the move itself — they are the staging layer that lands source data in a warehouse, the transformation layer that converts picklist case and resolves owner emails, and the ongoing-sync layer that takes over once the cutover is done.
Under 25,000 records and a Pipedrive / Salesforce / Zoho / HubSpot source → CRM Migration tool. Under 25,000 records from any other source → UI Import. Larger loads → split the export into sequential sub-25k chunks via the same paths, or stage through a warehouse with an iPaaS layer.
Section 05
Mapping your data into Freshsales
The longest section — because field mapping is where almost every migration that fails actually breaks.
Mapping is where every migration earns its scars. The schema decisions you make in your mapping spreadsheet determine whether reports work on day two, whether Workflow Automations fire correctly on day five, and whether your sales team trusts the data on day thirty.
Work module by module, top to bottom of the import order: Accounts first (so Contacts and Deals can lookup to them), then Contacts and Leads, then Deals, then Notes / Tasks / Appointments, then Custom Modules and Products.
Contacts and Leads
Freshsales splits people into Leads (unqualified inbound) and Contacts (qualified, account-bound). Decide your boundary before import: a common rule is that source records with a non-empty Account and any logged activity become Contacts, while everything else lands as a Lead. Importing the same person twice (once as Lead, once as Contact) is the most common preventable failure on day one.
Common source → Freshsales Contact mapping
- email→email (de-facto unique key)
Lowercase before import; matched by Freddy AI dedup on Pro+
- first_name / last_name→first_name / last_name
Last Name is mandatory — rows without it fail 11
- phone→mobile_number / work_number
Two distinct fields; normalise format before import
- owner / account_owner→Sales Owner
Map by user email; user must exist in Freshsales first 14
- lifecycle / status→Lifecycle stage / Lead stage
Picklist values case-sensitive 11
- tags→Tags
Semicolon-delimited string in CSV 6
- source / lead_source→Lead source
Pre-create missing dropdown options before import
- territory→Territory
Configure territory assignment rules before load so they run on the import 9
Accounts (Sales Accounts)
Common source → Freshsales Account mapping
- company_name→name (required)
Freshsales Accounts module —
nameis the human upsert key - website / domain→cf_domain_name (custom field)
Create as unique custom field; use as
unique_identifier_namein bulk_upsert 4 - industry→industry
Single-select; pre-create missing options
- annual_revenue→annual_revenue
Number — strip currency symbols
- parent account→Parent Account lookup
Set in a second pass once both parents and children are loaded
Deals and pipelines
Recreate every sales pipeline and every deal stage in Freshsales before importing deals. Each stage has a numeric probability that drives forecasting; build the mapping table source-stage → Freshsales-pipeline + Freshsales-stage-name. Deals whose stage value does not match any stage on the named pipeline are rejected by the importer with no automatic remap.
If you are consolidating multiple source pipelines, the cleanest approach is to keep them as separate Freshsales pipelines for at least 90 days post-migration, then merge once reporting has stabilised. The Deal value field is mandatory in Freshsales — if your source records carry null or blank amounts, populate them with 0 before import, as the Freshsales Support team explicitly recommends, or the rows will fail 9.
Common source → Freshsales Deal mapping
- deal_name / opportunity_name→deal_name
Required
- stage / pipeline_stage→deal_stage
Case-sensitive; must exist on the named pipeline
- amount→deal_value
Mandatory — backfill blanks with 0 9
- close_date→expected_close
YYYY-MM-DD; watch the off-by-one timezone bug 5
- owner→Sales Owner
Map by user email; deal owner drives forecasting
- primary_contact→Related Contacts (semicolon-delimited emails)
For multiple contacts per deal, separate emails with
;19 - account / organisation→Sales Account lookup
Use account name or cf_domain_name in a second pass
Custom-field mapping strategy
Resist the urge to map every source custom field one-to-one. Migrate only the custom fields used by an active process or report in the last 12 months. Freshsales caps custom fields per entity at 10 (Blossom), 150 (Garden), 305 (Estate) or 450 (Forest) 3 — and the CRM Migration tool's auto-mapping requires the destination custom field to exist with the exact same name as the source column, so every extra field is also extra prep work.
For picklist fields whose source values do not match the destination, either: (1) extend the destination dropdown with the missing options pre-import, (2) collapse adjacent values during transform, or (3) introduce a parallel custom field that holds the legacy value verbatim. Formula fields are Enterprise / Forest only and do not import — they are recomputed on-platform, so any source formula must be rebuilt as a Freshsales formula field on Forest or replicated via Workflow Automation on lower tiers.
Historical activities — notes, tasks, appointments, email and call history
Notes, Tasks and Appointments can be loaded via CSV import, each row carrying its own created_at and target record. For historical email conversations, Freshsales ships a Past Email Sync option under Profile icon → Connect Email → Edit Sync Settings, which pulls Gmail or Outlook threads and matches them to existing Contact and Lead records 13.
Historical email sync can be configured per user profile only once 13, so users must exist and have mailboxes connected before the sync window is set. Past call logs from third-party telephony providers rarely round-trip — the fallback is to attach a flat call-summary note per record with the original timestamp in the body text.
Files and attachments
Attachments do not import in bulk via the CSV path. The supported path is the Files feature — note attachments cap at 20 MB per file 20, standalone documents in the Files module accept up to 150 MB per file 21, and total storage scales with seat count at roughly 2 GB per user on paid plans 22.
For large attachment estates, the pattern most teams adopt is: keep originals in S3 or Google Drive, store a deep-link URL in a custom field on the parent record, and only upload the most recent subset inline. There is no native batch file-import path, so attachments are attached per record in the UI after parents land.
Audit trail, ownership and original timestamps
Standard created_at and updated_at are system-managed — they are stamped on import day and cannot be overwritten during a CSV load. To preserve the original audit trail, create two custom fields per module — *Legacy Created Date* and *Legacy Created By* — and populate them from the source export.
Owner assignment during import works only if the Sales Owner column contains the email of a user who already exists in Freshsales 14. Rows whose owner cannot be resolved fall to the importing admin, which silently breaks owner-scoped views, territory rules and Workflow Automations that filter by owner.
CRM-specific: lead scoring, Sales Sequences, Freddy AI, email/calendar sync
Freshsales Lead Score is computed by Freddy AI on the Pro plan and above, based on contact properties, deal stage transitions and engagement signals. Scoring models do not import — they accrue forward once the data lands. If you must preserve historical scores, put them in a *Legacy Lead Score* custom number field.
Sales Sequences (multi-step email cadences) do not have an import mechanism — recreate them manually under Sales Sequences → Create New and re-enroll active prospects post-cutover. Workflow Automations, IntelliAssign rules and Smartforms are rebuilt the same way.
Email and Calendar Sync (Gmail / Outlook) is connected per user under Profile icon → Connect Email *after* users are provisioned 13. Do not enable two-way sync during the import window or you will get a flood of duplicate engagements as the connector backfills the same Contacts you are loading.
Section 06
The pitfalls that derail Freshsales migrations
Nine specific failure modes — ranked by impact, each tied to the exact Freshsales mechanism that breaks.
High impact
Sprout / Blossom custom-field cap discovered mid-import
Sprout (Free) allows zero custom fields per entity and Blossom (Growth) allows only 10 3. Teams who export from Salesforce or HubSpot routinely arrive at Freshsales with 40+ custom fields on Contacts alone and discover mid-import that the destination cannot hold them. The mitigation is to count source custom fields per module *before* picking the plan tier and to budget for Garden (150 fields) or higher if your source schema is non-trivial. 3
High impact
Picklist values that don't match case fail silently
Freshsales dropdown imports treat picklist values as case-sensitive. A row carrying Stage = New will not match a destination option new — the row imports with the field blank, with no field-level error surfaced in the success counter 11. Build your transform layer against the exact destination option text (Admin → Custom Fields → Dropdown), and validate by re-exporting 100 random rows after import to confirm picklists round-tripped. 11
High impact
Date fields shifting by one day on timezone boundaries
Freshsales date fields are stored in account timezone, and source values exported as midnight UTC can shift by one calendar day on import — a documented behaviour where 2021-06-07 from a MySQL export lands as 2021-06-06 in Freshsales 5. The mitigation is to export source dates as YYYY-MM-DD with no time component, or to import as a datetime field at midday account-time, then truncate to date in a post-import workflow. 5
High impact
Mandatory Deal value rejects rows with null amounts
Freshsales mandates a value in the Deal value field on every Deal row, and the Best Practices article from Freshworks Support explicitly recommends populating blank deal-value cells with 0 before importing 9. Source systems like Pipedrive accept null amounts on early-stage opportunities, so a direct export will fail row-by-row at the validation step. Pre-process the CSV to default blanks to 0 and add a workflow to backfill real values post-import. 9
Medium impact
Sandbox gated to Forest (Enterprise) only
Sandbox — a full clone of your account for dry-run imports — is available only on Forest / Enterprise, and even there you get one sandbox at a time, creatable by org admins only 8. Teams on Growth or Pro who try to test against production discover this gap late. The mitigation is to use a 14-day free-trial account as a throwaway dry-run instance, or to provision a separate paid tenant for rehearsal. 8
Medium impact
5 MB CSV / XLSX file cap on the UI Import
The native UI Import accepts CSV and XLSX files only up to 5 MB 11, which a 25,000-row contact export with 30 custom fields easily exceeds. Teams whose export starts at 12 MB hit the file-size error before any data is parsed. The mitigation is to split the file into multiple sub-5 MB chunks and import them sequentially. 11
Medium impact
Multi-select fields treated as one literal string
Freshsales multi-select imports split on the semicolon character. A CSV column carrying Tracton Inc, Hilvell Org is interpreted as a single literal option named exactly that — not two separate option assignments. The fix is to globally replace commas with semicolons in every multi-select column before import (Tracton Inc;Hilvell Org) 6. Both with-overwrite and without-overwrite import modes follow this rule. 6
Low impact
Freshsales Classic to Suite migration loses some configurations
Freshworks migrated all existing Freshsales Classic and Freshmarketer Classic customers onto Freshsales Suite — a clone of the existing account is created, the old account is preserved, and customers are moved at no additional cost into a mapped plan 1. Custom Workflows, Smartforms and Sales Sequences need to be reviewed post-clone because some configurations do not round-trip cleanly. Plan a configuration audit immediately after the Suite clone is provisioned. 1
Section 07
Validation and cutover
What to verify after the import job, in what order — and how to fail safely when something is wrong.
Validation is the bridge between the import finishing and users being allowed in. Freshworks Support's own best-practice flow recommends a deliberate three-stage validation: a sample test load, full review of the error-log email, and a final run after errors are resolved 9. The most reliable signal is having department reps verify their own records — they know what right looks like better than any reconciliation script.
Build a reconciliation queries spreadsheet that compares source and destination on each of these counts. Anything outside a 0.5 percent variance gets investigated before users get login access.
- Total Contacts and Leads imported vs source — minus deliberately excluded rows (role-based emails, bounced lists, opt-outs).
- Total Accounts imported vs source — checking that name-based collapse did not over-merge two legitimately separate companies.
- Total Deals per pipeline per stage vs source, plus sum of deal_value per pipeline — a non-trivial dollar variance usually signals a stage-mapping error or a currency-precision drop.
- Total Notes / Tasks / Appointments per type imported vs source — and a date-bucketed comparison to confirm activity dates round-tripped.
- Lookup integrity — count Contacts with a populated Account, Deals with a Primary Contact, and Deals with an Account; compare against the source-derived expected counts.
- Owner distribution — group by Sales Owner and confirm no record landed under the default importing admin that should have been assigned to a specific rep 14.
- Unique-identifier integrity — count distinct emails on Contacts and Leads; any duplicates indicate the dedup transform missed a case-variant or the same person was loaded into both modules.
On top of reconciliation, run a manual spot-check protocol: pick 30 random records across modules and verify each field against the source UI. Pick five high-value deals and trace the full lookup graph — primary Contact, Account, Products, Notes, Appointments. If a non-trivial discrepancy shows up in three or more of the 30, halt the load, fix the root cause, and re-import the affected rows by external ID.
Freshsales does not ship a bulk-undo for imports. The Recycle Bin holds deleted records and supports restoration, but the documentation explicitly notes that you can only bulk-delete records from one page at a time 23 — there is no one-click rollback for a multi-thousand-row import. The Recycle Bin retains deleted records for a limited window before purge, after which only a Freshworks Support ticket can recover them.
The practical rollback strategy is therefore: export everything to S3 before the import starts, stamp every imported row with an *Import Batch ID* custom field, and if catastrophe strikes, filter by that batch ID and bulk-delete page by page, then re-import from the cleaned source. The Freshworks Best Practices article explicitly recommends this cycle — fix errors, delete records, rerun full migration 9.
Cutover sequencing: (1) source goes read-only and the team is notified; (2) final delta export captures everything that changed during the test-import window; (3) delta is imported through the UI or CRM Migration tool with the same unique-identifier column; (4) reconciliation runs; (5) users get login access and a 48-hour hyper-care window with the migration lead on call; (6) source decommission is scheduled for 30 to 90 days out, never the same day.
Section 08
Migration partners and tools
Freshworks Partners, iPaaS vendors, specialist migration shops — what each is good for and how to choose.
The Freshworks Partner Directory lists Authorized, Authorized Platinum, Distributor and Service Partner tiers across more than 50 countries 24. For Freshsales migrations specifically, partners with explicit Salesforce-to-Freshsales, HubSpot-to-Freshsales or Pipedrive-to-Freshsales practices tend to ship cleaner than generalist Freshdesk-leaning implementation shops, because the data-model nuances of the Contacts/Leads split and Sales Sequence rebuild are not the same skill set as ticket-system migration.
A5 Solutions, Abano and the broader Authorized Platinum tier appear in the directory as named regional resellers and implementation partners 24. Freshworks itself also operates an internal Data Migration team that handles the CRM Migration tool's queued large-volume runs (over 25,000 records, 1–2 business days off-peak) at no additional cost as part of the subscription 12.
On the ETL and iPaaS side, Airbyte, Fivetran, Stitch and Matillion all have Freshsales connectors. Their role in a migration is rarely the migration itself — they are the staging layer that lands source data into a warehouse, the transformation layer that converts picklist case and resolves Sales Owner emails to existing Freshsales users, and the ongoing-sync layer that takes over once the one-time migration is complete.
Hevo Data publishes a dedicated Freshsales pipeline that rebuilds the source schema in the warehouse for downstream consumption.
Managed-migration cost ranges vary widely. A clean Pipedrive-to-Freshsales move of under 25,000 contacts with no historical activities and standard modules only often lands in the $500–$3,000 range with a setup fee plus per-object pricing. A Salesforce-to-Freshsales project with deal history, Custom Modules, historical activities and Marketo decoupling typically runs $5,000–$30,000, with the upper end driven by record count, custom-field complexity, historical-data depth and the number of integrations that need rebuilding rather than re-pointed.
For teams that want to outsource the migration end-to-end, FlitStack specialises in Freshsales migrations and handles the field mapping, Contacts/Leads boundary decisions, picklist case normalisation, historical-data preservation and validation work described in Sections 5 and 7 of this guide. Pricing is fixed-fee, based on record count and source platform, with separate line items for Custom Modules and historical activity depth so the scope is transparent before signature.
This is one of several legitimate paths — the right choice for any given team depends on whether they want a regional Authorized Partner, the in-house Freshworks Data Migration service, an iPaaS-first warehouse approach, or a specialist migration vendor. Explore FlitStack →
Section 09
Frequently asked questions
The eight questions every Freshsales migration team works through before they sign the scope.
References
Sources
- 1 Freshsales / Freshmarketer Migration FAQs — Freshworks Support
- 2 We ditched HubSpot at $2M revenue and saved $12K/year — r/CRMSoftware
- 3 What are custom field limits? — Freshsales Suite Support
- 4 Freshsales bulk upsert — Freshworks Support
- 5 Date Field issue in Freshsales — Freshworks Developer Community
- 6 How to import contacts from a CSV/XLSX file — Freshsales Classic
- 7 Account Activity Timeline — Freshsales Suite Support
- 8 How to use Sandbox? — Freshsales Suite Support
- 9 Best Practices for Data Import — Freshsales Suite Support
- 11 How to make a field mandatory? — Freshsales Suite Support
- 12 How to migrate data from Pipedrive? — Freshsales Suite Support
- 13 How to sync past emails into Freshsales? — Freshsales Suite Support
- 14 How to import records (contacts, accounts, deals) from a CSV/XLSX file
- 15 How to migrate data from Salesforce — Freshsales Suite Support
- 17 Features lost on downgrade — Freshworks Support
- 19 How to import deals from CSV/XLSX file — Freshsales Suite Support
- 20 How to use Freshsales files? — Freshsales Suite Support
- 21 How to add files? — Freshworks Support
- 22 Per-user storage allowance — Freshworks Support
- 23 How to restore deleted records from the recycle bin? — Freshworks Support
- 24 Freshworks Partner Directory
Need help running this migration?
FlitStack AI runs Freshsales migrations end-to-end.
Fixed-fee pricing, a hands-on migration engineer, full field mapping and validation. The work described in this guide — done for you.