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
| From | Object | Lands in HubSpot as |
|---|---|---|
| Pipedrive | Persons | Contacts |
| Pipedrive | Organizations | Companies |
| Pipedrive | Deals | Deals |
| Pipedrive | Products | Products |
| Pipedrive | Deal products | Line items |
| Pipedrive | Projects | A custom object (HubSpot Enterprise), or the one you already have with that name |
| Pipedrive | Leads | A custom object (HubSpot Enterprise), or the one you already have with that name |
| Affinity | Persons | Contacts |
| Affinity | Organizations | Companies |
| Affinity | Opportunities | Deals |
| Twenty | Companies | Companies |
| Twenty | People | Contacts |
| Twenty | Opportunities | Deals |
| Attio | Companies | Companies |
| Attio | People | Contacts |
| Attio | Deals | Deals |
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.
| Permission | Why Shuttio needs it |
|---|---|
| crm.objects.contacts.write, companies, deals | Creates and updates the records, and archives them on rollback. |
| crm.schemas.contacts.write, companies, deals | Creates the properties and the property group, and removes them on rollback. |
| crm.objects.tickets.write, products, line_items | Only for the objects you tick. Left out, that object is reported and skipped. |
| crm.objects.custom.write, crm.schemas.custom.write | Custom objects (HubSpot Enterprise only). |
| crm.objects.owners.read | Matches record and task owners to HubSpot users by email. Without it records import without an owner and the run says so. |
| files | Uploads attachments and deletes them on rollback. Without it the run writes one row about attachments and moves the rest. |
| crm.lists.write | Creates 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.