CRM migration

Migrate from KulaHub to Twenty CRM

Field-level mapping, validation, and rollback between KulaHub and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

KulaHub logo

KulaHub

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

90%

9 of 10

objects map 1:1 between KulaHub and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from KulaHub to Twenty CRM is a structural migration that must address three compounding challenges: KulaHub has no self-service bulk export and no public API documentation, so data extraction requires direct coordination with their support team and a pre-migration API probe to measure throughput. KulaHub also has no native Deals or Pipeline object, which means any deal-stage tracking must be re-created in Twenty as Opportunities with a custom stage set. And KulaHub stores GDPR unsubscribe preferences as undocumented contact flags that we carry into Twenty as custom People fields to preserve suppression lists. Twenty's CSV import requires custom fields to exist before data rows are uploaded, and the import order must follow Companies before People before Opportunities. We handle all three sequencing requirements and deliver a written workflow rebuild inventory for KulaHub automations and email campaign sequences that do not transfer as code.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

KulaHub logo

KulaHub

What's pushing teams away

  • API has no publicly accessible documentation or developer portal, making it difficult to build integrations or automate data flows without engaging KulaHub support directly.
  • No self-service bulk data export means customers needing to migrate out or audit their historical records must request assisted export, adding time and cost to any data project.
  • Restoration of accidentally deleted records costs £80 per hour with a one-hour minimum, and backups are retained for only 30 days, making data loss incidents expensive and time-sensitive to resolve.

Choosing

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How KulaHub objects map to Twenty CRM

Each row shows how a KulaHub object lands in Twenty CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.

Typical mapping — final map is confirmed during the sample migration step.

KulaHub

Contact

maps to

Twenty CRM

People

1:1
Fully supported

KulaHub Contacts map directly to Twenty People. Every KulaHub Contact property (name fields, email, phone, address, notes, tasks, documents) migrates as a typed People field. KulaHub GDPR unsubscribe flags and email preferences transfer as custom boolean fields on People so the new system respects existing suppression lists. Company affiliation in KulaHub maps to a Twenty People-Company link resolved after the Company import phase.

KulaHub

Company (embedded in Contact)

maps to

Twenty CRM

Company

1:1
Fully supported

KulaHub does not expose a separate Company or Account object; all business entities are stored as Contact records. We extract any contact records where company name is populated, deduplicate by domain and name, and load these as Twenty Company records before the People import so that the companyId relationship is satisfied at insert time.

KulaHub

Activity (calls, emails, meetings, system events)

maps to

Twenty CRM

Task / Event / Note

1:1
Fully supported

KulaHub activity logs are exported as a chronological time-series. Calls migrate as Twenty Task records with taskType=Call. Meetings migrate as Twenty Event records with startDateTime, endDateTime, and attendees preserved. General system events and notes migrate as Twenty Note records linked to the parent People or Company via the relationship ID. We load in date order to preserve the audit timeline and set the ActivityDate to the original KulaHub timestamp.

KulaHub

Task / Reminder

maps to

Twenty CRM

Task

1:1
Fully supported

KulaHub Tasks linked to contacts migrate as Twenty Tasks with Status, Priority, and due date preserved. Task assignment resolves the KulaHub owner reference to the corresponding Twenty Workspace Member by email match. Any KulaHub task with no matching user in Twenty goes to the reconciliation queue for the customer's admin to provision before the production import resumes.

KulaHub

Document / Attachment

maps to

Twenty CRM

Attachment via Note

1:1
Fully supported

KulaHub documents attached to contacts are extracted as binary blobs and re-associated with the corresponding Twenty People record via file attachment linkage. File name and original upload date transfer as metadata. We flag any file exceeding Twenty's size limit during discovery so the customer can decide whether to link via URL instead.

KulaHub

Email Campaign (history and templates)

maps to

Twenty CRM

Note on People / Campaign tracking

1:1
Fully supported

KulaHub campaign history including opens, clicks, and unsubscribe events migrates as Note records on the relevant People records with a type tag identifying it as campaign engagement data. GDPR unsubscribe preferences from campaign tracking are carried as typed boolean People fields to ensure the destination system respects suppression. We do not recreate email campaigns as sendable objects because Twenty does not include built-in email campaign management; campaign send capability requires a third-party email platform integration.

KulaHub

User

maps to

Twenty CRM

Workspace Member

1:1
Fully supported

