HubSpot

What Shuttio reads from HubSpot, where it lands in Attio, Clarify, Odoo, Pipedrive, Breakcold, Twenty, which permissions it needs and why, and what does not move.

Last updated: 28 October 2026

OAuth. Pick the portal, approve the scopes, disconnect whenever you like.

Object by object: What objects are supported for HubSpot migrations.

What Shuttio reads and moves

The list below describes the move into Attio. Where Clarify or Odoo differ, the destination's own article says so.

  • Contacts, companies and deals: Every property the portal reports, mirrored into Attio with the fields you kept. Contacts land as people.
  • Products, line items, tickets, quotes and leads: Each lands in an Attio object with a fixed shape, or in the one you already have when its name matches. Products stand alone, line items link to their deal, quote and product, tickets to their companies, contacts and deals, and quotes to their deals and companies. Leads go where you choose: people, deals at the stage Lead, or their own object.
  • Your portal's own custom objects: Discovered from the portal schema, not from a list we maintain. The property HubSpot enforces uniqueness on becomes the dedup key, so re-running updates rather than duplicates.
  • Associations, in full: Read through the v4 batch association API with paging. The inline association parameter on a record read silently truncates a contact with hundreds of associations; this does not.
  • Notes, tasks and meetings: As Attio notes, tasks and meetings. Note bodies re-sync on a later run, and a note you moved in HubSpot moves in Attio.
  • Calls, as Attio phone calls: Each call lands in Attio's Phone calls on its deal, person or company, with the time, length, direction, outcome and call notes; the numbers and recording link open the notes. A call with no migrated person, or a workspace that has not allowed activities, becomes a note titled "Call: <title>" instead. Phone numbers and recording links are copied as they are, so anyone who can open the call can use the link.
  • SMS, WhatsApp and LinkedIn messages: Messages logged in HubSpot land in an Attio activity per channel (SMS, WhatsApp message, LinkedIn message) on their records, with the text and direction. Where the workspace has not allowed activities, each becomes a note.
  • Lists, static and dynamic: Members become Attio list membership. A dynamic list crosses as a snapshot of who was in it at the moment of the run, and its filter conditions ride along as text.
  • Property history: Optional. Each property's past values arrive as Attio value history, so a stage change from March still reads as March. Requested on the batch read the import already makes.

Where each thing lands

HubSpot objectIn AttioIn ClarifyIn OdooIn PipedriveIn BreakcoldIn Twenty
ContactsPeoplePeoplePartners (contacts)PersonsPeoplePeople
CompaniesCompaniesCompaniesPartners (companies)OrganizationsCompaniesCompanies
DealsDealsDealsCRM opportunitiesDealsDealsOpportunities
ProductsIts own object, or the one you already have with that nameIts own object, created in Clarify when it has noneProductsProductsNot movedA custom object, created in Twenty when it has none, or the one you already have with that name
Line itemsIts own object, or the one you already have with that nameIts own object, created in Clarify when it has noneNot movedProducts on their dealsNot movedA custom object, created in Twenty when it has none, or the one you already have with that name
TicketsIts own object, or the one you already have with that nameIts own object, created in Clarify when it has noneNot movedNot movedNot movedA custom object, created in Twenty when it has none, or the one you already have with that name
QuotesIts own object, or the one you already have with that nameIts own object, created in Clarify when it has noneNot movedNot movedNot movedA custom object, created in Twenty when it has none, or the one you already have with that name
LeadsPeople, deals at the stage Lead, or their own object (you choose)Its own object, created in Clarify when it has noneCRM leadsLeadsNot movedA custom object, created in Twenty when it has none, or the one you already have with that name

Notes, tasks, meetings, calls, files, owners and lists depend on the destination. This is the row for HubSpot, generated from the same tables the runner uses:

Into Attio

