Migrating from HubSpot or Attio to a Self-Hosted CRM

Manuk Minasyan · · 11 min read
Migrating from HubSpot or Attio to a Self-Hosted CRM

A CRM migration from HubSpot or Attio to Relaticle has three real phases: export your records as CSV, map and import them through Relaticle's import wizard, and manually rebuild whatever the export didn't carry (automations, email history, attachments). For a workspace with a few thousand companies and contacts, the export-to-import loop takes an afternoon of focused work. The parts that take longer sit outside the CSV entirely: rebuilding HubSpot workflows or Attio's connected automations as manual process or API scripts, and accepting that historical email threads and activity timelines mostly stay in the old system. This post covers both halves honestly, what a CSV migration into Relaticle actually looks like, and the specific things that do not come along for the ride.

Decide what moves

Before touching an export button, sort your data into what needs to move record by record and what you're fine re-establishing from scratch:

  • Core records (companies, contacts, deals, tasks, notes) map cleanly to Relaticle's five importable record types.
  • Custom properties have no automatic mapping between products. Recreate them as Relaticle custom fields first, then match by column header during import.
  • Pipeline stage values are plain text, so they import fine once you've created matching select options on the Opportunity stage field.
  • Automations and sequences don't move at all. Budget separate time to decide whether you rebuild them manually or skip them (more on this below).
  • Attachments and historical activity timelines don't move via CSV either (also below).

Import order matters because relationships resolve by lookup, not by insertion order: companies first, then people (linked by company domain), then opportunities (linked to company and contact), then tasks and notes last, since those attach to any of the above. The exact columns for each type are documented at What each record type needs.

Export from HubSpot

HubSpot exports contacts, companies, deals, tickets, and other objects as CSV, XLSX, or XLS from any list view (per HubSpot's export documentation, accessed 2026-08-14). Two settings matter before you click Export:

Scope: choose "All properties and associations on records" when you need relationship data. "All properties on records" excludes associations. The current table view often hides columns you'll need for Relaticle's import mapping, since it only shows what you happened to have visible on screen.

Associations: HubSpot includes associated record IDs and names by default, capped at 1,000 associated IDs per association column unless you enable "include all associated records" for CSV exports. That ceiling rarely matters for a normal B2B workspace, but check it if you're merging in a large partner or reseller network.

Row limits aren't the constraint on HubSpot's side, they're generous: exports split into multiple files at 1,000,000 rows for CSV/XLSX and 65,535 for XLS. Relaticle's import wizard reads a maximum of 10,000 rows and 10MB per file, so any HubSpot export of real size needs to be split down before it reaches Relaticle. Split by created date or by a saved list segment rather than an arbitrary row count, so a failed chunk is easy to identify and re-run.

Notes, calls, and meetings do not come through in a standard object export. HubSpot classifies them as engagements attached to a record's timeline rather than as object properties, so exporting Contacts or Deals does not pull note text with it. HubSpot's own guidance points to per-record exports, an Activities report (Reporting, then Report, with Activities as the data source), or the Engagements API to get that content out. Plan for it separately; it's covered again under "what doesn't migrate" below.

HubSpot's export dialog with the properties scope selector: properties in your view vs all properties on records Source: HubSpot Knowledge Base, knowledge.hubspot.com (2025 screenshot).

Export from Attio

Attio exports whatever is visible in the table or kanban view you're looking at: open Import/Export on a view and choose "Export view as CSV" or "Export view as Excel" (per Attio's Help Center, accessed 2026-08-14). Two things to check before exporting:

The column set follows the view, not the object. If a property isn't a visible table column, or a visible card attribute in kanban, it isn't in the file. Build a table view with every property you want first, save it, then export from that view.

Enriched data comes through blank. Attio's documentation states plainly that data pulled in via its enrichment features cannot be exported; those cells are empty in the download. If your workspace leans on Attio-enriched firmographic or contact data, capture it manually, or accept it stays behind, before you cut over.

Attio also provides an admin-only workspace export. It includes notes, tasks, comments, records, and other workspace data as CSV files. Its notes API offers another extraction path. Reshape exported notes for Relaticle before importing them. The workspace export excludes emails; meetings and call recordings have separate API export paths.

Import into Relaticle

Relaticle's import wizard takes one CSV per record type, up to 10,000 rows and 10MB. Creating companies, people, and opportunities requires Name; tasks and notes require Title. Workspace custom-field settings can add requirements. Test blank-cell behavior on a sample before applying updates to existing records. Custom fields map by a custom_fields_ prefix matching each field's code from Settings, though the wizard also auto-maps close column names without the prefix.

The tables below provide the reference mapping for a HubSpot migration. The same target columns apply from an Attio export once you've reshaped it into a matching CSV.

