Migrate from HubSpot or Attio to Self-Hosted CRM - Relaticle             [  Back to blog ](https://relaticle.com/blog) 

 ![Migrating from HubSpot or Attio to a Self-Hosted CRM](https://relaticle.com/storage/ink/01M17KWJ6ZDNHA8SB2WWA21Z7E.png)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 "Permalink")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](https://relaticle.com/help/import/what-each-record-type-needs).

[](#export-from-hubspot "Permalink")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](https://knowledge.hubspot.com/import-and-export/export-records), accessed 2026-08-14). Two settings matter before you click Export:

Scope: choose "All properties" rather than "This view." 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](https://relaticle.com/storage/ink/01M09GAJ4ZBJ2MTVD1372F9GGD.png)*Source: HubSpot Knowledge Base, knowledge.hubspot.com (2025 screenshot).*

[](#export-from-attio "Permalink")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](https://attio.com/help/reference/imports-exports/exporting-lists-and-views), 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's public documentation doesn't state a row limit for view exports, and unlike HubSpot, it doesn't name a workaround for bulk-exporting notes or the record activity timeline, that capability simply isn't documented. If notes matter to your migration, plan to copy the ones you need by hand, or accept they stay in Attio.

[](#import-into-relaticle "Permalink")Import into Relaticle
-----------------------------------------------------------

Relaticle's import wizard (under Settings, then Import, one page per record type) takes a single CSV per record type, up to 10,000 rows and 10MB. Only one column is required per type (Name for companies, people, and opportunities; Title for tasks and notes); every other column is optional, and a blank cell just leaves that field empty. 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 table below is 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 | Relaticle import path | Fidelity |
|---|---|---|---|
| Companies | Company object export (CSV/XLSX, all properties) | Companies importer, matched by domain or Record ID | Full: name, domain, custom fields |
| Contacts | Contact object export | People importer, linked to Company by domain | Full: name, custom fields; company link depends on a clean domain match |
| Deals | Deal object export, with associations | Opportunities importer, linked to Company and Contact | Full: name, amount, stage; stage values need matching select options first |
| Tasks | Task/activity export | Tasks importer, linked to Companies, People, Opportunities; Assignee by email | Full for open tasks; completion history collapses to current status only |
| Notes | Not in the object export; requires an Activities report or the Engagements API | Notes importer, always creates new records | Partial: text content moves; original timestamps and threading do not |
| Attachments | Not part of a CRM object export | No import path; the wizard reads CSV columns only | Does not migrate |

Match methods decide whether a row updates an existing record or creates a new one: Record ID for an exact match, domain for companies, email or phone for people. 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](https://relaticle.com/help/import/fix-import-errors) for the common ones).

Full field requirements per record type live at [What each record type needs](https://relaticle.com/help/import/what-each-record-type-needs), and the update-in-place mechanics, including creating and updating in the same file, are documented at [Update existing records with an import](https://relaticle.com/help/import/update-existing-records).

![Relaticle's import preview step classifying rows as will-be-created vs will-be-updated](https://relaticle.com/storage/ink/01M09G7KAK7PV2TWH4S2ZEYPAY.png)

[](#what-doesnt-migrate "Permalink")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.** As of August 2026, Relaticle doesn't sync a connected inbox's message history into the CRM (Gmail and Outlook sync is in active development; check the [changelog](https://github.com/Relaticle/relaticle/releases) for current status). Past email threads stay wherever they already live, in HubSpot, in Attio, or in your mail provider. A migration doesn't pull them in.

**Attachments.** Files attached to HubSpot or Attio records, contracts, decks, call recordings, have no import path into Relaticle. The import wizard reads CSV columns only; there's no file-upload column type. Beyond import, Relaticle's own attachment support is narrow today: companies can hold a logo image, but people, opportunities, tasks, and notes don't have a general file-attachment field yet. If a document matters, give it a separate home (wherever you already store files) and link it from a note or custom field.

**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.** Notes import as new records dated today, not on their original date, and there's no reply or thread structure carried over, since neither HubSpot nor Attio exports that as object data to begin with.

None of these are gaps unique to Relaticle; they're the actual boundary of what a CSV can carry between two CRMs with different data models. Any migration guide that skips this list is not describing the real process.

[](#beyond-10k-rows-the-api "Permalink")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, roughly one create call per second sustained keeps you under the limit without custom backoff logic.

[](#after-the-import "Permalink")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 updates records one at a time, each field change is its own proposal you approve or reject individually, so it's a review tool rather than a bulk editor. 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](https://relaticle.com/alternatives/attio) and [Relaticle vs HubSpot](https://relaticle.com/alternatives/hubspot). And when you're ready to start, the full import documentation is at [relaticle.com/help/import](https://relaticle.com/help/import).

 Tagged: [ #self-hosting ](https://relaticle.com/blog/tag/self-hosting) [ #migration ](https://relaticle.com/blog/tag/migration) 

 Related posts
-------------

 [  Guides   Sep 4, 2026  

 Let Claude Code Run Your Sales Pipeline 
-----------------------------------------

Five real Claude Code sessions against Relaticle's MCP server: pipeline review, data entry, task cleanup, custom fields, and a delete it wouldn't rush.

 ![Let Claude Code Run Your Sales Pipeline](https://relaticle.com/storage/ink/01M17KWGFJTG7KWZAR40C6SZZZ.png) ](https://relaticle.com/blog/let-claude-code-run-your-sales-pipeline) [  Guides   Sep 1, 2026  

 What 'Agent-Native CRM' Actually Means 
----------------------------------------

Agent-native CRM is a checklist, not a marketing label: full write access, approvals for chat, self-host parity, markdown for agents, first-party tooling.

 ![What 'Agent-Native CRM' Actually Means](https://relaticle.com/storage/ink/01M17KWER35G1NK6TDDS6KQSZN.png) ](https://relaticle.com/blog/what-agent-native-crm-actually-means) [  Guides   Aug 28, 2026  

 How to Connect Claude to Your CRM with MCP 
--------------------------------------------

Connect Claude to Relaticle via MCP in minutes: OAuth setup, all 37 tools explained, and why MCP writes commit directly with no approval gate.

 ![How to Connect Claude to Your CRM with MCP](https://relaticle.com/storage/ink/01M17KWD0RMP42X0P5Z8T29ZYP.png) ](https://relaticle.com/blog/how-to-connect-claude-to-your-crm-with-mcp) 

    ###    On this page
