Into Twenty
What Shuttio writes into Twenty, where each object lands, how to connect Twenty Cloud or a self-hosted server, how Twenty's request limit shapes a big run, and what a rollback leaves.
Last updated: 28 October 2026
Sources that can move into Twenty: Spreadsheet / CSV, HubSpot, Pipedrive, Affinity, Twenty, Attio. A CSV import is free. A CRM migration is priced by record count; the sample is free. See pricing. Twenty to Twenty moves one workspace into another: a self-hosted Twenty into Twenty Cloud, or two workspaces into one (see below).
Object by object: What objects are supported for Twenty migrations.
From another Twenty
- Connect each workspace on its own card: the one you move out of as the source, the one you move into as the destination. Each takes a sign-in or an API key, and a self-hosted one its address. Shuttio refuses the same workspace on both cards.
- Twenty's own fields land on the same fields: a person's name, emails, phones, job title, LinkedIn and company; a company's name, domain, address, employee count, annual revenue and LinkedIn; an opportunity's name, amount, close date, stage, company and point of contact.
- Your own fields land on the field of the same name when the destination has one with a type that fits, else Shuttio creates it. Your own objects land on the object of the same name, or a new one.
- Notes keep their title and markdown body, tasks their due date, status and assignee, on every person, company and opportunity they were on. Owners and assignees go to the member with the same email.
- Shuttio only reads the source workspace. Every record gets a new id in the destination; links between records are rebuilt from the source's.
- Views, workflows and dashboards move after the records, pointing at the destination's own fields, options, members and records. Twenty's own "All" views and personal views stay as they are, and one with the same name in the destination is left alone, so a Retry adds nothing twice.
- Workflows arrive as drafts, switched off: nothing runs in the destination until you turn a workflow on. They need the destination connected with Connect Twenty (sign-in): Twenty does not create workflows through an API key.
- A view, workflow or widget that depends on something that did not move (an object you left out, a code or email step, a record not in the migration) is skipped, and the run's report names it.
- Attachments come with the full migration: each lands on the opportunity, person, company or record of your own object it was on, and one on a note or task lands on the records that note or task is on. A person's profile photo lands on that person as their photo, or as an attachment when the person already has one.
- Not moved: emails and calendar events (each workspace syncs its own), workflow run history, records in the trash, and notes or tasks attached only to records of your own objects.
Connect
- Press Connect Twenty, sign in to Twenty and approve access; Twenty renews the token every hour on its own. For a self-hosted Twenty, enter its address first. If your server does not offer one-click sign-in, use an API key instead: it also takes the address, which stays empty for Twenty Cloud.
- Sign in with an admin account (or, for an API key, create it under Settings, APIs & Webhooks as an admin): Shuttio adds custom fields, choice options and objects, and a key without that right makes the run skip them and say so.
- The address must be a public https address. Shuttio refuses an address that points to a private network, and never follows a redirect with your key.
- The key is stored encrypted and deleted 14 days after the migration finishes. A migration is pinned to the workspace it first wrote to: a key from another workspace is refused.
What Shuttio writes
- People, companies and opportunities, linked as the source linked them: a person to its company, an opportunity to its company and to a point of contact.
- Every other record object (products, tickets, leads, your own types) as a custom object. An object of the same name that Twenty already has is reused.
- Your own fields as Twenty custom fields, created for you: text, number, currency, date, date and time, checkbox, single and multiple choice, email, phone, link, address, rating, and links to another object. A field Twenty already has under that name and a type that fits is reused, never retyped.
- Pipeline stages as options of the opportunity stage field. A source with several pipelines gets one option per stage, named "Pipeline · Stage".
- Notes and tasks, linked to the person, company and opportunity they were on, with their original date where Twenty takes it.
- Calls and meetings as notes, titled "Call · …" and "Meeting · …", with the time, length, direction and attendees in the text.
- Attachments land in the Attachments of the record they were on, with the full migration only (the sample moves none). The Attachments switch on Options turns them off.
- Companies and opportunities go to the Twenty member with the same email as their owner in the source, and tasks to the member with the assignee's email. No member is invited: each is a paid seat.
Where each thing lands
| From | Object | Lands in Twenty as |
|---|---|---|
| HubSpot | Contacts | People |
| HubSpot | Companies | Companies |
| HubSpot | Deals | Opportunities |
| HubSpot | Products | A custom object, created in Twenty when it has none, or the one you already have with that name |
| HubSpot | Line items | A custom object, created in Twenty when it has none, or the one you already have with that name |
| HubSpot | Tickets | A custom object, created in Twenty when it has none, or the one you already have with that name |
| HubSpot | Quotes | A custom object, created in Twenty when it has none, or the one you already have with that name |
| HubSpot | Leads | A custom object, created in Twenty when it has none, or the one you already have with that name |
| Pipedrive | Persons | People |
| Pipedrive | Organizations | Companies |
| Pipedrive | Deals | Opportunities |
| Pipedrive | Products | A custom object, created in Twenty when it has none, or the one you already have with that name |
| Pipedrive | Deal products | A custom object, created in Twenty when it has none, or the one you already have with that name |
| Pipedrive | Projects | A custom object, created in Twenty when it has none, or the one you already have with that name |
| Pipedrive | Leads | A custom object, created in Twenty when it has none, or the one you already have with that name |
| Affinity | Persons | People |
| Affinity | Organizations | Companies |
| Affinity | Opportunities | Opportunities |
| Twenty | Companies | Companies |
| Twenty | People | People |
| Twenty | Opportunities | Opportunities |
| Attio | Companies | Companies |
| Attio | People | People |
| Attio | Deals | Opportunities |
Matching, and what is never changed
- A person is matched on email and a company on website domain, the two keys Twenty keeps unique, before anything is created.
- A record that matches one you already had is linked to, not written: its values are yours, and a cancel never removes it. The run counts them.
- Rows that share an email or a domain in one run become one record.
- Every record is created with an id Shuttio derives from the migration and the source id. A request sent twice, or whose answer was lost, cannot make a second record: Shuttio reads the ids back before it sends again.
Twenty's request limit
Twenty allows 100 requests a minute per workspace and takes up to 60 records in one request. Shuttio paces itself under the limit and waits out a 429. If Twenty keeps refusing, the run pauses and says so; press Resume a few minutes later. Because a request carries up to 60 records, tens of thousands of records are minutes of requests at that pace, not days.
Known limits
- A file over 50 MB, and a file that is only a link, is listed as a failed row and not copied. A self-hosted Twenty on a release whose attachments have no file field takes no files: the run says so in one row.
- A logged email is written as a note (subject, from, to, date, body): Twenty has no way to take a message in from outside its own mailbox sync.
- Twenty has no call or meeting object, so calls and meetings are notes. Twenty's calendar is a sync from your mailbox, which Shuttio does not write to.
- Source lists are not carried: Twenty has views, not static lists.
- An opportunity has one point of contact: a deal's other people are left out and the run counts them.
- A company named only in a CSV column is not created from it; import the companies as their own file first, and the people link to them.
- An address goes in as one line in the street field. Twenty cannot split an address it is given as one string.
- A rollback removes what the migration created: attachments and the profile photos it set, records, notes, tasks and their links, then the choice options no record holds, then the custom fields, then each custom object that is empty. A choice option a record holds is kept and named. Records that matched yours are never removed.
Not answered here? Email help@shuttio.com.