CRM Migration Checklist: 12 Steps, Tests and Rollback

A 12-step CRM migration checklist: what to move first, how to map fields, test on a sample, read the per-record report, and undo a bad run.

Last updated: 10 Nov 2026

This CRM migration checklist has twelve steps: decide what moves on day one, clean the source, map objects and fields, check types and currencies, test on a sample and run the full load, read the per-record report, plan rollback before the first write, handle records created after the first run, keep the old CRM read-only, check API limits and call recordings, compare tools, and shut down only after checks pass. The steps below say what to check at each one and what a pass looks like.

Use it as a list to tick. Each step ends with a test you can run, so you know whether the step is done.

1. CRM migration checklist: decide what must move on day one

Start with the objects your team opens every day: people, companies and deals. Open deals matter more than closed-lost deals from six years ago. Write the list down before you touch a tool.

Then sort the rest into three groups: moves now, moves later, stays in the old CRM as an archive. Notes, emails, calls and files are candidates for "later", because destinations do not take them the same way. For example, Attio's CSV importer does not support importing notes, so notes need another route, according to Attio's migration help page.

Test: one page that lists every object, its group, and who on your team uses it.

2. Audit and clean the source before mapping

Count your records per object and write the numbers down. You will compare them with the destination later.

Then look for the things that break imports: duplicate contacts with the same email, companies with no domain, deals with no company, empty required fields. Fix what takes minutes. Leave what takes days; a migration can carry imperfect data.

Duplicates deserve a decision, not a hope. Tools that match before creating will merge some of them on their own. Shuttio, for example, matches people on email and companies on domain in Attio, and companies on website domain and contacts on email in Odoo. A second contact with the same email updates the first instead of creating a new record. Know the matching rule of your tool before you start, and decide whether that is what you want.

Test: a record count per object, and a short list of known duplicates.

3. Map objects and fields

Mapping answers one question per source field: where does it land? Standard objects are easy. People, companies and deals are the objects to map first. Custom objects and custom fields are where the work is.

Build a table with three columns: source field, destination field, action (map, create, skip). Include dropdown options, so that every value of a source dropdown has a matching option in the destination.

If you import by CSV into HubSpot, the file needs a header row, and each column header must match a HubSpot property. Updating existing records needs a unique identifier property for each object. Both points are in HubSpot's import file guide.

Mapping item What to write down
Standard objects Source object, destination object
Custom objects Create in destination, or skip
Custom fields Name, type, destination field
Dropdown options Full list of source options
Owner field How source users match destination users
Links Which objects point to which (contact to company, deal to contact)

Test: every field on the source has a row, even if the row says "skip".

4. Check field types, currencies and formats

Check the type of every mapped field: a text field mapped to a number field, a date in a different format, a phone number with letters.

Currency needs its own line. Verify that the currency code travels with each deal amount, as the ClonePartner checklist says.

Also check file limits if you import by CSV. HubSpot paid subscriptions allow 1,048,576 rows per file, and the page says additional technical limits depend on the subscription (HubSpot).

Test: take ten records of each type from the source and compare them by eye with the planned destination field.

5. Test on a small sample, then run the full migration

A sample shows you real data in the new CRM before you commit. Look at it as your sales team would: open five contacts, five companies, five deals. Check that the deal still shows its company and contact.

How big should a sample be? One vendor argues that a partial test can miss problems that appear only at scale, and that API rate limits only reveal themselves under full load (ClonePartner). That is a fair limit to keep in mind: a sample proves your mapping, not your volume. Use the sample to fix mapping, and use rollback (step 7) as the answer to what the sample cannot show.

Import2 offers a free sample migration and says the sample can be reversed (Import2 pricing). Shuttio's free sample copies 50 records per object, and it keeps the parent records (companies, contacts) linked to the deals in the sample, so a deal does not arrive orphaned.

Test: open the sample records, confirm the links between objects, confirm the dropdown values. Then start the full run.

6. Read the per-record report

A total of "migrated" is not a result. You need to know which records failed and why.

After the full run, compare destination counts with the counts from step 2. Then open the failures. A good report lists every record with its result, and shows a reason for each failure. When a record cannot migrate, records that depend on it can be skipped too (a deal whose company failed, for example), so look at the whole chain, not the single row.