FromObjectsNotesTasksMeetingsCallsEmailsFilesOwnersLists
HubSpotContacts, Companies, Deals, Products, Line items, Tickets, Quotes, LeadsYesYesYesYesYesYesYesYes

Into Clarify

FromObjectsNotesTasksMeetingsCallsEmailsFilesOwnersLists
HubSpotContacts, Companies, Deals, Products, Line items, Tickets, Quotes, LeadsYesYesAs commentsAs commentsAs commentsYesYesAs fields

Into Odoo

FromObjectsNotesTasksMeetingsCallsEmailsFilesOwnersLists
HubSpotContacts, Companies, Deals, Products, LeadsYesYesYesYesYesWith an API keyYesNo

Into Pipedrive

FromObjectsNotesTasksMeetingsCallsEmailsFilesOwnersLists
HubSpotContacts, Companies, Deals, Products, Line items, LeadsYesYesYesYesYesYesYesNo

Into Breakcold

FromObjectsNotesTasksMeetingsCallsEmailsFilesOwnersLists
HubSpotContacts, Companies, DealsYesYesYesYesAs notesNoNoNo

Into Twenty

FromObjectsNotesTasksMeetingsCallsEmailsFilesOwnersLists
HubSpotContacts, Companies, Deals, Products, Line items, Tickets, Quotes, LeadsYesYesAs notesAs notesAs notesYesYesNo

Each destination's own article says how its data is written: Attio, Clarify, Odoo, Pipedrive, Breakcold, Twenty.

Permissions and why

ScopeWhy Shuttio needs it
oauthHubSpot requires it of every app.
crm.objects.contacts.readReads contacts, and the notes, tasks, meetings and calls attached to your records.
crm.schemas.contacts.readReads your contact properties, so each can be mapped to a field in the destination.
crm.objects.companies.read, crm.schemas.companies.readReads companies, their properties and their associations.
crm.objects.deals.read, crm.schemas.deals.readReads deals, their properties and their associations.
crm.objects.products.read, crm.objects.line_items.readReads products and line items.
crm.lists.readReads your lists and their members.
Optional: crm.objects.custom.read, crm.schemas.custom.readReads your custom objects (Enterprise). If your portal has none, HubSpot drops the scope.
Optional: crm.objects.tickets.readReads tickets (Service Hub).
Optional: crm.objects.quotes.read, crm.objects.leads.readReads quotes and leads (Sales Hub). Without quotes access, line items import without their quote link.
Optional: crm.objects.owners.readMatches each record's owner to a user in the destination by email. Without it, owners fall back to the fallback owner.
Optional: filesReads the files attached to notes, emails, calls, meetings and tasks. Without it, the files step writes one "Reconnect HubSpot to move attachments." row and moves nothing.
Optional: sales-email-readReads logged emails with their bodies, for a move into Clarify or Odoo. Without it, the emails step writes one "Reconnect HubSpot to include emails" row and moves nothing.

Shuttio only reads from HubSpot. An optional scope that your portal lacks is dropped at install instead of failing it, and the Objects step offers "Reconnect HubSpot" for what is missing.

Known limits

  • A dynamic list's filter itself: 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: 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: logged emails move into Clarify and Odoo, with subject, sender, recipients, date and body; reading bodies needs the sales-email-read permission, and without it the emails step writes one "Reconnect HubSpot" row. Into Attio they land as a Logged emails activity, unticked by default because Attio's mailbox sync may already show them.
  • Large and linked files: a file over 50 MB, and an entry that is only a link, is listed as a failed row and not copied.
  • Calls: Into Odoo, each call is a Done entry of Odoo's Call type in the chatter of its contact, company or opportunity, with the time, length, direction, outcome and call notes. Into Attio, each call lands in Attio's Phone calls on its deal, person or company, with the time, length, direction, outcome and call notes (a note when the workspace has not allowed activities). Into Clarify, each call arrives as a comment on its record saying what it was, when and in which direction.

Not answered here? Email help@shuttio.com.