CRM migration
Field-level mapping, validation, and rollback between Krayin CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Krayin CRM
Source
Twenty CRM
Destination
Compatibility
8 of 11
objects map 1:1 between Krayin CRM and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Krayin CRM to Twenty CRM is a move from a PHP/Laravel open-source CRM to a TypeScript/Next.js open-source CRM, and the destination carries different object naming, a different standard field model, and a different API paradigm. Krayin's MIT license and self-hosting model produces zero software cost but accumulates VPS, maintenance, and developer-hour overhead. Twenty's AGPL-3.0 license and modern stack appeal to teams already in the JavaScript ecosystem who want a CRM built for extensibility rather than a Laravel monolith. We migrate Leads and Persons to Twenty's People object using a stage-based split, Companies to Twenty's Company object, Deals to Opportunities, and Activity records (tasks, calls, meetings, notes) as Tasks or Notes. We resolve Krayin's custom attribute fields via a direct database query fallback when the REST API returns incomplete data. Krayin Workflows and file attachments cannot migrate programmatically; we document them for manual rebuild and re-upload post-migration. Twenty's sparse standard field set means the customer must pre-create custom fields in Settings → Data Model before any CSV import runs, or our scripts must use the GraphQL API to create fields dynamically during setup. We do not migrate Workflows, automations, sequences, or reports as code. Those are out-of-scope deliverables for which we provide written inventories for the customer's admin team.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Krayin CRM 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.
Krayin CRM
Lead
Twenty CRM
People
1:1Krayin Leads map directly to Twenty People. We use email as the primary dedupe key. If a Person record with the same email already exists in Twenty from a prior Persons migration, we flag the duplicate for the customer to resolve. Krayin lead status, source, and score custom attributes migrate to Twenty People custom fields that must be pre-created in Settings → Data Model. Krayin lead-to-person conversion history does not carry over; we treat all Krayin Leads as open records requiring a fresh stage assignment in Twenty.
Krayin CRM
Person
Twenty CRM
People
1:1Krayin Persons map to Twenty People. Name, email, phone, address, job title, and department migrate directly. Custom attribute fields on Person objects (dropdowns, multi-select, date fields) require a direct database query to Krayin's custom_attributes table because the REST API does not fully expose all attribute field types. We map the custom field values to Twenty People custom fields, creating the fields via the Twenty GraphQL API during setup if they do not already exist. Email is the dedupe key across the Persons load.
Krayin CRM
Company
Twenty CRM
Company
1:1Krayin Companies map to Twenty Company. Company name, domain, address, phone, and industry (if populated in Krayin) migrate directly. We create Companies in Twenty first in the load order so that Company ID is available for Person association (Krayin Persons are linked to a Company by organization_id). Any Person records without a valid Krayin organization_id map to a 'No Company' placeholder in Twenty and are flagged for manual reassignment post-migration.
Krayin CRM
Deal
Twenty CRM
Opportunity
1:1Krayin Deals map to Twenty Opportunity. Deal name becomes Opportunity name, amount maps directly, expected close date maps to closeDate, and Krayin stage_id maps to a Twenty Opportunity status value that we create during setup. Owner (Krayin user_id) maps to the Twenty Member with the matching email. Krayin Deal-to-Person and Deal-to-Company associations migrate as Opportunity-to-People and Opportunity-to-Company links in Twenty via the relationship API. Custom deal attributes migrate to Opportunity custom fields via direct DB query where the API is incomplete.
Krayin CRM
Pipeline
Twenty CRM
Opportunity status + record type
lossyKrayin Pipelines (custom stage sequences per deal type) map to Twenty Opportunity status values within a single Opportunity object. We create status values matching Krayin stage names and probabilities during the Twenty workspace setup phase via the GraphQL API. If Krayin uses multiple pipelines with different stage sets (common in multi-line-of-business Krayin deployments), we create Twenty Opportunity status values scoped by pipeline name prefix. Stage transition rules and automation triggers from Krayin cannot migrate; we document each pipeline's stage sequence as a written deliverable for the customer's admin to rebuild in Twenty manually.
Krayin CRM
Product
Twenty CRM
Product
1:1Krayin Products map to Twenty Product. SKU, name, price, description, and inventory quantities migrate directly. Products must be created before any Deals/Opportunities that reference them so that product associations can be resolved at import time. Krayin product categories map to Twenty Product custom fields or a category field we create via GraphQL if the standard Product object lacks one.
Krayin CRM
Quote
Twenty CRM
Note (attached to Opportunity)
1:1Krayin Quotes do not have a direct Twenty equivalent; Twenty does not include a native Quotes object as of 2026. We migrate Quote records as Note objects attached to the related Opportunity, preserving line items as a structured text body in the Note. The customer rebuilds quoting capability in Twenty using custom objects or a third-party quoting tool post-migration. If the customer requires a full Quote-to-OpportunityLineItem model, we scope a custom object build as a separate engagement.
Krayin CRM
Activity (Task, Call, Meeting)
Twenty CRM
Task or Note
1:1Krayin Activities (Tasks, Calls, Meetings) map to Twenty Tasks. Call disposition and duration migrate as custom Task fields; Meeting start and end times map to Task startDate and dueDate fields. Activity records are associated to their parent Krayin record (Lead, Person, Deal) via the Twenty relationship API by resolving the target People or Opportunity ID. We preserve the original Krayin activity timestamp as a custom field for audit ordering. Activity types that have no clear Twenty analog (e.g., Krayin's specific event subtypes) map to a generic Task with a type custom field preserving the original value.
Krayin CRM
User
Twenty CRM
Member
1:1Krayin Users map to Twenty Members. We match by email address. Any Krayin User referenced on a Deal or Activity record must have a matching Twenty Member before that record's import can proceed; we enforce this dependency in the load order. Role and permission sets from Krayin require manual rebuild in Twenty because Twenty's permission model uses a different structure. We export the Krayin role assignments as a written report for the admin to reconfigure.
Krayin CRM
Tag
Twenty CRM
Tag
lossyKrayin tags on Leads, Persons, and Deals migrate to Twenty Tag records. Tags are stored as string arrays in Krayin and must map to Twenty's Tag object. We create Twenty Tags during migration and associate them to People and Opportunities via the Tag API. If a Krayin tag has no equivalent in Twenty's tag vocabulary, we preserve it as a custom People or Opportunity multi-select field. Tag taxonomy cleanup is recommended during scoping: unused tags with fewer than 10 associated records are flagged for exclusion.
Krayin CRM
Custom Attribute
Twenty CRM
Custom field
lossyKrayin custom attributes on Leads, Persons, Companies, Deals, and Products require a direct database query to Krayin's custom_attributes table because the REST API does not expose all custom attribute types (particularly dropdowns, multi-select, and date fields). We query the database directly, extract the attribute definitions and values, then create the corresponding Twenty custom fields via GraphQL before importing the values. This adds a discovery step to the migration timeline but ensures complete field coverage. We flag any Krayin attribute types with no Twenty equivalent (e.g., Krayin-specific field types) as requiring manual post-migration field creation.
| Krayin CRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Lead | People1:1 | Fully supported | |
| Person | People1:1 | Fully supported | |
| Company | Company1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Pipeline | Opportunity status + record typelossy | Fully supported | |
| Product | Product1:1 | Fully supported | |
| Quote | Note (attached to Opportunity)1:1 | Fully supported | |
| Activity (Task, Call, Meeting) | Task or Note1:1 | Fully supported | |
| User | Member1:1 | Fully supported | |
| Tag | Taglossy | Fully supported | |
| Custom Attribute | Custom fieldlossy | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Krayin CRM gotchas
Attachments stored on filesystem, not accessible via API
Workflows have no export mechanism
No publicly documented API rate limits
Self-hosting cost illusion masks true TCO
Custom attribute fields not always exposed via API
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
Discovery and data audit
We audit the source Krayin instance across record volumes (Leads, Persons, Companies, Deals, Activities, Products, Quotes, Tags), active custom attribute definitions (via REST API and direct database query), active pipeline count and stage definitions, active workflows, user count, and attachment inventory. We also probe for any Krayin commercial extensions (Webkul SaaS Subscription, Multi-Tenant) that may add custom schema. The discovery output is a written migration scope with record counts per object, a list of custom attributes requiring DB-level extraction, and a flag for any Krayin instance where direct database access is restricted. We also confirm that Twenty workspace is provisioned and accessible via GraphQL API.
Twenty workspace setup and field creation
We create all required custom fields in Twenty via the GraphQL API before any data import begins. This includes custom fields on People (matching Krayin custom attributes on Leads and Persons), custom fields on Company (matching Krayin custom attributes on Organizations), and custom fields on Opportunity (matching Krayin custom attributes on Deals and the stage-probability mapping). We invite all Krayin Users as Twenty Members during this phase so that Owner lookups can be resolved during the subsequent import phases. This step is the most common point of failure when skipped: imports run but fields are empty because Twenty requires fields to exist before data can populate them.
Test migration into staging
We run a full migration into a Twenty staging or demo workspace using a representative data subset (typically the 30 most recent Leads, Persons, Companies, and Deals plus 100 activity records). The customer reconciles record counts, spot-checks field mapping for 20-30 records, and validates that tag associations, deal stage assignments, and owner assignments are correct. Any mapping corrections—particularly around custom attribute types, date format normalization, and phone number formatting—happen in this phase. We do not run production migration until the staging reconciliation is signed off.
Record migration in dependency order
We run the production migration in the correct relational order: (1) Members (Twenty Users, resolved by email from Krayin Users), (2) Companies (from Krayin Organizations, first so IDs are available for Person association), (3) People (from Krayin Leads and Persons, with Krayin organization_id resolved to the new Twenty Company ID), (4) Opportunities (from Krayin Deals, with Company ID and Member ID resolved), (5) Products (from Krayin Products, before any Opportunity associations that reference them), (6) Activities (Tasks and Notes via batch API calls, with parent People and Opportunity IDs resolved), (7) Tags (created and associated last), (8) Custom attributes via direct DB query for any fields not populated via REST API. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover and delta sync
We freeze Krayin write access during the cutover window (typically a weekend or low-activity period). We run a final delta migration of any records created or modified in Krayin since the last full sync. We deliver an attachment inventory listing (which records had attachments, file sizes, and paths in Krayin's storage directory) so the customer can download and re-upload manually post-migration. We deliver the Workflow inventory document to the customer's admin team with a rebuild guide and recommended Twenty equivalent for each automation. We validate Twenty record counts match the expected migration scope and hand off a reconciliation report.
Post-migration support window
We provide a one-week hypercare window following cutover during which we resolve any data integrity issues raised by the customer's team. This includes re-importing any records that failed due to validation rule conflicts, correcting owner assignments, and re-running tag associations. We do not rebuild Krayin Workflows as Twenty automations, re-upload attachments, or provide training on Twenty's interface; those are separate workstreams. We close the engagement with a final migration report summarizing record counts, any gaps (attachments, workflows, unsupported field types), and recommended next steps for the admin team.
Platform deep dives
Krayin CRM
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Krayin CRM and Twenty CRM.
Object compatibility
2 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Krayin CRM: Not publicly documented.
Data volume sensitivity
Krayin CRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Krayin CRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Krayin CRM to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Krayin CRM
Other ways to arrive at Twenty CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.