HubSpot to Attio migration

Shuttio moves contacts, companies, deals, products, line items, tickets, quotes and leads from HubSpot into Attio, with notes, tasks, meetings, calls, emails, files and lists. It is free at any record count. It starts with a free sample of every object you tick (5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records), so you read the result in Attio before the full run, and a rollback removes what it created.

Can I move HubSpot to Attio?
Yes.
What moves:
Contacts, companies, deals, products, line items, tickets, quotes and leads, with notes, tasks, meetings, calls, emails, files and lists.
What doesn't:
A dynamic list's filter itself; History on a property the portal will not report; Emails, unless you tick them; and 2 more, each with its reason.
Price:
Free at any record count, the sample and the full run.
How long:
A free sample first, then the full run as one background job with live progress. The time depends on your record count and on HubSpot's API request limits.

No Attio account yet? Sign up with our partner link and get 10% off any plan.

Moves
8 kinds of record, plus notes, tasks, meetings, calls, emails, files and lists
Doesn’t move
5 things, each with the reason
Connect
HubSpot: OAuth. Attio: OAuth
Price
Free at any record count

Where each HubSpot object lands

Read from the code that runs the migration. Source column names are shown as the source reports them.

HubSpot objectLands inStandard fields
ContactsPeople
  • email → Email addresses
  • phone → Phone numbers
  • jobtitle → Job title
  • associated_companies → link to Companies
CompaniesCompanies
  • domain → Domains
  • name → Name
  • description → Description
DealsDeals
  • dealname → Name
  • amount → Value
  • associated_companies → link to Companies
  • associated_contacts → link to People
ProductsIts own object, or the one you already have with that name
  • name → Name
  • hs_sku → SKU
  • price → Unit price
  • description → Description
Line itemsIts own object, or the one you already have with that name
  • name → Name
  • quantity → Quantity
  • price → Unit price
  • discount → Discount
  • amount → Total
  • associated_deals → link to Deals
  • hs_product_id → link to Products
TicketsIts own object, or the one you already have with that name
  • subject → Subject
  • hs_pipeline_stage → Status
  • hs_ticket_priority → Priority
  • createdate → Opened at
  • closed_date → Closed at
  • associated_companies → link to Companies
  • associated_contacts → link to People
  • associated_deals → link to Deals
QuotesIts own object, or the one you already have with that name
  • hs_title → Title
  • hs_status → Status
  • hs_quote_amount → Amount
  • hs_expiration_date → Expires at
  • associated_deals → link to Deals
  • associated_companies → link to Companies
LeadsPeople, deals at the stage Lead, or their own object (you choose)Fields are mapped on the Fields step

Every other property is created as an Attio attribute and shown on the Fields step. A record matches on email (people) or domain (companies) and is updated in place, so running it twice never leaves two of anything.

Notes, tasks, meetings, calls, emails, files, owners and lists

KindHow it movesWhat happens
NotesYesOn the record each note was attached to; an edited note updates on a later run.
TasksYesLinked to their records.
MeetingsYesMeeting participants are carried by name only, so no new people are created.
CallsYesInto Attio's Phone calls, with the time, length, direction, outcome and call notes. A call with no migrated person, or a workspace that has not allowed activities, becomes a note instead.
EmailsYesLogged emails land as a Logged emails activity on their records, with sender, recipients, date and body. Off by default: Attio's mailbox sync may already show the same mail.
FilesYesFiles up to 50 MB, uploaded to the record they were attached to. A larger file and a link are listed as failed rows.
OwnersYesDeal owners and task assignees, matched to an Attio member by email.
ListsYesStatic lists keep their members; a dynamic list arrives as a snapshot of its members, with its conditions written out as text.

Deal pipelines and stages

Shuttio reads each HubSpot deal pipeline with its stages from the portal, and each deal takes the stage it is in. One pipeline becomes Attio's Deal stage. With two or more you choose on the Fields step: a list per pipeline, or a stage field per pipeline. Switch Pipelines off on the Options step and the names land in text fields instead.

Your own fields

HubSpot field typeCreated in Attio as
Single-line or multi-line textText
NumberNumber
Number shown with a currency symbolCurrency
Date pickerDate
Date and timeDate and time
Single checkboxCheckbox
Phone numberPhone number
Dropdown or radio select (Lifecycle stage, Lead status)Select, with the source's options
Multiple checkboxesText: the values are joined into one text value

A field you added yourself arrives as a new Attio attribute of the type above. The Fields step lists every field before anything is written, and you can rename, skip or point a field at an attribute Attio already has.

