CRM migration
Field-level mapping, validation, and rollback between Insightly CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Insightly CRM
Source
Odoo CRM
Destination
Compatibility
11 of 14
objects map 1:1 between Insightly CRM and Odoo CRM.
Complexity
CModerate
Timeline
4-6 weeks
Overview
Insightly CRM and Odoo CRM have fundamentally different relationship models that make this migration structural rather than a simple record copy. Insightly uses explicit link records to associate Contacts with Organizations via dedicated endpoints; Odoo uses a partner-based model where company records (res.partner in company mode) are linked to contact records via a partner_id field. We sequence the migration as Organizations first, then Contacts, then link relationships reconstructed through the partner_id reference, which avoids orphaned Contact records in Odoo. Insightly's XML export bypasses custom fields entirely, so we extract all data including custom field values via Insightly's REST API using a FIELD_NAME lookup table we build at the start of every engagement. We do not migrate Insightly Workflow Automations as Odoo Actions because the trigger models differ; we deliver a written inventory of every automation with a recommended Odoo Actions and Automations equivalent for the customer's admin to rebuild post-migration.
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 Insightly 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.
Insightly CRM
Organization
Odoo CRM
res.partner (company mode)
1:1Insightly Organizations map to Odoo res.partner records in company mode. We import Organizations first so that the partner ID is available as a parent reference when importing Contacts. Odoo requires the company partner to exist before child contact records can be linked. The ORGANIZATION_NAME field in Insightly becomes the partner's display name; address fields map to street, street2, city, state_id, zip, country_id.
Insightly CRM
Contact
Odoo CRM
res.partner (contact mode)
1:1Insightly Contacts map to Odoo res.partner records in contact mode. We import Contacts after Organizations, then reconstruct the Contact-to-Organization link by setting the partner_id field on each contact record to reference the parent Organization's res.partner ID. This replaces Insightly's explicit link records. Email, phone, title, and custom fields migrate as standard partner fields or custom columns on res.partner.
Insightly CRM
Lead
Odoo CRM
crm.lead
lossyInsightly Leads do not have a direct Odoo equivalent because Odoo's default CRM module does not include a separate Leads object. Leads are modeled as crm.lead records in the pipeline. We create a dedicated Kanban stage (or stages) in Odoo to receive Insightly Leads that have not been converted, preserving the Lead status in a custom stage name. We flag this as a configuration decision during scoping: the customer chooses whether converted Leads map directly to Opportunities or flow through a separate lead-stage pipeline.
Insightly CRM
Opportunity
Odoo CRM
crm.lead
1:1Insightly Opportunities map to Odoo crm.lead records in the pipeline. The Opportunity name becomes the lead name, the monetary value maps to expected_revenue, and the stage maps to a Kanban stage column. We configure the Odoo pipeline stages in Odoo Studio before migration using the exact stage names from Insightly's pipeline configuration, then map probability values to stage probability fields.
Insightly CRM
Pipeline Stage
Odoo CRM
Kanban Stage
lossyInsightly pipeline stages are custom-named strings. We create corresponding Kanban stage columns in Odoo CRM Pipeline configuration (accessible via Settings > CRM > Stages). Each stage gets a sequence number and probability percentage matching the Insightly probability values. Stage mapping is applied during Opportunity import so that every crm.lead lands in the correct pipeline column.
Insightly CRM
Task
Odoo CRM
project.task
1:1Insightly Tasks map to Odoo project.task records. Tasks are imported after Opportunities to allow WhatId resolution (linking tasks to the originating Opportunity via the project_id or crm_lead_id field). Task status values (Not Started, In Progress, Completed, Deferred, Waiting) map to Odoo task stage columns that we configure in the project settings. The task priority and due date migrate as standard fields.
Insightly CRM
Note (Comment)
Odoo CRM
mail.message
1:1Insightly Notes migrate to Odoo mail.message records attached to the parent record (res.partner for Contacts/Organizations, crm.lead for Opportunities, project.task for Tasks). We use Odoo's message_post method to create note-style messages, preserving the note body, author name, and creation timestamp. The link between a Note and its parent record is reconstructed via the res_model and res_id fields on mail.message.
Insightly CRM
Project
Odoo CRM
project.project
1:1Insightly Projects map to Odoo project.project records. If the customer uses Odoo Project module, we import project headers first, then link associated tasks to the correct project. Project status (Active, Completed, Archived) maps to Odoo's project state. Custom fields on Insightly Projects are created as custom columns on project.project in Odoo Studio before import.
Insightly CRM
Tag
Odoo CRM
crm.tag
1:1Insightly Tags are flat string labels on Contacts, Organizations, Opportunities, and Projects. Odoo CRM has a crm.tag model that applies to crm.lead records. We export all distinct tag strings, create crm.tag records in Odoo, then apply tags to the corresponding Contacts (via res.partner.category_id) and Opportunities (via crm.lead.tag_ids). Tags that apply to both object types are stored as plain text in a custom field for cross-object reference.
Insightly CRM
Custom Field
Odoo CRM
Custom Column on target model
lossyInsightly custom fields require a FIELD_NAME lookup via /CustomFields/{objectName} before any write operation. We retrieve all custom field metadata at the start of the migration, build a FIELD_NAME-to-field_id reference table, and use it for all writes. For each custom field, we create a corresponding custom column in Odoo Studio on the appropriate model (res.partner, crm.lead, project.task, project.project) before importing data. Field types are mapped: Insightly text to char, date to date, dropdown to selection, checkbox to boolean, number to float.
Insightly CRM
Custom Object
Odoo CRM
Custom Model (ir.model)
1:1Insightly Custom Objects with user-defined fields map to Odoo custom models created via the Technical menu or Odoo Studio. We create the custom model with matching field definitions (field type, required, index), then import the custom object records via the ORM API with the custom model's name as the model reference. Any lookup relationships within the custom object are recreated as many2one fields pointing to the appropriate Odoo model.
Insightly CRM
Link Record (Contact-to-Organization)
Odoo CRM
res.partner partner_id field
1:1Insightly link records (Contact-to-Organization associations) are exported separately from the primary Contact and Organization records. Since we import Organizations first, then Contacts, we reconstruct each link by setting the partner_id field on the contact's res.partner record to the parent's ID. This is the key transformation for this migration: Insightly's explicit AddLink API becomes Odoo's native parent-record reference. We sequence the import as Organizations → Contacts → Link reconstruction to avoid orphaned contacts.
Insightly CRM
Engagement: Email
Odoo CRM
mail.message
1:1Insightly email engagements (sent via Insightly's email tracking) map to Odoo mail.message records attached to the parent record (Contact or Opportunity). The email body, subject, and timestamp migrate. Email tracking metadata (opens, clicks) is stored as Insightly-specific fields that have no Odoo CRM equivalent and are noted in the migration summary for the customer's admin.
Insightly CRM
Engagement: Call
Odoo CRM
mail.activity (type = call)
1:1Insightly call engagements map to Odoo mail.activity records with activity_type_id set to the built-in Call type. Call duration, disposition, and notes migrate to custom activity fields we create in Odoo Studio before import. Activities are linked to the parent record (Contact, Organization, or Opportunity) via the res_model and res_id fields on mail.activity.
| Insightly CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Organization | res.partner (company mode)1:1 | Fully supported | |
| Contact | res.partner (contact mode)1:1 | Fully supported | |
| Lead | crm.leadlossy | Fully supported | |
| Opportunity | crm.lead1:1 | Fully supported | |
| Pipeline Stage | Kanban Stagelossy | Fully supported | |
| Task | project.task1:1 | Fully supported | |
| Note (Comment) | mail.message1:1 | Fully supported | |
| Project | project.project1:1 | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| Custom Field | Custom Column on target modellossy | Fully supported | |
| Custom Object | Custom Model (ir.model)1:1 | Fully supported | |
| Link Record (Contact-to-Organization) | res.partner partner_id field1:1 | Fully supported | |
| Engagement: Email | mail.message1:1 | Fully supported | |
| Engagement: Call | mail.activity (type = call)1: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.
Insightly CRM gotchas
Free plan record cap applies to all Insightly objects
API rate limits vary by plan and reset daily
Custom fields require FIELD_NAME lookup before writes
XML export only captures default fields for migrations out
Link relationships must be rebuilt via dedicated endpoints
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 schema inventory
We audit the source Insightly account across all object types (Organizations, Contacts, Leads, Opportunities, Projects, Tasks, Notes, Custom Objects), retrieve the full custom field metadata via /CustomFields/{objectName} for each object, export all active Workflow Automations for the rebuild inventory, and count distinct link records (Contact-to-Organization associations). We pair this with a review of the Odoo destination instance: which apps are installed (CRM, Project, Sales), whether Odoo Studio is accessible on the target tier, and whether the customer uses multi-company mode. The discovery output is a written migration scope document listing all objects, custom fields, link counts, and a schema pre-setup checklist for the customer's Odoo admin.
Odoo Studio schema pre-setup
Before any data import, we create all custom field definitions in Odoo Studio for each model that will receive Insightly data (res.partner, crm.lead, project.task, project.project). We create Kanban pipeline stages in CRM > Pipeline > Stages to match Insightly's pipeline stage names and probability percentages. We configure the crm.lead model to receive either a single unified pipeline or a lead-stage and opportunity-stage split based on the customer's scoping decision. Each stage is assigned a sequence number that determines its position in the Kanban column order.
Organizations first and Contact link reconstruction design
We import Insightly Organizations as Odoo res.partner records in company mode first. The ORGANIZATION_NAME field becomes the partner's name; address, phone, and website fields map to standard res.partner fields. We then import Contacts with the partner_id field set to the parent Organization's newly created res.partner ID, reconstructing the Insightly explicit link relationship as a native Odoo parent-child reference. Any Contact without a valid Organization link is placed in a reconciliation queue for the customer's admin to resolve before the Opportunities phase.
Opportunity, Project, and Task import
With Organizations and Contacts validated, we import Insightly Opportunities as Odoo crm.lead records. Each lead is assigned to the correct Kanban stage column (mapped from Insightly pipeline stage names), the expected_revenue is set from the Opportunity monetary value, and the partner_id links to the associated Organization. Projects import as project.project records, and Tasks import as project.task records linked to their parent Project or to an Opportunity via the crm_lead_id field. Custom fields on each model are populated using the FIELD_NAME lookup table built during discovery.
Activity history import via Odoo ORM
We import Insightly engagement history (calls, emails, meetings, notes) as Odoo mail.message and mail.activity records. Each record is linked to its parent record (Contact, Opportunity, or Task) via res_model and res_id. We use Odoo's ORM API with batch writes and exponential backoff on RPC rate limit responses. Activity timestamps are preserved as write_date on mail.message to maintain the historical timeline order.
Cutover, validation, and Workflow handoff
We freeze Insightly writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver a reconciliation report comparing record counts per object between the Insightly source and the Odoo destination. We deliver the Workflow and Automation rebuild inventory document listing every active Insightly Workflow with its trigger, conditions, and recommended Odoo Actions and Automations equivalent. We do not rebuild Insightly Workflows as Odoo automations inside the migration scope.
Platform deep dives
Insightly CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Insightly CRM and Odoo 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
Insightly CRM: 10 requests per second; daily limit varies by plan (starting at 1,000 requests/day for free plan).
Data volume sensitivity
Insightly 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 Insightly CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Insightly 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 Insightly 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.