CRM migration
Field-level mapping, validation, and rollback between Kylas Sales CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Kylas Sales CRM
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Kylas Sales CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Kylas Sales CRM and Odoo CRM have fundamentally different data models around prospects and pipelines. Kylas treats Leads as a distinct pre-conversion object with scoring and source tracking, while Odoo's CRM module uses a crm_lead model that covers both leads and opportunities without a forced split. We resolve this during scoping by mapping Kylas Leads with status 'converted' to Odoo crm_lead records in the pipeline stage, and Kylas Leads with status 'open' to Odoo crm_lead in the New state. Kylas pipeline stages are fully custom per pipeline; Odoo enforces a maximum of seven stages per pipeline, so we flag any Kylas pipeline exceeding that ceiling and recommend a stage consolidation plan before migration. Custom fields on Contacts, Companies, and Deals migrate with type preservation, but picklist value IDs in Kylas must be remapped to Odoo's stage and tag terminology. Odoo's XML-based field definitions mean custom field creation happens via configuration before data loads. Workflow automations, Smart Lists, and saved reports cannot migrate from Kylas; we deliver a written inventory of each for the customer's admin to rebuild manually in Odoo.
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 Kylas Sales CRM object lands in Odoo CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Kylas Sales CRM
Lead
Odoo CRM
crm.lead
1:1Kylas Lead records map to Odoo crm_lead. The Kylas lead_score and lead_source fields transfer to crm_lead's x_studio_lead_score and source_id (linked to crm.lead.lost_reason or crm.lead.tag.rel). Kylas Leads with status 'converted' land in Odoo's crm_lead with stage set to the corresponding pipeline stage equivalent; Kylas Leads with status 'open' land in Odoo's New or Qualified stage. We preserve Kylas lifecycle_stage as a custom Char field x_kylas_lifecycle_stage on crm_lead for audit. Kylas's lead_owner maps to crm_lead's user_id via email-matched User lookup.
Kylas Sales CRM
Contact
Odoo CRM
res.partner
1:1Kylas Contact records map to Odoo res.partner with partner_type = 'contact'. Kylas custom fields on Contact transfer to res.partner as custom columns via Odoo Studio field creation before import. Email uniqueness validation in Kylas is preserved via a SQL UNIQUE constraint on the email_normalized column in Odoo; duplicate emails across Kylas Contacts are flagged in the pre-migration audit for manual resolution. The Kylas lifecycle_stage value is stored in a custom Char field on res.partner.
Kylas Sales CRM
Company
Odoo CRM
res.partner (company type)
1:1Kylas Company records map to Odoo res.partner with partner_type = 'company' and child contact partners for each linked Contact. Industry classification from Kylas transfers to a custom selection field x_industry on res.partner. Multi-currency settings on Kylas Company map to the currency_id field on res.partner if Odoo's multi-company configuration is active. Company size maps to x_company_size as a selection field.
Kylas Sales CRM
Deal
Odoo CRM
crm.lead (sale pipeline)
1:1Kylas Deal records map to Odoo crm_lead in the sale pipeline. Kylas deal_value maps to crm_lead's planned_revenue. Expected close date maps to date_deadline. Owner assignment maps to user_id via email resolution. Kylas pipeline stage maps to Odoo stage_id; see Pipeline Stage mapping for detail on the seven-stage ceiling and consolidation logic.
Kylas Sales CRM
Pipeline
Odoo CRM
crm.lead (pipeline and stage)
lossyKylas pipeline names map to Odoo crm.lead.pipeline records. Odoo CRM enforces a maximum of seven stages per pipeline. If a Kylas pipeline exceeds seven stages, we flag the surplus stages during scoping and recommend merging adjacent stages (e.g., combining Negotiation and Proposal into a single Proposal stage) before migration. Stage probability percentages from Kylas transfer to Odoo stage probability fields. The mapping document is reviewed and approved by the customer before any stage consolidation is applied.
Kylas Sales CRM
Custom Field
Odoo CRM
ir.model.fields (custom)
lossyKylas custom fields on any object are exported with field type, picklist value IDs, and current values. We pre-create corresponding fields in Odoo via Studio (for simple types) or via XML data migration script (for relational, monetary, or computed fields) before any record data is written. Picklist value ID remapping is required because Kylas uses integer picklist IDs while Odoo selection fields use string keys. We generate a picklist translation table during the pre-migration audit and apply it during the transform phase.
Kylas Sales CRM
Activity (Task, Call, Note, Meeting)
Odoo CRM
crm.lead (activities)
1:1Kylas activity records (Tasks, Calls, Notes, Meetings) attach to their parent record (Lead, Contact, Deal, Company) via Odoo's mail.message and crm.lead.activity model. Activity timestamps and owner assignments are preserved. Kylas field-sales check-in activities may not have a direct Odoo equivalent; we map them to generic crm.lead.activity records with activity_type set to 'other' and the original check-in notes stored in the activity note field for manual review post-migration.
Kylas Sales CRM
Document
Odoo CRM
ir.attachment
1:1Kylas document blobs export as binary files with parent record association metadata. We map each document to Odoo ir.attachment linked to the corresponding res.partner or crm.lead record via res_model and res_id. Very large document stores exceeding 5 GB total may require batched import with rescheduling between batches to avoid Odoo's worker timeout thresholds.
Kylas Sales CRM
Tag
Odoo CRM
crm.lead.tag
1:1Kylas tag vocabulary (across all objects) exports as a unified tag list. We import tags into Odoo crm.lead.tag, then apply crm.lead.tag.rel entries to the corresponding crm_lead records during the Deal migration phase. Duplicate tag names from different Kylas objects are deduplicated and unified into a single Odoo tag vocabulary.
Kylas Sales CRM
User (Owner)
Odoo CRM
res.users
1:1Kylas user records (name, email, role, profile) export and map to Odoo res.users via email lookup. Inactive Kylas users are created as Odoo users with active=False. The customer's Odoo admin provisions the actual Odoo users (email, password, access rights) before the production migration runs. Owner assignments on Kylas Deals and Leads resolve to Odoo user_id at migration time via the email match table.
Kylas Sales CRM
Smart List
Odoo CRM
ir.filters
1:1Kylas Smart Lists are dynamic saved searches with query-based membership that does not produce a persistent record set. We export the Smart List filter criteria (field names, operators, values) as a documented inventory for manual recreation in Odoo as ir.filters. The records within each Smart List migrate as standard filtered exports against the base objects (Contact, Lead, Deal). Smart List recreation is out of scope for the data migration and is listed as a post-migration admin task.
Kylas Sales CRM
Workflow Automation
Odoo CRM
Base automation / server action
1:1Kylas workflow automation rules (triggers, conditions, action sequences) are not exposed via the Kylas export API. We deliver a written inventory of every active Kylas automation documenting trigger type, conditions, and action sequence with a recommended Odoo Studio or server action equivalent. The customer's Odoo admin or an Odoo implementation partner rebuilds the automations post-migration. This is a platform-level restriction and applies regardless of migration tooling choice.
| Kylas Sales CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | crm.lead1:1 | Fully supported | |
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Deal | crm.lead (sale pipeline)1:1 | Fully supported | |
| Pipeline | crm.lead (pipeline and stage)lossy | Fully supported | |
| Custom Field | ir.model.fields (custom)lossy | Fully supported | |
| Activity (Task, Call, Note, Meeting) | crm.lead (activities)1:1 | Fully supported | |
| Document | ir.attachment1:1 | Fully supported | |
| Tag | crm.lead.tag1:1 | Fully supported | |
| User (Owner) | res.users1:1 | Fully supported | |
| Smart List | ir.filters1:1 | Fully supported | |
| Workflow Automation | Base automation / server action1:1 | 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.
Kylas Sales CRM gotchas
Record storage caps gate migration scope
Smart List filter criteria are non-exportable
Workflow automation rules cannot be transferred
API lacks publicly documented rate limits
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Discovery and pipeline audit
We audit the Kylas account across plan tier, total record count per object, pipeline count and stage count per pipeline, active workflow count, Smart List count, custom field inventory, and activity record volume. We cross-reference this against the customer's Odoo hosting plan (Online, Odoo.sh, or on-premise) and storage allowance. The discovery output is a written migration scope document that includes the pipeline consolidation plan for any Kylas pipeline exceeding seven stages, the custom field creation order, and the picklist translation table. This phase typically takes five to seven business days.
Schema preparation in Odoo
We create all custom fields in Odoo via Studio or XML data migration script before any record import. This includes custom Char, Integer, Float, Date, Selection, and Many2one fields on crm.lead and res.partner. Picklist value translation tables are loaded as Odoo Selection field options. Pipeline and stage records are created in Odoo CRM with probability percentages matching Kylas. The schema is validated in a staging environment or a clean Odoo database instance before production migration begins. This phase typically takes three to five business days.
Sandbox migration and reconciliation
We run a full migration into the customer's Odoo staging database using production-like data volume. The customer's admin reviews record counts per object, spot-checks ten to fifteen records per object for field-level accuracy, and confirms that pipeline stage assignments match the Kylas source. Any mapping corrections, stage consolidation adjustments, or picklist translation fixes are applied here before the production migration. This phase typically takes five to seven business days.
Owner reconciliation and user provisioning
We extract every distinct Kylas user referenced on Lead, Contact, Deal, and Activity records and match by email against the Odoo res.users table. Users without a matching Odoo account go to a reconciliation queue for the customer's admin to provision. The admin also sets Odoo access rights (salesperson, manager, admin) per user during this phase. Migration cannot proceed to production until all owner lookups are resolved because OwnerId references are required on crm.lead and res.partner records.
Production migration in dependency order
We run production migration in record-dependency order: res.partner records (Companies first, then Contacts linked to Companies), crm.lead records (Leads and Deals in pipeline order), tag vocabulary and tag assignments, custom field values, activity history (Tasks, Calls, Meetings, Notes via Odoo JSON-RPC or CSV import with chunking), and document attachments last. Each phase emits a row-count reconciliation report before the next phase begins. We throttle API calls and monitor for 429 responses using exponential backoff. This phase typically takes five to ten business days depending on total record volume.
Cutover, validation, and automation handoff
We freeze Kylas write access during the cutover window, run a final delta migration of any records modified during the migration window, and confirm that all crm.lead, res.partner, and activity records are present and accurate in Odoo. We deliver the automation inventory document listing every Kylas workflow and Smart List with recommended Odoo equivalents. We do not rebuild Kylas workflows as Odoo Studio automations or server actions inside the migration scope; that is a separate engagement or an internal admin task. We offer a five-business-day hypercare window for post-migration reconciliation issues.
Platform deep dives
Kylas Sales CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Kylas Sales CRM and Odoo CRM.
Object compatibility
1 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
Kylas Sales CRM: Not publicly documented.
Data volume sensitivity
Kylas Sales 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 Kylas Sales CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Kylas Sales CRM to Odoo 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 Kylas Sales CRM
Other ways to arrive at Odoo 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.