Affinity
What Shuttio reads from Affinity, where it lands in Attio, Clarify, Odoo, HubSpot, Pipedrive, Breakcold, Twenty, Capsule, HighLevel, ActiveCampaign, Zendesk Sell, folk, which permissions it needs and why, and what does not move.
Last updated: 7 Nov 2026
An API key, pasted once and validated against your tenant before anything runs.
Object by object: What objects are supported for Affinity 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.
- Persons, organizations and opportunities: Straight onto people, companies and deals.
- Global fields: Affinity keeps a workspace's own entity-level fields off the record payload and off the list endpoint, so a naive export loses them entirely. They are read separately and arrive as columns on the record.
- Lists, with their field values: Each Affinity list becomes an Attio list, and the list's own fields become list attributes carrying each member's value — dropdowns keep their options, numbers and dates keep their types.
- Notes and meetings: As Attio notes and meetings, attached to the records they belong to.
- Reminders and calls: Reminders become tasks. A logged call lands in Attio's Phone calls (a note when the workspace has not allowed activities). Both attach to the records they belong to. Finding calls takes one request per person, so that step is slow in a large workspace.
Where each thing lands
| Affinity object | In Attio | In Clarify | In Odoo | In HubSpot | In Pipedrive | In Breakcold | In Twenty | In Capsule | In HighLevel | In ActiveCampaign | In Zendesk Sell | In folk |
|---|
| Persons | People | People | Partners (contacts) | Contacts | Persons | People | People | People | Contacts (put into their business) | Contacts | Contacts (put into their organization) | People |
|---|
| Organizations | Companies | Companies | Partners (companies) | Companies | Organizations | Companies | Companies | Organisations | Businesses | Accounts (matched by name, or created with a contact that works there) | Organizations (matched by name, else created) | Companies |
|---|
| Opportunities | Deals | Deals | CRM opportunities | Deals | Deals | Deals | Opportunities | Opportunities | Opportunities (pipeline and stage matched by name) | Deals (pipelines and stages created when missing) | Deals (pipeline and stage matched by name; the contact is required) | Deals (an object in the group Shuttio import) |
|---|
Notes, tasks, meetings, calls, files, owners and lists depend on the destination. This is the row for Affinity, generated from the same tables the runner uses:
Into Attio
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | Yes | No | Yes |
|---|
Into Clarify
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | As comments | As comments | No | Yes | No | As fields |
|---|
Into Odoo
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | With an API key | No | No |
|---|
Into HubSpot
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | Yes | No | Yes |
|---|
Into Pipedrive
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | Yes | No | No |
|---|
Into Breakcold
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | No | No | No |
|---|
Into Twenty
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | As notes | As notes | No | Yes | No | No |
|---|
Into Capsule
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | Yes | No | No |
|---|
Into HighLevel
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | No | No | No |
|---|
Into ActiveCampaign
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | As notes | As notes | As notes | No | No | No | No |
|---|
Into Zendesk Sell
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | As notes | As notes | No | No | No | No |
|---|
Into folk
| From | Objects | Notes | Tasks | Meetings | Calls | Emails | Files | Owners | Lists |
|---|
| Affinity | Persons, Organizations, Opportunities | Yes | Yes | Yes | Yes | No | No | No | No |
|---|
Each destination's own article says how its data is written: Attio, Clarify, Odoo, HubSpot, Pipedrive, Breakcold, Twenty, Capsule, HighLevel, ActiveCampaign, Zendesk Sell, folk.
Permissions and why
| What | Why Shuttio needs it |
|---|
| An API key | Affinity has no OAuth. Shuttio checks the key against your tenant before it saves anything. Get it in Affinity under Settings → API. |
|---|
Known limits
- Person, organization and location field types: Affinity lets a list field point at another record; Attio list attributes hold scalars. Those fields are dropped rather than flattened into a name that would look like data.
- Custom objects: Affinity has no such concept — its analogue is lists plus fields, and both migrate in full.
- Field history: Affinity exposes no per-field change log at all, so there is no timeline to read. Current values are what crosses.
- Emails: Affinity's API returns an email's subject and recipients but never its body, so Shuttio imports none.
- 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.
Affinity into Odoo
- Organizations and persons: into Odoo partners (res.partner), a person linked to their first organization in a second pass. A partner is matched by domain or email and updated, not duplicated.
- Opportunities: into CRM opportunities. Each Affinity opportunity list becomes a sales team with its Status values as stages, in Affinity's order; a Status named like won or lost is kept as such (lost ones are archived with a lost reason). An opportunity's organization and first person are linked in a second pass.
- Notes, reminders and meetings: notes become internal notes in the chatter of the opportunity, person or organization; an open reminder a scheduled To-Do, a completed one a Done entry; a meeting a Calendar event when the Calendar app is installed.
- Other fields: each of your Affinity fields with no Odoo counterpart goes to an existing writable x_ field you pick, or to a new x_ field when your key has the rights. A field named Deal Size, Amount or Close Date fills the opportunity's revenue and deadline.
- Files: with the Attachments checkbox ticked, files are copied to the record's attachments through the Odoo API.
- Lists: Odoo has no place for an Affinity list, so only the opportunity lists move, as sales teams. Other lists and their field values stay in Affinity.
- Owners and authors: Affinity's API gives no user email for a note or a reminder, so they are written by the connected Odoo user and arrive unassigned.
Not answered here? Email help@shuttio.com.