KulaHub Users are exported first so owner and assignee references resolve correctly during subsequent record imports. We match KulaHub users to Twenty Workspace Members by email address. Any KulaHub user referenced in activities or tasks but not yet provisioned in Twenty is held in the reconciliation queue. Twenty requires members to accept their invitation and appear in the Members list before record imports that reference them can succeed.

KulaHub

Form Submission

maps to

Twenty CRM

Custom Fields on People

1:1
Fully supported

KulaHub captures website enquiries via forms linked to contact records. The form-field schema is not publicly documented. We request a sample export of form-submission data during discovery and map each key-value pair to a custom People field in Twenty's Data Model. Unmapped fields are held in a staging table and presented to the customer for manual mapping before the production migration run.

KulaHub

GDPR Preference Data

maps to

Twenty CRM

Custom Boolean Fields on People

lossy
Fully supported

KulaHub stores email unsubscribe states and GDPR preference flags per contact but the underlying data format is not documented. We export these flags as typed boolean custom fields on the People object in Twenty, preserving the original suppression state so the destination system can respect existing opt-outs without requiring re-consent. Email marketing to migrated contacts is disabled until the customer confirms the preference data migration is complete and verified.

KulaHub

Report (contact export and activity reports)

maps to

Twenty CRM

Note / Reference Document

1:1
Fully supported

KulaHub reports including the All Contacts export and activity reports are included in the migration scope as reference data. We extract these as CSV files and cross-reference record counts against migrated data to validate completeness. The report layouts themselves do not transfer; Twenty reporting is configured fresh using the migrated data as its source.

Gotchas + challenges

What specifically takes care here

Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.

KulaHub logo

KulaHub gotchas

High

API has no public documentation or developer portal

High

No self-service bulk export or documented rate limits

Medium

Deleted record restoration costs £80/hour with 30-day window

Medium

Contact form field schema is not publicly documented

Low

GDPR preference data portability not confirmed

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • KulaHub requires assisted export coordination

    KulaHub has no self-service bulk data export and no public API documentation or developer portal. We must work with customer-provided credentials and coordinate directly with KulaHub support to extract data for large migrations. There is no sandbox environment. This means the extraction phase adds a scheduling dependency outside our control, and we probe the API during discovery with a small batch of requests to measure response headers and status codes before committing to a migration timeline.

  • Twenty requires fields to exist before CSV import

    Twenty's CSV import creates records but not fields. Custom fields must be pre-created in Settings Data Model before any import file referencing them is uploaded. If a KulaHub contact property has no corresponding Twenty field, the import skips that column silently. We create all required custom fields during the schema design phase and validate that every KulaHub field in the export has a mapped Twenty field before the production migration begins.

  • Twenty import requires strict dependency ordering

    Twenty's documentation specifies that Companies must be imported before People, and People before Opportunities, because the one-side of a one-to-many relationship must exist before related records can reference it. KulaHub has no native Deals or Pipeline object, so any deal-stage data stored as a workaround in KulaHub must be reconstructed as Twenty Opportunities after the Company and People imports are validated. Skipping this order results in orphaned records with unresolved companyId and opportunityId lookups.

  • Twenty self-hosted version updates can blank the CRM

    GitHub issue #14705 documents cases where self-hosted Twenty instances show a largely blank CRM after version updates (for example, updating from 1.3.0 to 1.6.7). The database migrations complete without error but data does not display. We run migrations into a pre-update snapshot of the Twenty instance and verify all record counts and spot-checks before the production cutover. If the customer updates Twenty after migration, we recommend updating in a staging environment first and running a data validation pass afterward.

  • Many-to-many relationships do not import via CSV

    Twenty's CSV import does not support junction or many-to-many relations. KulaHub stores tags and categories as multi-checkbox contact properties, which are many-to-many relationships under the hood. We resolve these as multi-select custom fields on the People object during schema design. If the customer uses KulaHub tags for complex segmentation, we document the tag list as a static resource and present options for recreating segmentation logic in Twenty using filtered views and custom fields.

Migration approach

