Migrate from HubSpot CRM to Twenty

Moving from HubSpot CRM to self-hosted Twenty is mostly a data-mapping and rebuild exercise. This page covers what moves cleanly, what needs rework, and how to sequence the cutover.

On this page

Migrate from HubSpot CRM to Twenty without losing deal history

Moving from HubSpot CRM to self-hosted Twenty is feasible, and it is mainly a mapping and rebuild job. Teams usually make the move because seat costs keep rising, because they need contact data in a specific region or on their own servers, or because they want fewer limits on API use and features. An internal admin, often the person who already manages HubSpot properties and users, owns the decisions about which records, fields and pipelines carry over. A partner typically handles the export scripts, the Docker Compose hosting, backups and the cutover checks. Plan for the admin to spend most of the project on the data model, not on the software installation.

The effort and risk sit mostly in extraction and mapping. HubSpot lets users with export permissions download companies, contacts, deals, tickets and custom objects with their property values and associations as CSV, XLSX or XLS files, and it allows up to 300 exports in a rolling 24-hour window with three running at once, so schedule the extraction in the right order: companies, then contacts, then deals, then notes. Map each HubSpot property to a Twenty field or custom object before you import anything, and keep the record IDs from both systems so associations can be rebuilt. Confirm with Twenty which activity types, timeline entries and attachments can be imported in your version, because deal history is the part most likely to be partly lost. Twenty's self-hosting guide runs a server, a worker, PostgreSQL and Redis and asks for at least 2 GB of RAM, so size the host before the test import.

Marketing email is a separate decision and should be made before cutover. HubSpot marketing email, forms, lists and consent records are tied to Marketing Hub, not to the CRM records you export, so moving companies and deals does not move campaigns. Decide whether email sends from another tool, whether Mautic will take over campaigns, and how unsubscribe and consent status will be carried over for each contact. Ask Twenty and your partner to confirm how consent-related fields are imported and how email and calendar sync will be connected to your mail provider. Keep the old HubSpot portal read-only for a period of your choosing so the team can check history after the cutover.

Which HubSpot CRM capabilities map to Twenty and which need rework

This table compares the main HubSpot CRM objects and features with their closest Twenty equivalents and marks each as clean, needs rework or gap. Use it to scope the migration before exporting data, since rows marked needs rework or gap set the work for your team. Confirm current Twenty behavior in your target release, because the platform ships frequently.

CapabilityTwenty equivalentStatus and what to plan
Companies and contactsStandard company and person objects with custom fieldsClean: map core properties directly, but confirm how duplicate companies and contacts are merged before import
Deals and pipelinesOpportunity object with configurable pipeline stages and viewsNeeds rework: rebuild stages, probability and pipeline views by hand, since stage names do not carry over automatically
Custom propertiesCustom fields and objects defined in the workspace or as codeNeeds rework: decide per property whether it becomes a field, a select option or a custom object before import
AssociationsRelations between person, company and opportunity recordsNeeds rework: rebuild links from the exported association columns and check many-to-many relations in a test workspace
Notes and activity historyNotes and timeline activity linked to recordsNeeds rework: confirm how historical timeline entries are imported and whether note attachments carry over
WorkflowsWorkflow automation built in TwentyNeeds rework: recreate each HubSpot workflow as a Twenty workflow and test triggers and branches against sample records
Email and calendar syncBuilt-in email and calendar sync per userNeeds rework: each user reconnects their mailbox and calendar, and historical email is not assumed to migrate
Permissions and rolesRole-based permissions per workspaceNeeds rework: translate HubSpot teams and permission sets into Twenty roles and confirm which access levels your plan includes
APIs and webhooksREST and GraphQL APIs with webhooksClean: APIs are available on all plans per the pricing page, but integrations built on HubSpot-specific endpoints must be rewritten
Marketing Hub email and formsOutside Twenty's CRM scopeGap: plan a separate marketing tool for email campaigns, forms and landing pages, and decide what consent data moves with contacts

How the migration runs from inventory to decommission