Say a team has 40,000 contacts, 9,000 companies and 3,500 deals. After the run, the report shows 3,490 deals migrated and 10 failed. If the report shows that eight of the ten failed because of the same company problem, you fix that cause once and rerun. Without reasons, you search record by record.

Test: destination counts match source counts, minus a list of failures you understand.

7. Plan rollback before the first write

A backup that cannot be restored operationally is not a rollback plan (ClonePartner). Ask your tool one question before you start: what exactly does undo remove?

The answers differ. Attio's help page states that undoing an Import2 migration removes imported records and does not remove other created items (Attio). Lists, attributes and other structures created during the process stay behind.

Shuttio's cancel deletes the records and also the objects, fields and options the migration created, in reverse order. Structure that existed before is never touched. There are stated exceptions: an Attio object the migration created is deleted only when it is empty (otherwise it stays and is listed), in Odoo an added field is dropped only while no record holds a value in it, and a record that already existed and was matched stays.

Test: you can say in one sentence what is left in the destination after a cancel.

8. Handle records created after the first run

Your team keeps working in the old CRM while you check the new one. New leads arrive, deals change stage. A one-time copy leaves those behind.

Decide how you will catch up. The options are: a second full run, a manual entry of the few new records, or a tool feature that copies only what is new. Shuttio's "Move new records" copies records created in the old CRM after the first run.

Note one limit. Import2 will not update attribute values on records already created in Attio (Attio).

Test: set a freeze date and write it down. After that date, nobody creates records in the old CRM.

9. Keep the old CRM read-only before shutdown

Do not cancel the old subscription on cutover day. ClonePartner recommends keeping the source CRM read-only for at least 30 to 60 days after go-live as a safety net (ClonePartner).

Use that window to find what nobody checked: a report that looks wrong, a deal with a missing note, a contact whose phone number lost its country code.

Test: a signed-off list of reports and views your team reran in the new CRM.

10. Check API limits and call recordings

Two items that catch teams late. First, API rate limits: bulk scripts need exponential backoff and retry logic (ClonePartner). For Affinity sources, Attio says you can migrate a record count equal to about 40% of your monthly API allotment in one calendar month (Attio).

Second, call recordings. They are not included in the Import2 migration service (Attio). If your team needs recordings, export them separately.

Test: you know the rate limit of the source API and whether recordings are in scope.

11. Compare migration options

Compare tools on what you get, not on the logo.

Question Ask the vendor
Is there a free sample, and how large? Records per object
Does the sample keep links between objects? Parent records of sampled deals
Is there a per-record report? Result and reason per record
What does undo remove? Records only, or objects and fields too
What does it cost? Price before the full run starts
Which pairs does it cover? Source and destination, in writing

Compare on what you get: the sample, the report, the rollback and the pairs covered. If your destination is Attio, ask both options for a free sample, a per-record report and a rollback that also removes created objects, fields and options.

Where Shuttio fits

Shuttio is a self-serve migration tool built by Craftt, an Attio implementation partner. Sources are HubSpot, Pipedrive, Affinity, Attio and CSV. Destinations are Attio, Clarify and Odoo. Affinity to Odoo is not supported, and Pipedrive is not a destination.

Into Attio it is free at any record count. Into Clarify or Odoo, a CSV import is free and a CRM migration is priced once, from $249 (up to 50,000 records) to $4,749 (up to 5,000,000), shown before the full run starts. Into Attio, compare Shuttio with the Migrate button on the free 50-record sample, the per-record report and rollback that also removes created objects, fields and options. If your pair is not listed, Shuttio is not the tool.

12. Shut down the old CRM

Shut down when all of these are true: counts match, failures are explained, the freeze date has passed, the read-only window is over, and the team has rerun its key reports. Export a final archive of the old CRM first, and store it.

Frequently asked questions

Can I test a migration on a few records before moving everything? Yes, if your tool offers a sample. Check that the sample keeps the links between objects, and treat it as a test of mapping, not of volume.

Do I need to clean duplicates before importing? Fix the obvious ones, and learn your tool's matching rule. In Attio, Shuttio matches people on email and companies on domain, so a second contact with the same email updates the first.

Can I undo a migration if the data comes in wrong? It depends on the tool. Ask whether undo removes only records or also the objects, fields and options the migration created.

When is it safe to shut down the old CRM? After counts match, failures are explained, and a 30 to 60 day read-only window has passed without surprises.