All articles

Notion to Attio: how to migrate from a Notion CRM to a real one

·11 min read

Short answer: To migrate from a Notion CRM to Attio: decide which Notion databases are real objects and which are just filtered views; add a Formula column to each database that turns relations into plain text; export each database as CSV; rebuild the data model in Attio (People, Companies, Deals, plus any real custom objects); import in dependency order; rebuild manual activity tracking as real automations. The CSV move takes a day. Fixing the relations is where most teams get stuck.

Why teams move from a Notion CRM to Attio

A Notion CRM is a set of linked databases with a nice cover image. It works beautifully when the team is small, the deal count is low, and the same person who built the workspace is the one using it every day.

It stops working when:

  • Activity logging falls off. Every email, call, and meeting has to be typed in by hand. Past 50 active deals the team stops doing it, and the CRM stops being accurate.
  • Reporting depends on rollups that break. Change a Select option, rename a property, or move a page and the dashboard breaks silently.
  • There is no real ownership or territory routing. The Owner is just a property that everyone can edit.
  • The activity timeline is a list of related pages, not a chronological log of what happened with the person.
  • Email sync, sequences, and bulk sends do not exist. The team is using Notion plus Gmail plus a spreadsheet plus a separate sequencer, and reconciling them by hand.

If the team is happy treating Notion as a thinking layer and writing layer, keep it. The Notion workspace is still useful for docs, SOPs, and project pages. Attio takes over the CRM job.

This guide covers the migration itself.

Rebuild the data model before you export

This is the step that decides whether the migration is clean or a multi-week cleanup project.

A Notion CRM that has been in use for a year usually has between three and fifteen linked databases. Some of those databases are real objects. Most are filtered views, snapshots, or pages someone duplicated when they could not figure out how to filter the original.

Before any data moves, answer three questions:

  1. Which databases are real objects? People, Companies, and Deals almost always are. A database called "Q3 prospects" is a view of People, not an object. A database called "2026 renewals" is a view of Deals, not an object.
  2. Which properties matter? For each database you decided is an object, which properties are used in views or dashboards or in daily work? Everything else is a candidate for deletion.
  3. Which relations matter? Notion's relation properties become real relationships in Attio. Decide which need to come across as actual links between records, and which were just tags pretending to be links.

Do this on a whiteboard before you touch Notion. The exercise usually cuts the database count from ten to four or five.

Step 1: Add helper columns for relations and rollups

Notion's CSV export has two specific quirks you need to work around before exporting.

Relations export as Notion page UUIDs, not as the names of the linked records. A CSV row that links a Contact to a Company will not say "Acme Inc." in the Company column. It will say something like b1f2c8a4-....

Rollups export as the rollup definition or as a static comma-separated string, not as the computed number.

The fix is a Formula property on each database that turns relations into plain text. For each relation property you want to keep, add a formula column next to it:

format(prop("Company"))

That formula returns the display name of the linked record as text. Do this for every relation that needs to survive the export. Repeat for rollups that you want to keep as readable values rather than definitions.

Also add one more formula column on every database: a stable text version of the Notion page ID. You can use the built-in id() function. This is the external identifier that lets you reconcile records later if anything has to be re-imported.

Step 2: Export each database as CSV

In Notion, open the database, click the three-dot menu, choose Export, and pick CSV. Repeat for each database that survived the data model exercise.

A few constraints to know:

  • Export each database from its top-level view, not from a filtered view. Filtered views can hide rows in ways that are not obvious.
  • Notion exports the visible properties of the current view. Switch to a view that shows every column you need before exporting, or you will lose properties.
  • Files and images attached to pages are not part of the CSV. If a record has an attached PDF or image that matters, plan a second pass for those.

Export each surviving database as a separate CSV: People, Companies, Deals, and any custom object you decided to keep. Activities, notes, and files come over in a second pass after the core objects are in.

Step 3: Prepare the Attio workspace

Build the object structure in Attio first, before any import.

Attio's standard objects, People, Companies, and Deals, map cleanly to the equivalent Notion databases. Any custom object you decided to keep becomes a custom object in Attio. The mapping is one to one, but only after the data model exercise above.

For pipelines, Attio uses statuses on the Deals object. Recreate the Notion Stage options as statuses, in the same order, with the same names. Reporting continuity stays intact.

Set up the fields and relationships you decided to keep. Mark a unique attribute on each object: email on People, domain on Companies, name plus owner on Deals. Without a unique attribute, the importer creates duplicates instead of matching existing records.

Step 4: Clean the CSVs

This is the part that saves the most time later.

