Into HubSpot

What Shuttio writes into HubSpot, where each object lands, the permissions it asks for and why, and what a rollback leaves.

Last updated: 28 October 2026

Sources that can move into HubSpot: Spreadsheet / CSV, Pipedrive, Affinity, Twenty, Attio. A CSV import is free. A CRM migration is priced by record count; the sample is free. See pricing.

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

What Shuttio writes

  • Contacts, companies and deals into HubSpot's own objects. Tickets, products and line items go to HubSpot's objects of those names. Any other object is created as a custom object, which needs HubSpot Enterprise: without it that object is skipped with one clear row and the rest imports.
  • Your own fields as properties, in a property group called Shuttio migration. A property you already have with that name and type is used as it is; one with another type is never changed, the field is added under a numbered name instead. Picklist values the source uses are added to your own picklists, never to HubSpot's.
  • Contacts are matched on email and companies on domain (or the key you choose) before anything is created. A match is linked and left untouched, and a rollback does not remove it.
  • Pipelines and stages: each source pipeline becomes a HubSpot deal pipeline with its stages, won and lost as closed stages. A pipeline you already have with the same name is used as it is, and only missing stages are added to it.
  • Associations between records, made after the records exist. A link to a record that did not migrate is listed, and a Retry makes it once that record is there.
  • Notes, tasks, calls, meetings and logged emails as HubSpot activities, each associated with every record it names. A logged email keeps its subject, body, direction, sender and recipients. Task owners and record owners are matched to a HubSpot user by email.
  • A contact's second and later email addresses as HubSpot secondary emails. A second phone number goes into Mobile phone when that is empty; any further numbers go into one text property, Other phone numbers.
  • Attachments, with the full migration only (the sample moves none): each file is uploaded to HubSpot's file manager, in a folder called Shuttio migration, and attached to the contact, company or deal it was on through a note. The Attachments switch on Options turns them off.
  • Your source's lists as static HubSpot lists of the contacts, companies or deals that migrated. A list that kept refilling itself from a filter arrives as a list of who matched on the day of the run. A list name you already use gets "(imported)" after it, so your own list is never changed.
  • Two properties on every record Shuttio writes: Shuttio source ID and Shuttio migration. They are what keep a re-run from duplicating anything and let a lost answer be found again.

Where each thing lands

FromObjectLands in HubSpot as
PipedrivePersonsContacts
PipedriveOrganizationsCompanies
PipedriveDealsDeals
PipedriveProductsProducts
PipedriveDeal productsLine items
PipedriveProjectsA custom object (HubSpot Enterprise), or the one you already have with that name
PipedriveLeadsA custom object (HubSpot Enterprise), or the one you already have with that name
AffinityPersonsContacts
AffinityOrganizationsCompanies
AffinityOpportunitiesDeals
TwentyCompaniesCompanies
TwentyPeopleContacts
TwentyOpportunitiesDeals
AttioCompaniesCompanies
AttioPeopleContacts
AttioDealsDeals

Permissions and why

Shuttio asks for the read permissions it always asks for, plus write permissions for the objects you migrate. HubSpot lets a portal or an approver leave some out; Shuttio refuses to save a connection that cannot write contacts, companies and deals.

PermissionWhy Shuttio needs it
crm.objects.contacts.write, companies, dealsCreates and updates the records, and archives them on rollback.
crm.schemas.contacts.write, companies, dealsCreates the properties and the property group, and removes them on rollback.
crm.objects.tickets.write, products, line_itemsOnly for the objects you tick. Left out, that object is reported and skipped.
crm.objects.custom.write, crm.schemas.custom.writeCustom objects (HubSpot Enterprise only).
crm.objects.owners.readMatches record and task owners to HubSpot users by email. Without it records import without an owner and the run says so.
filesUploads attachments and deletes them on rollback. Without it the run writes one row about attachments and moves the rest.
crm.lists.writeCreates the static lists, adds their members and deletes the lists on rollback. Without it the run writes one row about lists and moves the rest.

Known limits

  • A file over 50 MB, and a file that is only a link, is listed as a failed row and not copied. An attachment on a record of a custom object is not moved.
  • A list of records other than contacts, companies or deals (products, tickets, custom objects) is listed as a failed row and not created.
  • HubSpot allows about 100 requests every 10 seconds. A large migration paces itself under that, and if HubSpot still refuses it pauses with the reason and carries on when you resume.
  • Rollback archives what Shuttio created, deletes the attachments it uploaded and the lists it made; HubSpot keeps archived records in the recycle bin for 90 days. A record Shuttio matched, or one a re-run updated, is not removed and its values are not restored. A property is kept while a record you own still holds a value in it, and named.
  • HubSpot refuses a secondary email another contact already uses: the run counts these, and the contact keeps its first address.

How rollback works: Roll back.

Not answered here? Email help@shuttio.com.