The sequence moves HubSpot records into a self-hosted Twenty instance in controlled stages, so each object type is checked before HubSpot is switched off. Every step ends with a named artifact that the next step depends on.

  1. Inventory objects, properties and associations

    Your team lists every object in use (companies, contacts, deals, tickets, notes, tasks and any custom objects), every property on each, and the associations between them. Count records per object and note which properties are required by workflows, reports or integrations. The output is an inventory sheet that names each property, its type, its owner and whether it is still in use. Confirm the inventory against the current export permissions and the export limits described in HubSpot's knowledge base, because those limits shape how you pull the data.

  2. Build the field map and Twenty data model

    Map each HubSpot object and property to a Twenty object, field or relation. Decide which custom properties become Twenty custom fields, which become notes, and which are dropped. Twenty supports custom objects and fields defined as code, so agree the data model before importing so that naming does not change later. The output is a signed-off field map with one row per source property, its target field and a transformation rule for values such as dates, currencies and picklists.

  3. Export HubSpot records with associations

    Export each object with its property values and associations as CSV or XLSX files, following the export steps in HubSpot's knowledge base. Keep the exported files in a read-only archive location and record the export date, the object and the row count in a log. Where a portal is too large for one export, split the work into batches and plan around the rolling export limits. The output is a complete set of exports plus a count log that you will reconcile against later.

  4. Run a pilot import into self-hosted Twenty

    Deploy a non-production Twenty instance using the Docker Compose self-hosting guide, then import a representative sample covering every object type, including records with multiple associations and records with missing values. Use the API or import tooling to load companies first, then contacts, deals, and notes so that relations resolve. Check that associations, timestamps and owners look correct on screen and through the API. The output is a validated pilot dataset and a list of mapping defects that were fixed in the field map.

  5. Rebuild pipelines, views and automations

    Recreate deal pipelines and stages, saved views, roles and permissions, and the workflows that your sales team depends on. Confirm which features your chosen Twenty plan includes, such as row-level permissions or SSO, before you configure access. Ask a pilot group of sales users to work through their daily views and report gaps. The output is a configuration checklist signed off by the sales lead and the admin who owns the instance.

  6. Run the full import and a parallel period

    Import the complete exports into a production Twenty instance and run HubSpot and Twenty side by side for an agreed period, with new records entered in Twenty as the system of record. Compare record counts, association counts and key deal values between the two systems each time a batch changes. Resolve differences at source and re-import where needed. The output is a reconciliation report that shows, per object, the source count, the target count and every exception with its resolution.

  7. Cut over and archive HubSpot data

    Freeze HubSpot edits, run a final delta export for records changed since the last import, and load the delta into Twenty. Point users, email sync, integrations and webhooks at Twenty and confirm each one works. Archive the final HubSpot exports and the reconciliation report in storage you control, with a retention period set by your records policy. The output is a signed cutover record and an archive index that an auditor or the next team member can read.

  8. Decommission HubSpot access

    Remove HubSpot user seats that are no longer needed, revoke API keys and app connections, and disable forms or tracking that still send data to the old portal. Check the contract terms with HubSpot for data retention and account closure, and confirm them in writing before you cancel. The output is a decommission checklist with each integration marked as removed, plus written confirmation of the account status from HubSpot.

Which HubSpot exports and integrations to move into Twenty

HubSpot's documented export path is the starting point for every record that moves into Twenty. The limits on export volume and concurrency shape the extraction plan, and each connected tool needs its own rebuild or retirement decision on the Twenty side.

Record exports with property values

HubSpot lets users with export permissions export contacts, companies, deals, tickets and custom objects as CSV, XLSX or XLS files, with property values and associations included. Confirm that the account user holds export permission before planning the run, because the export is blocked without it. Check the exported files for column headers and association columns, since these become the basis for mapping to Twenty fields and relations.

Export volume and concurrency limits

HubSpot allows up to 300 exports in a rolling 24-hour window and up to three exports running at once. A large portal with many objects and files may need several batches spread across days, so schedule the extraction and keep a log of which files were pulled. Plan a dry run on a sample portal first to measure how many exports the full move will consume.

Association and ID mapping

Associations between contacts, companies and deals arrive as separate columns in the export, not as native relations in Twenty. Build a mapping table that links HubSpot record IDs to the new Twenty record IDs as each object is imported, then resolve relations in a second pass. Without this table, notes and deals can attach to the wrong company or lose their contact links.

Email, notes and attachments