Six steps for a successful KulaHub to Twenty CRM data migration

  1. Discovery and KulaHub export coordination

    We audit the KulaHub account for contact volume, activity record count, document attachments, user list, and any workaround structures for deal tracking. We initiate the assisted export workflow with KulaHub support using customer-provided credentials. During this window we probe the API with a small batch of requests to measure throughput, response structure, and any rate-limit headers, and request a sample export of form-submission data to document the field schema. The discovery output is a written migration scope confirming record counts, extraction timeline, and a mapping plan for every object type.

  2. Schema design and Twenty workspace preparation

    We configure the Twenty workspace before any data is loaded. This includes creating custom fields in Settings Data Model to cover every KulaHub contact property and GDPR flag, creating a Company object schema with domain-based dedupe, creating an Opportunity object with a stage set matching any deal-stage data reconstructed from KulaHub, and inviting all Workspace Members so that owner lookups resolve during import. Fields are created before import files are generated to ensure every column has a destination.

  3. Test migration into a staging environment

    We run a full migration into a Twenty staging workspace using production-like data volumes to validate field mappings, import ordering, and relationship resolution. We reconcile record counts (Contacts in KulaHub against People in Twenty, Companies extracted against Companies loaded, Activities counted against Tasks and Events), run 25-50 spot-checks on individual records, and verify that companyId and opportunityId lookups are resolved correctly. Any mapping corrections or missing fields are addressed here before production migration begins.

  4. Company extraction and import

    We extract all KulaHub contact records where a company name is populated, deduplicate by company name and domain, and load the resulting Company records into Twenty first. The domain field is set from the contact's email domain for automatic dedupe. Company is the one-side of the relationship and must load before any People or Opportunity records that reference it.

  5. People, GDPR preferences, and Activities import

    We load KulaHub People records in dependency order after Companies are confirmed. GDPR unsubscribe flags and email preferences are carried as typed boolean fields on each People record. Activity history (calls, emails, meetings, notes) is loaded as a chronological batch in date order with the original KulaHub timestamp preserved as ActivityDate. Documents and attachments are re-linked to their parent People records after the People load is validated. KulaHub form submissions are mapped from the discovered field schema to the corresponding Twenty custom People fields.

  6. Opportunity reconstruction (if deal data exists)

    If the customer has stored deal-stage data in KulaHub using custom fields or workaround structures, we reconstruct this as Twenty Opportunities during this phase. We map the source deal stage values to Twenty Opportunity stage names, set the linked Company and People references, and load Opportunities after all Company and People records are validated. This phase is omitted if KulaHub contains no deal data, which is the default for a standard KulaHub installation.

  7. Cutover, delta migration, and workflow handoff

    We freeze KulaHub writes, run a final delta migration of any records created or modified during the migration window, validate record counts against the pre-migration baseline, and switch the team to Twenty as the system of record. We deliver a written inventory of every KulaHub automation, email sequence, and campaign workflow that does not migrate as code, with a brief description of each and its recommended Twenty equivalent for the customer's admin to rebuild. We support a one-week post-cutover reconciliation window.

Platform deep dives

Context on both ends of the pair

KulaHub logo

KulaHub

Source

Strengths

  • Unified CRM, email marketing, and visitor tracking in a single subscription without needing separate tools.
  • Real-time dashboards show sales and marketing activity at a glance from one shared workspace.
  • UK-based support team with direct phone line reduces time-to-resolution for configuration questions.
  • GDPR email preference and unsubscribe management features are built in, supporting EU data compliance obligations.
  • Contact records store notes, documents, and tasks in one place with team-wide visibility.

Weaknesses

  • No publicly accessible API documentation or developer portal complicates integration planning and automation.
  • No self-service bulk data export means data extraction for migration or backup relies on KulaHub-assisted processes.
  • REST API rate limits are not published, making it difficult to estimate migration throughput and schedule large data moves.
  • Restoration of deleted records costs £80 per hour with a 30-day backup window, creating a narrow and expensive recovery window.
  • Pricing tiers beyond the base per-user rate are not published, making total cost of ownership unclear for larger teams.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across KulaHub and Twenty CRM.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    KulaHub: Not publicly documented.

  • Data volume sensitivity

    B

    KulaHub doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your KulaHub to Twenty CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about KulaHub to Twenty CRM data migrations

Answers to the questions buyers ask most during KulaHub to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your KulaHub to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Migrations under 10,000 contacts with no deal-stage data and clean form-submission schemas land between three and five weeks. Migrations with large activity histories (over 100,000 engagement records), undocumented form fields requiring manual mapping, or customer-built deal-tracking workarounds requiring reconstruction move to seven to eleven weeks because of API probe time, data reconstruction work, and multiple test-pass rounds. The KulaHub assisted export coordination adds an external dependency that can extend the extraction phase by one to three weeks depending on KulaHub support responsiveness.

Adjacent paths

Related migrations to explore

Ready when you are

Move from KulaHub.
Land in Twenty CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day