Step one: inventory what you have
Before exporting anything, list every object in the current system and the record count in each. Then list every field on the two or three objects that matter, and mark each one used, unused, or unclear. The unclear ones are the interesting ones. Ask the person who would know, and if nobody knows what a field is for, that is your answer.
This step usually takes an afternoon and it consistently surprises people. Most systems that have been running for a few years carry a third more fields than anyone can justify, several of which are populated inconsistently enough to be misleading.
Step two: decide the destination model
Design the shape you want, not the shape you have. What are the pipeline stages, in the new system, stated as exit criteria rather than as feelings? What fields are required on a company, on a contact, on an opportunity? Who are the users and what can each see? This is where you fix the structural problems you have been living with, because doing it later means migrating twice.
Keep required fields to the minimum that makes a record useful. Every required field is a small tax on every record creation, and a team that finds record creation tedious will create records outside the system.
Step three: map users and owners
Do this before records, always. Create the users in the destination, then build a small table mapping every owner value in the source, including the misspellings and the people who have left, to a destination user. Records belonging to departed staff go to a named holding owner rather than to nobody, and somebody is accountable for clearing that queue.
Records imported without a valid owner are invisible work. They exist, nobody is following up, and the problem surfaces weeks later as a customer wondering why they never heard back.
Step four: build the field mapping sheet
Four columns: source field, destination field, transformation required, and a real example value. The example value column is the one people skip and the one that catches errors, because a mapping that looks correct in the abstract often looks obviously wrong next to an actual value.
Transformations to watch: phone numbers to a consistent international format, dates to an unambiguous format such as year-month-day, currency values stripped of symbols and separators with the currency stored separately, multi-select fields split correctly, and free-text stage names mapped to the destination stage list you agreed in step two.
Step five: clean the export file
Clean in the file, not in the system. A spreadsheet or a script lets you sort, filter, and inspect in a way that a live system does not. Handle duplicates here using your chosen matching key and survivorship rule. Remove records with no usable contact information at all, since a company with no phone, no email, and no address is not a lead. Normalise the obvious variants of the same company name. Fix the empty owner rows against your user map.
Keep the raw export untouched alongside the cleaned version. If something later looks wrong, being able to diff against the original saves a great deal of speculation.
Step six: dry run
Import a subset first, ideally into a sandbox, but a small labelled batch into the real system also works if you can delete it cleanly. Before you look at the result, write down what you expect: how many companies, how many contacts attached to each, what the pipeline total should be, what a specific named record should look like.
Then check against that list. Open the named record and read every field. Check a record with an unusual character in the name. Check a deal that closed on the twentieth of a month, which will expose a date format problem that the fifth would hide. Check a phone number that starts with a zero.
Step seven: cutover and reconcile
Pick a date, ideally at the quiet end of a week. Announce a short freeze during which nobody creates records anywhere. Run the main import, then a delta import of anything created since the export. From the moment the delta finishes, the new system is authoritative and the old one is read-only. Say that in one sentence, in writing, to everyone.
Then reconcile immediately, while you still have attention and the ability to correct: counts by object, counts by owner, open pipeline value, open opportunities with no next step, and ten hand-checked records.