Email threads, call logs and attachments do not always come through a standard record export in the same form, so confirm exactly what HubSpot will deliver for each of them. Decide which history must be imported into Twenty and which can stay archived in a read-only copy of the export. Note that Twenty's email and calendar sync covers new mail from the point of connection, not necessarily the historical threads.

Rebuilding integrations through APIs and webhooks

Twenty exposes REST and GraphQL APIs and webhooks, so each integration that pushes or pulls CRM data needs a rebuild on that interface. List every app connected to HubSpot, including forms, ad platforms, support tools and data warehouse syncs, and confirm for each one whether a Twenty connector exists. Where none exists, plan a custom integration against the API and assign an owner for testing it.

Workflow automation and permissions

HubSpot workflows that route leads, set deal stages or send notifications must be rewritten using Twenty's workflow automation. Role-based permissions in Twenty also need to match the teams who had access in HubSpot, and some controls such as row-level permissions and SSO are tied to paid Twenty plans. Ask the vendor which plan includes each control you depend on before scheduling cutover.

How the move differs for startups, SaaS teams and larger portals

A small startup portal usually has a modest number of contacts, companies and deals, a handful of custom properties and a short list of pipelines. The main work is cleaning records and deciding which default properties still matter before anything moves. Because the data volume is typically small, a full export and a manual check of a sample can often be done in one working session, which keeps the project simple. Teams in this position usually have one or two people who own the CRM, so decisions about pipelines and views can be made quickly.

  • Property audit: List every contact, company and deal property and mark which ones staff actually use. Many default fields can be dropped rather than recreated.
  • Pipeline rebuild: Recreate the deal stages in Twenty and confirm that each open deal lands in the right stage after import.
  • Notes and activity: Decide whether timeline notes are needed as history or can be archived in the HubSpot export files.
  • Owner mapping: Map HubSpot users to Twenty workspace members before import so record ownership is preserved.
  • Cutover window: Because the portal is small, a short freeze on new records during the final export is often enough.

Confirm with your own portal how many custom properties exist, whether any were created by an integration, and who in the team will own the Twenty workspace after launch.

What usually goes wrong when moving HubSpot data to Twenty

Most failed HubSpot to Twenty moves break in the same few places: records lose their links, field types do not survive the trip, and history or consent data gets left behind. Each card below names one failure, why it matters for this migration, and the check to run before cutover.

Broken associations between records

HubSpot exports contacts, companies and deals as separate files, and the links between them are carried by association columns. If you import each object on its own, a deal can arrive without its company and a contact without its account. Export with associations included, load companies first, then contacts, then deals, and check a sample of each deal against its primary contact and company after every load.

Property type mismatches

HubSpot properties such as multi-checkbox lists, dates with time zones, currency values and dropdown options do not always map one to one onto Twenty field types. A dropdown exported as free text, or a date that shifts a day because of time zone handling, can silently corrupt reporting. Define the target type for every property before import, and run a test import on a copy of the data to compare values field by field.

Duplicate contacts and companies

Merging two HubSpot portals, or importing from a list that already contains the same person under two emails, creates duplicates that multiply during import. Twenty will accept both records unless you deduplicate first. Match on email address and company domain, decide which record wins on conflicting fields, and keep a mapping table of old HubSpot record IDs to new Twenty IDs so that later imports update rather than create new rows.

Lost activity history

Notes, calls, meetings and emails attached to a record are often missing from a standard property export, so the timeline in Twenty looks empty for older deals. Confirm which activity types your HubSpot export includes, then import notes and activities as separate passes linked to the migrated records. Ask the team which timeline entries they need on day one and keep the source export archived for anything you cannot bring across.

Undersized hosting for the import

Twenty's Docker Compose self-hosting guide runs a server, a worker, PostgreSQL and Redis, and asks for at least 2 GB of RAM because insufficient memory can crash processes. A large import through the worker can exhaust a small virtual machine during a load that looks fine in testing. Size the host above the guidance for the migration window, watch memory during test runs, and only resize after the production data load has finished cleanly.

Marketing consent moving without a plan

Email opt-in and opt-out status, consent source and consent dates are the fields most likely to be lost or misread in a CRM move, and sending to a contact who opted out creates legal exposure. Decide before import where marketing email will be sent from, whether Twenty will hold consent flags or a separate tool will, and which suppression list is authoritative. Import suppression data first and confirm with your legal or privacy owner that consent records are complete.