5 things that don’t move

Each has a reason. You would find them on day two, so they are here on day zero.

A dynamic list's filter itself

Doesn't move

Attio has no filtered-membership API and no list description field, so the rule cannot be recreated. You get the members and the conditions in writing.

History on a property the portal will not report

Doesn't move

Some portals lower or refuse the history batch. The import falls back to current values and tells you in the summary rather than reporting a silent zero.

Emails, unless you tick them

Doesn't move

Logged emails from HubSpot and Pipedrive land in Attio as a Logged emails activity on their records, but they start unticked: Attio's mailbox sync may already show the same mail, and with both ticked it appears twice. Without the Attio connection's activity access, each email is listed as a skipped row rather than written as a note.

Files over 50 MB and linked files

Doesn't move

Files up to 50 MB are uploaded to the record they were attached to, when the Attio connection has the file scope (an older connection is asked to reconnect). A larger file, and an entry that is a link rather than a file, is listed on the run as a failed row and not copied.

Goals, invoices, payments, carts and other commerce or admin records

Doesn't move

They track billing and internal targets rather than customer relationships, and Attio has no object shaped for them. Pipelines and stages already arrive as each deal's status.

How the move runs

  1. 1

    Pick the pair

    Choose HubSpot as the source and Attio as the destination.

  2. 2

    Connect both ends

    HubSpot: OAuth. Pick the portal, approve the scopes, disconnect whenever you like. Attio: sign in with Attio (OAuth).

  3. 3

    Choose the objects

    Tick what to move. Each row shows where the object lands in Attio. Nothing is written yet.

  4. 4

    Review every field

    Rename a field, skip it, or point it at a field that exists. When a field goes into an existing field, the step warns you that values on matched records are overwritten, and counts the fields concerned.

  5. 5

    Start the free sample

    Shuttio picks the sample at random: 5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records. A deal in the sample still finds its company, because every object takes the records linked to the ones already picked. Lists and files move with the full migration. You open the result in Attio.

  6. 6

    Run the full migration

    One click moves the rest, free. Pause, resume and cancel work while it runs.

  7. 7

    Check the report, then move new records

    The Records tab lists every source record as moved, updated, skipped or failed, with the reason, and downloads as a CSV. Move new records brings over the records created in HubSpot after the migration started.

Price

Free at any record count. The sample, the full run, Retry and rollback cost nothing.

HubSpot to Attio with Shuttio or by hand

Against a manual CSV export: a CSV is one object per file and a record export has no notes, tasks or meetings in it, so a deal's company is a column you match by hand and its notes, tasks and meetings are not in the file. Shuttio reads HubSpot through its API, creates records first and links them second, matches records already in Attio instead of duplicating them, and lists every record's outcome. If you only need one object's fields and no history, a CSV import is enough, and Shuttio runs those free into Attio too.

Questions

How much does a HubSpot to Attio migration cost?

Free at any record count. The sample, the full run, Retry and rollback cost nothing. Attio is the destination, so there is no per-record price.

What does the free sample move?

5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records. Lists and files move with the full migration. It is a real write into Attio, so it can be rolled back.

What does not move from HubSpot to Attio?

A dynamic list's filter itself; History on a property the portal will not report; Emails, unless you tick them; Files over 50 MB and linked files; and 1 more. Each has a reason on this page.

Can I undo the migration?

Yes. Rollback deletes the records, notes, tasks, meetings, files and list entries that the sample or the full run created, in reverse order, from a ledger. A record that already existed in Attio and was updated in place stays, and the values it overwrote are not restored; the Fields step warns you before the run.

Does it change anything in HubSpot, and what about records created while I migrate?

Shuttio only reads from HubSpot. It never writes to it. After the full run, Move new records moves the records created in HubSpot after the migration started. Edits to records already moved are not copied.

What happens to HubSpot calls and emails?

Each HubSpot call lands in Attio's Phone calls on its deal, person or company, with the time, length, direction, outcome, call notes, numbers and recording link. SMS, WhatsApp and LinkedIn messages logged in HubSpot get an Attio activity each. Logged emails can land as a Logged emails activity; they start unticked, because Attio's mailbox sync may already show them. Into Odoo, emails move too, and each call is a Done entry of Odoo's Call type in the chatter, with its time, length, direction, outcome and notes.

Move HubSpot to Attio in a free sample first.

Nothing is written to your new CRM until you have reviewed the objects and fields, and every CRM migration starts as a free sample: 5% of your companies, contacts or deals, 10 to 1,000 records, picked at random, with their linked records.