A Zoho to Salesforce migration copies your records, not your judgment about them. Zoho Accounts become Salesforce Accounts, Contacts become Contacts, Deals become Opportunities and Leads stay Leads. Every duplicate in Zoho arrives in Salesforce, and one more kind appears that you could ignore before: the same person sitting in Zoho as an unconverted lead and as a contact, now loaded as a Salesforce Lead and a Salesforce Contact.
Salesforce will not merge a lead into a contact with the merge screen, so those pairs become a conversion job after go live. The cheaper moment to find them is before the load, on the export files, with the Zoho record ID kept beside every decision.
How to export your data from Zoho CRM
Zoho CRM exports from Setup, then Data Administration, then Export. You pick the modules, and Zoho prepares the files in the background as a zipped CSV per module, with a download link that stays valid for seven days. One export holds up to 200,000 records per module, so a larger leads table takes more than one run.
Export Leads, Contacts, Accounts and Deals at minimum, plus Users so record owners can be mapped to Salesforce users. Keep the Record Id column in every file. It is the only thing that ties a Zoho contact to its account, and it is the key your audit log and your Salesforce External ID field will carry.
How Salesforce matches records when you load them
The Data Import Wizard handles accounts, contacts and leads, up to 50,000 records per file. It can match contacts and leads to existing records on name or email, and accounts on account name and site together. It does not load opportunities, so Deals go through Data Loader or a partner tool.
Data Loader handles up to 5 million records and matches nothing on a plain insert: every row becomes a new record. On an upsert it matches on the Salesforce ID or an External ID field. Duplicate rules set to Allow with an alert save the row anyway, because the alert is a screen that only appears in the Salesforce interface, not in a bulk load. In practice, whatever is duplicated in the CSV is duplicated in the org.
Zoho records and where they land in Salesforce
| Zoho CRM | Salesforce | Duplicate risk | Load with |
|---|---|---|---|
| Leads | Leads | Same person also a contact | Wizard or Data Loader |
| Contacts | Contacts | Two records, one person | Wizard or Data Loader |
| Accounts | Accounts | Inc and LLC variants | Wizard or Data Loader |
| Deals | Opportunities | Follow the account | Data Loader |
Load accounts first, then contacts and leads, then opportunities, so each child can find its parent.
Why one person ends up as a lead and a contact
In Zoho, converting a lead creates a contact and an account and removes the lead. Plenty of leads never get converted, though. A rep adds the person straight to Contacts after a meeting, a web form creates a new lead for someone already in Contacts, or a list import drops a batch of known customers into Leads. Zoho shows them in two modules and nobody notices.
Salesforce keeps the same split, so a straight migration loads both. Marketing then emails the lead as a prospect while sales works the contact as a customer, and lead source reports count people you already sold to. Finding these pairs means putting Leads and Contacts in one file and matching across them, which is not something either CRM does for you.
How to clean the Zoho export before the Salesforce load
- 1 Stack the Leads and Contacts exports into one CSV with a Module column saying Lead or Contact. Keep First Name, Last Name, Company or Account Name, Email, Phone, State, Zip Code and Record Id.
- 2 Load the file into the data cleaning demo. It runs in your browser, so the customer list never leaves your machine.
- 3 Read every proposed group. Each one says why it matched, and the Module column shows up as a conflict wherever a lead and a contact were grouped. Those groups are lead conversions to plan, the rest are contact or lead merges.
- 4 Approve or reject each group, then export the cleaned file and the audit log. The log lists every Zoho Record Id that folds into another, which is your proof when someone asks why the contact count dropped.
- 5 Load into Salesforce with the Zoho Record Id in an External ID field, so a reload or a fix later is an upsert and not a second copy.
What the pass found on a Zoho Leads and Contacts export
We ran a twelve row Zoho file, leads and contacts stacked, through the engine. These are the real results, including the pair it did not match.
| Module | Name and company | Result | |
|---|---|---|---|
| Contact | Hannah Kim, Cedar Grove Dental LLC | hannah.kim@cedargrovedental.com | Kept, washington to WA |
| Lead | Hannah Kim, Cedar Grove Dental | Hannah.Kim@CedarGroveDental.com | Same email, likely |
| Contact | Marcus Webb, Ironbridge Freight Inc | mwebb@ironbridgefreight.com | Kept, ohio to OH |
| Lead | Marcus Webb, Ironbridge Freight | (blank) | Same name and company, likely |
| Contact | Ryan Mitchel, Summit Peak Software | (blank) | Close name and company match, likely |
| Lead | Ryan Mitchell, Summit Peak Software | ryan@summitpeak.io | Kept, the fuller row |
| Lead | Danielle Okafor, Brookline Wealth | dokafor@brooklinewp.com | Two emails, flagged for review |
| Lead | Bill Harper, Northgate Analytics | bharper@northgateanalytics.com | Not matched to William Harper |
All five groups mix a lead and a contact, so the Module column came back as a conflict on each. Holloway and Sons against Holloway & Sons was also grouped, on the person name and close company name.
The Harper pair is the honest miss. The engine does not treat Bill and William as the same first name, so nickname pairs need a sort by last name and a read by eye. The Okafor pair is the kind you want flagged rather than merged: one work email, one personal email, and only the account owner knows whether that is one buyer. The matching is the same data deduplication engine used across the site, with fuzzy matching for close spellings.
Should you clean data before or after migrating to Salesforce?
Before. In Salesforce every merge is permanent, takes at most three records at a time, and a lead can only join a contact through conversion, one lead at a time. Duplicates found after go live also have activity and campaign history attached by then, which makes each decision slower. On the export, a duplicate is a row you drop or a value you keep.
If some slip through anyway, the merge mechanics are on Salesforce merge contacts and, for companies, Salesforce merge accounts. The same problem in the other direction is covered in Zoho to HubSpot migration. If you are still choosing the loader, see Salesforce data migration tools.
Is it worth paying a partner for a Zoho to Salesforce migration?
Often, yes, for the parts that need a Salesforce admin: field mapping, custom objects, page layouts, automation rebuilt as flows, and the deal history. Partners and integration tools move data well. Most do not decide which of your leads and contacts are the same person, because that takes someone who knows the customers, and it is usually handed back to your team as a spreadsheet.
That cleanup is a few hours with the right tool, and it pays twice: fewer merges after cutover, and a contact count you can defend on day one. Once the lists are clean, the sales team can work one set of leads, whether reps dial them or you hand first touches to AI cold calling. DataUntangler is a data cleaning tool on the Analyst plan at 59 dollars a month, or 348 dollars a year with unlimited files. It does not connect to Zoho or Salesforce and writes nothing to either.