What drives the cost and duration of a HubSpot to Twenty move

This table lists the components that set the cost and effort of moving from HubSpot CRM to self-hosted Twenty, who is paid for each, and what to request in a written quote. Read it as a checklist for scoping, since most of the variation between quotes comes from the rows marked as volume or complexity drivers. The main takeaway is that the Twenty license is not the largest cost line in most moves; data volume, integrations and the hosting setup usually are.

Cost driverWhy it changes cost or effortWhat to request in a quote
Object and custom property countEach HubSpot custom property needs a matching Twenty field, and custom objects must be defined as code or in the workspace before import. More properties mean more mapping and validation.Itemized property map with each field's type, owner and required status
Association volumeContact to company, deal to contact and note links must be exported and re-created. HubSpot exports cap how many associations come with each record, so large portals need more passes.Plan for association extraction, re-linking scripts and a reconciliation report
Record volume and export limitsHubSpot allows up to 300 exports in a rolling 24-hour window and up to three running at once, so large extractions take longer to schedule and verify.Estimated export batches, a schedule that respects the limits, and the record counts used
Pipelines, stages and viewsEach HubSpot pipeline, stage and saved view is rebuilt in Twenty. Complex pipeline logic or many teams add configuration and testing time.List of pipelines and views to rebuild, with sign-off steps
Workflow and automation rebuildHubSpot workflows must be redesigned as Twenty workflow automation, then tested. Branching logic and third-party actions raise the work.Inventory of workflows, what each one does and which ones will be retired
Integrations and connectorsEach connected tool (email, calendar, forms, billing, support) needs a new connection or a replacement. Webhooks and API consumers need updating.Integration list with owner, auth method and cutover plan
Email and marketing dataMarketing email, forms and consent records may stay in HubSpot or move to a separate tool. Decisions here change scope and consent handling.Written scope statement on what leaves HubSpot and what stays
Hosting, backup and monitoringTwenty's Docker Compose guide runs a server, a worker, PostgreSQL and Redis and asks for at least 2 GB of RAM. Backup, restore testing, upgrades and monitoring are ongoing work.Architecture diagram, backup and restore test plan, upgrade procedure and monitoring scope
Twenty plan choiceSelf-hosting the open source core is free according to Twenty's pricing page. Pro, Organization and Enterprise add per-user or annual fees and features such as SSO, audit logs, row-level permissions and SCIM, so the feature list drives the plan.Named features required, the plan that includes them and a per-user cost calculation from Twenty's published pricing
User training and change managementSales and support staff need to learn new views, fields and workflows. Training effort grows with team size and the number of changed processes.Training plan, session count, materials and who delivers them

Questions buyers ask before moving from HubSpot CRM to Twenty

How long does a migration from HubSpot CRM to Twenty take?

The duration depends mostly on how many records, custom properties and associations you carry over, how many pipelines and workflows you rebuild, and how much cleanup your HubSpot data needs first. A portal with a small contact list and one pipeline is a very different project from a multi-team instance with years of custom objects and deal history. Your HubSpot export limits also shape the plan: HubSpot allows up to 300 exports in a rolling 24-hour window and up to three exports running at once, so large extractions need scheduling. Ask any implementation partner for a written timeline based on a record count and inventory of your properties, and confirm it against a test migration in a staging instance before committing to a cutover date.

What does moving from HubSpot CRM to Twenty cost, and what recurs?

Costs fall into a few components: the self-hosted infrastructure, the one-time migration and mapping work, the rebuild of pipelines and views, integration and email decisions, and ongoing administration. Twenty's pricing page says the open source core can be self-hosted for free, so the software license itself is not the main line item. Hosting, backups, upgrades and admin time recur every year, while mapping, data validation and training are largely one-time. HubSpot seat fees you stop paying are the offset. Ask any vendor or partner to quote each component separately, and to state which items are included in a fixed scope and which are billed per change.

Can our internal team migrate from HubSpot to Twenty without outside help?