Data type HubSpot export
Companies Company object export (CSV/XLSX, all properties)
Contacts Contact object export
Deals Deal object export, with associations
Tasks Task/activity export
Notes Not in the object export; requires an Activities report or the Engagements API
Attachments Not part of a CRM object export
Data type Relaticle import path
Companies Companies importer, matched by domain or Record ID
Contacts People importer, linked to Company by domain
Deals Opportunities importer, linked to Company and Contact
Tasks Tasks importer, linked to Companies, People, Opportunities; Assignee by email
Notes Notes importer, always creates new records
Attachments No import path; the wizard reads CSV columns only
Data type Fidelity
Companies Full: name, domain, custom fields
Contacts Full: name, custom fields; company link depends on a clean domain match
Deals Full: name, amount, stage; stage values need matching select options first
Tasks Full for open tasks; completion history collapses to current status only
Notes Partial: text content moves; original timestamps and threading do not
Attachments Does not migrate

Match methods decide whether a row updates an existing record or creates a new one: Relaticle Record ID, company domain, or person email or phone. A HubSpot or Attio record ID is not a Relaticle Record ID. Keep source IDs in a separate custom field or migration ledger. Leave every match column unmapped and every row becomes a new record, so map at least one if you're topping off an existing Relaticle workspace rather than seeding an empty one. The wizard also merges multi-value fields (emails, phone numbers, multi-select tags) into what's already on the record instead of overwriting them, and the preview step labels every row Create, Update, or Skip before anything writes. None of it has an undo, so run a 5 to 10 row sample from your export first; that catches a wrong date format or an unmatched select option before it touches the full file (see Fix import errors for the common ones).

Inspect Create and Update counts before every rerun. Tests on September 24, 2026 found that deleted records can mask live email or domain matches.

If an existing record shows Create, stop. Export its Relaticle Record ID and use that verified ID for the retry.

For an invalid relationship, correct the CSV and upload it again. Editing the value inside Review can leave the saved relationship empty.

Check the relationship preview and open the saved records before expanding the batch.

Read What each record type needs for field requirements. Update existing records with an import explains creating and updating records within one file.

Relaticle's import preview step classifying rows as will-be-created vs will-be-updated

What doesn't migrate

This is the part most migration guides skip. Here's what you're actually giving up, item by item:

Automations and sequences. Relaticle has no workflow or sequence engine equivalent to HubSpot's workflows or a dedicated outbound sequence tool. Anything you automated there, lifecycle emails, lead routing, task creation on stage change, has to be rebuilt as a manual process or a script against Relaticle's REST API. This is a real gap today, not a feature waiting on a changelog entry.

Email history. The CSV importer does not import a connected inbox's message history. Keep historical threads accessible in the old CRM or your mail provider. Check the release notes for changes to supported integration paths before planning the move.

Attachments. CSV import does not transfer attachment binaries from the old CRM. Move files separately and verify their links after migration. Relaticle supports file attachments in rich editor fields, including note bodies and task descriptions. Companies can also hold a logo. A supported upload field does not make historical attachment migration automatic.

Historical activity timelines. What imports is a record's current state, not the sequence of changes that produced it. A deal that moved through five stages over three months arrives at whatever stage your export captured, with no record of the stages before it. If that history matters for reporting, pull it as a separate report from HubSpot or Attio before you cut over; it won't reconstruct itself from a record import.

Notes' original timestamps and threading. Relaticle imports notes as new records with new creation timestamps. It does not restore a source note's timestamp or thread through this importer. Preserve the source metadata separately if your team needs it. Attio's workspace export and notes API can supply note content; extraction and destination fidelity are separate questions.

These limits come from the specific export and import paths described here. Some information can move through additional API or file-transfer work. Decide which gaps you will address before closing the source account.

Beyond 10k rows: the API

The import wizard caps at 10,000 rows and 10MB per file. For a workspace larger than that per object, split the export into several files and run them through the wizard in sequence, or script against Relaticle's REST API instead. The API covers the same five record types as the wizard (companies, people, opportunities, tasks, notes) as standard REST resources under /api/v1, plus a custom-fields endpoint to read your field schema before you map anything.

Authenticate with a Sanctum personal access token, generated from your account menu under Access Tokens. Requests are rate-limited per token: 300 per minute for reads, 60 per minute for writes, with a 600-per-minute ceiling per team across all tokens. For a script-driven migration of, say, 50,000 contacts, that write limit means batching rather than firing every request at once, pace writes below that ceiling and handle HTTP 429 responses. Other requests can consume the same token or workspace allowance.

After the import

Once records land, the built-in AI chat assistant is genuinely useful for the cleanup pass, within its actual limits. It can search and list companies or people by name, which is the fastest way to spot duplicates an import created (two companies matched by name instead of domain, for instance), and it can propose deleting a batch of records in a single approval, so removing ten duplicate companies is one review instead of ten. It can propose updates to multiple records in one batch. Changes requested together can appear as one plan for approval. Review the proposed records and field changes before approving. It also doesn't run fuzzy-duplicate detection on its own; you ask it to search, it doesn't surface duplicates unprompted. Treat it as a faster way to review and fix what an import missed, not an autopilot for data hygiene.

If you're still weighing whether the move is worth it beyond the mechanics, the comparison pages cover pricing, self-hosting, and AI feature parity in more depth: Relaticle vs Attio and Relaticle vs HubSpot. And when you're ready to start, the full import documentation is at relaticle.com/help/import.

Related posts