Before import, run a cleanup pass on each CSV:

  • Remove duplicate records. Notion exports often include the same person on multiple databases. Pick one source of truth per record.
  • Standardize enumerated fields. Pick one spelling for each status, industry, source, and owner. Notion Select options drift over time. The migration is the moment to lock them down.
  • Normalize phone numbers and dates to a single format.
  • Resolve relations. The formula column you added is the readable name. Use it as the value going into Attio so the importer can match the linked record by its unique attribute.
  • Drop the UUID columns once the formula columns are in place. They were only there for your own reference.
  • Delete columns nobody uses. If it was not on your list from the data model exercise, it does not go in.

An hour on cleanup saves a day of fixes after import.

Step 5: Import into Attio

Attio supports CSV import directly in the UI. For each object, open the object in the sidebar, click Import / Export in the top right, choose Import CSV, and follow the mapper.

The order matters. Import in dependency order:

  1. Companies first.
  2. People second, with the Company column resolved to company names so Attio can link them.
  3. Deals third, linked to People and Companies.
  4. Activities, notes, and any custom objects last.

For each import, map the CSV columns to Attio attributes, confirm the unique attribute, run the import, and spot-check 10 to 20 records before moving to the next object.

For larger datasets, or when multiple custom objects need to be related in bulk, Attio's API handles the job more cleanly than the UI. Use it whenever you are moving more than a few thousand records or several related objects.

Step 6: Build the automations Notion never had

Notion did not have native automation for the CRM job. Most teams compensated with reminders in their calendar, manual Slack messages, and discipline that lasted three months.

This is the place to fix that. Pick the three or four automations that, if they ran themselves, would save the most time:

  • New lead assignment by owner or territory.
  • Stage-change triggers that create tasks or send a Slack message.
  • Deal-won notifications into Slack or email.
  • Activity creation from Gmail or Google Calendar sync.

Build them in Attio Workflows. Test each one on a real record. Resist the urge to add ten more automations on day one. You can always add later. The teams that try to automate everything at once usually end up trusting none of it.

Step 7: Replace manual activity logging with sync

This is the single biggest reason the new CRM stays accurate where Notion did not.

Connect Gmail and Google Calendar to Attio. Every email and every meeting now lands on the matching contact and company without anyone typing anything. The activity timeline becomes a real chronological record instead of a list of related pages.

Tell the team they no longer need to log activity manually. The day they stop doing the thing the old Notion setup required is the day the new CRM starts feeling lighter.

Step 8: Rebuild views and dashboards

Notion dashboards do not migrate. Attio handles reporting through filtered views, lists, and dashboard widgets.

For each Notion view or dashboard widget that someone actually opens, recreate it as an Attio view or widget. Most teams find a big share of their old views were never opened. Those stay behind.

Step 9: Cutover

Run both systems in parallel for a week. The team works in Attio. Notion stays as a reference, read-only for the CRM databases.

At the end of the week, archive the Notion CRM pages. Keep the workspace itself, you still use it for docs and SOPs. Only the CRM-shaped databases go cold.

Traps to avoid

  • Treating every database as an object. Most Notion CRM databases are views or filtered snapshots, not real objects. If every database becomes a custom object in Attio, you end up with the same mess in a more expensive tool.
  • Exporting relations as raw UUIDs. They have to be resolved into readable names with a formula column before export, or every link is lost.
  • Trying to keep rollups. Rollups are Notion-specific. Rebuild them as Attio views, filters, or report aggregations after import.
  • Skipping the data model step. This is the single biggest cause of a painful migration.
  • Migrating without a unique attribute on each object. The importer will create duplicates instead of matching records, and you will spend a week deduplicating.
  • Importing in the wrong order. Companies, then People, then Deals. Anything else and the links break.

How long does a Notion CRM to Attio migration take?

For a typical small team, under 20 users, a few real custom objects, moderate data volume, budget 1 to 2 weeks end to end. Notion CRMs tend to be smaller than monday or HubSpot setups, so the data move itself is fast. Most of the time goes into the data model rebuild and the new automations.

Larger Notion CRMs, the ones that have grown into ten or fifteen interconnected databases, can push to 3 to 4 weeks. The database count and the depth of the relations are the best rough proxy for how long the migration takes.

Want help with the migration?

If you want a second pair of eyes on your migration plan, or you want it done for you, book a call.

If you are still evaluating the move, try Attio with a 10% discount and start the data model exercise on your own. Even if the migration does not happen, the exercise is worth doing.

Free audit of your Attio workspace

If you want a second pair of eyes on your Attio setup, I run a free 48-hour audit. You add me to your workspace as an Attio expert, no extra seat and no billing. I send back a one-page written teardown ranked by impact, the three highest-leverage fixes with the exact setting change, and a 5-minute Loom walking through the top fix. No call, no pitch. 5 slots a week.

Get your free Attio audit

Need help with your Attio setup?

We migrate teams, build data models, wire automations, and train Claude agents inside your workspace. Discovery call is free.

Book a free discovery call