A capable internal team can do it, especially if someone already runs PostgreSQL, Redis and Docker in production. Twenty's Docker Compose guide runs a server, a worker, PostgreSQL and Redis, and asks for at least 2 GB of RAM, so the hosting work is familiar to most platform teams. The harder parts are data mapping, association handling, validating records and rebuilding automations, which need someone who understands both systems. Many teams split the work: internal staff own hosting and access, while an outside team handles the mapping and testing. Decide early which side owns cutover, rollback and post-migration support.

What do HubSpot admins and IT need to provide for the move?

HubSpot admins need a user with export permissions, a complete inventory of standard and custom properties, pipelines, lifecycle stages, lists and workflows, and a decision on which historical records matter. IT needs to provision the hosting environment, decide on network access, identity and backups, and define who can administer the workspace. HubSpot exports contacts, companies, deals, tickets and custom objects with property values and associations as CSV, XLSX or XLS, so admins should confirm which association labels they rely on before exporting. Agree on a freeze window so records do not change mid-extraction.

Does Twenty's AGPL-3.0 license or its Enterprise-licensed files affect self-hosting?

Twenty is mostly licensed under AGPL-3.0 with an additional application exception, and SDK and UI packages are MIT. Files marked with an Enterprise license header fall under a commercial license, so you should not assume every file in the repository is open source. Have your legal team review the LICENSE file and the exception text for your intended use, including whether you modify the code or offer it to users over a network. Confirm which features you need are in the open source core and which require the Organization or Enterprise plans, such as row-level permissions, SAML or OIDC SSO, audit logs, SCIM provisioning and single-tenant isolation.

What happens to HubSpot marketing email when we move the CRM to Twenty?

Moving the CRM does not move your marketing email automatically. Twenty handles contacts, companies, deals, notes, workflow automation and email and calendar sync for sales activity, but campaign sending, forms, landing pages and lead scoring from HubSpot Marketing Hub need a separate decision. Options include a dedicated self-hosted marketing platform such as Mautic, or a newsletter tool such as listmonk, with the sending service and deliverability handled on your side. Before you export, pull consent records, unsubscribe status and list membership, because these determine who you may email after the move. Confirm with your legal and deliverability owners before switching sending domains.

How do we keep security and access controls intact after the move?

Start by mapping HubSpot teams and permissions to Twenty roles, because Twenty supports role-based permissions and multiple workspaces. Plan for who can see sensitive contacts and deal values, and test those rules with real user accounts before cutover. Secure the PostgreSQL and Redis instances, restrict network access to the server, and set backup and restore procedures that you have tested. Confirm whether row-level permissions and SSO are included in the plan you choose, and document the evidence for your compliance team, since DeployOpen prepares controls and evidence but independent auditors issue any attestation.

How DeployOpen scopes and runs a HubSpot to Twenty migration

DeployOpen plans, implements, integrates, hardens, backs up and documents self-hosted Twenty inside your own infrastructure, whether that is your cloud account, a data center or an air-gapped network. Most engagements run under a fixed scope that lists the deliverables, the timeline and the responsibilities of each party, agreed in writing before any work starts. For a HubSpot move, that scope usually covers the Twenty deployment itself, the import pipeline for companies, people, opportunities and notes, the object and field mapping, the pipeline and view rebuild, the workflow and email sync setup, role-based permissions, and the handover documentation. Ongoing support, upgrades and continuous testing can follow under a separate retainer if your team wants them.

DeployOpen does not publish a price list. A quote follows from the written scope, so the useful preparation happens before you ask for one. Give the scope writer a count of HubSpot objects and custom properties, the number of pipelines and stages in use, which workflows must be rebuilt, whether marketing email is moving or staying in HubSpot, and the hosting target you expect to use. Ask the vendor to separate one-time work (deployment, mapping, migration rehearsal, cutover, documentation) from recurring work (hosting, backups, upgrades, support), and to state which HubSpot export and import steps are your team's responsibility. Confirm whether the quote includes a test migration into a staging instance before the production cutover.

Two decisions shape the quote more than any other. The first is the Twenty edition and plan you need, because features such as SAML or OIDC single sign-on, row-level permissions and audit logs sit on paid plans, and the open source core is free to self-host. Check the current plan details on the pricing page before writing the scope. The second is hosting capacity: the self-hosting guide asks for at least 2 GB of RAM, and the scope should size the server for your user count and import volume rather than the minimum. Agree in writing who owns the database backups, how restores are tested, and who approves the cutover date.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.