CRM migration
Field-level mapping, validation, and rollback between Insightly Marketing and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Insightly Marketing
Source
Odoo CRM
Destination
Compatibility
7 of 12
objects map 1:1 between Insightly Marketing and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Insightly Marketing to Odoo CRM is a schema translation, not a direct record copy. Insightly separates Leads and Contacts as distinct objects while maintaining Organizations as the company record; Odoo CRM uses a Lead object with a Convert-to-Opportunity action, storing person records under a Partner model. We resolve the Lead versus Contact distinction at migration time using Insightly lifecycle stage, map Organizations directly to Odoo Partner records, and preserve the Organization-to-Contact relationship through Odoo's contact_ids field on the Partner. Projects migrate to Odoo Project with task lists and milestones. Historical timestamps and custom field values transfer to typed Odoo fields. We do not migrate Insightly workflow rules or email templates as code; we deliver a written inventory mapping each Insightly automation trigger to an Odoo Action Rule 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 Marketing 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 Marketing
Contact
Odoo CRM
Lead
1:1Insightly Contact maps to Odoo CRM Lead. We populate the Lead's partner_name (company name) with the parent Organization's name, contact_name with the person's full name, email from CONTACT_FIELD_EMAIL, and phone from CONTACT_FIELD_PHONE. The original Insightly lifecycle stage migrates to a custom Char field x_insightly_lifecycle_stage for audit. Contact ownership (insightly_owner_id) maps to Odoo user_id on Lead. Tags on Contact migrate to Odoo tag_ids via Odoo's Tags app, or to a custom Char field if the customer prefers a single-select reference.
Insightly Marketing
Organization
Odoo CRM
Partner
1:1Insightly Organization maps directly to Odoo res.partner with is_company=True. The ORGANIZATION_NAME field becomes partner_name, WEBSITE becomes website, INDUSTRY maps to industry_id if the customer has configured Odoo's industry taxonomy. Billing address and shipping address from Organization locations become Odoo's address fields (street, street2, city, state_id, zip, country_id). Organization CUSTOM_FIELD values map to custom Char, Integer, or Selection fields on Partner.
Insightly Marketing
Organization
Odoo CRM
Partner.contact_ids
1:manyInsightly Contacts attached to an Organization migrate as Odoo Partner contact records under the Organization's Partner. The parent Organization becomes the Partner (is_company=True), and each Contact becomes a Partner record with parent_id pointing to the Organization Partner and contact_type=contact. This preserves the Organization-to-Contact hierarchy that Odoo uses for address and communication routing.
Insightly Marketing
Lead
Odoo CRM
Lead
1:1Insightly Lead object (separate from Contact) maps 1:1 to Odoo CRM Lead. LEAD_STATUS becomes x_insightly_lead_status on the Lead record. Lead source attribution (LEAD_SOURCE) maps to Odoo's medium_id or a custom field. Any lead-specific custom fields migrate as typed Odoo fields on the Lead.
Insightly Marketing
Opportunity
Odoo CRM
Opportunity
1:1Insightly Opportunity maps to Odoo CRM Opportunity. OPPORTUNITY_NAME becomes name, EXPECTED_VALUE becomes planned_revenue, PROBABILITY maps to x_probability (Odoo's standard probability is auto-calculated from stage, so we use a custom Float field). CLOSE_DATE becomes date_closed. STAGE_NAME maps to stage_id, but requires mapping against Odoo's existing stage values (New, Qualified, Proposition, Won, Lost) since Odoo uses a single pipeline.
Insightly Marketing
Opportunity Stage
Odoo CRM
Opportunity Stage
lossyInsightly pipeline stages require mapping to Odoo's stage_id values. If Insightly has multiple pipelines (Plus 5, Professional 15, Enterprise 50), we consolidate all stage names into Odoo's single pipeline stage sequence. Stage probability values from Insightly migrate to custom Float fields on the Opportunity since Odoo's default probability is derived from stage sequence position.
Insightly Marketing
Project
Odoo CRM
Project
1:1Insightly Project maps to Odoo Project (from the Project app). PROJECT_NAME becomes name, STATUS becomes project_status (on_hold, in_progress, completed). Milestones in Insightly map to Odoo Milestone records linked to the Project. TASK_LIST_NAME values become Odoo task names with their contained tasks migrated as Odoo task records. Project-to-Contact and Project-to-Organization links migrate as Odoo Project.partner_id and task-level partner_id references.
Insightly Marketing
Task
Odoo CRM
Task
1:1Insightly Tasks map to Odoo Project Task records. TASK_NAME becomes name, DUE_DATE becomes date_deadline, ASSIGNED_TO maps to user_id (resolved via Owner-to-User lookup). STATUS maps to x_insightly_task_status (Odoo task state uses kanban_state and stage_id). Related-to references (Contact, Organization, Opportunity, Project) map to Odoo's task fields: partner_id for contacts, project_id for projects, and opportunity_id for deals.
Insightly Marketing
Note
Odoo CRM
Note (mail.message)
1:1Insightly Notes migrate to Odoo mail.message records with message_type=notification attached to the relevant CRM record (Lead, Opportunity, Partner). NOTE_BODY in rich text maps to body HTML. NOTE_TITLE becomes the message subject. Created date and author (Owner) preserve using Odoo's message_date and author_id fields. Notes linked to Insightly Projects attach to the corresponding Odoo Project record.
Insightly Marketing
Custom Fields
Odoo CRM
Custom Fields
lossyInsightly custom field groups and custom fields map to Odoo ir.model.field records or Studio-created fields on the target model (crm.lead, res.partner, crm.lead, project.project, project.task). Field types map: Insightly TEXT to Char, NUMBER to Float or Integer, DATE to Date, PICKLIST to Selection, CHECKBOX to Boolean, CURRENCY to Monetary. Validation rules on Insightly custom fields require manual review to determine whether Odoo's constrains or SQL constraints are needed.
Insightly Marketing
Tags
Odoo CRM
Tags (utm.tag) or custom Char
lossyInsightly Tags on Contacts, Organizations, Opportunities, and Projects migrate to Odoo's utm.tag (available via the Tags app for CRM) as Tag records with their names preserved. The tag application_id links each tag to the CRM application. Alternatively, for tags that represent categorical data (e.g., industry segments, customer tiers), we migrate to a custom Selection or Char field on the Lead or Partner per the customer's preference.
Insightly Marketing
Custom Objects
Odoo CRM
Custom Model (ir.model)
lossyInsightly custom objects (per-instance schemas) require a case-by-case migration design. We evaluate whether the custom object maps to an existing Odoo model (e.g., res.partner extension, crm.lead extension, project.task extension) or requires a new ir.model with custom fields. Odoo's model inheritance via _inherit allows extending standard models without a separate custom table, which is the preferred approach when the custom object relates to Leads, Partners, or Opportunities. Custom object relationships (lookups between custom objects) map to Odoo many2one or many2many fields on the appropriate model.
| Insightly Marketing | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Lead1:1 | Fully supported | |
| Organization | Partner1:1 | Fully supported | |
| Organization | Partner.contact_ids1:many | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Opportunity Stage | Opportunity Stagelossy | Fully supported | |
| Project | Project1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Note | Note (mail.message)1:1 | Fully supported | |
| Custom Fields | Custom Fieldslossy | Mapping required | |
| Tags | Tags (utm.tag) or custom Charlossy | Mapping required | |
| Custom Objects | Custom Model (ir.model)lossy | Mapping required |
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 Marketing gotchas
All-in-One bundles carry mandatory setup fees not visible in per-user pricing
CSV export is per-category and email-delivered, not a single bulk pull
Workflow automation rules are not accessible via API or CSV export
Email templates export in non-standardized format requiring rebuild
Custom object schemas vary per customer implementation
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 migration scope definition
We audit the source Insightly instance across all tiers and data categories: Contacts, Organizations, Leads, Opportunities, Projects, Tasks, Custom Objects, and active Workflow Rules. We extract the custom object schema definition (field names, types, relationships) during discovery since custom objects vary per customer implementation. We pair this with an Odoo environment audit: which Odoo apps are installed (CRM, Project, Contacts, Studio), what custom fields already exist, and which users and groups are provisioned. The discovery output is a written migration scope document, a custom object mapping design, and an Odoo Action Rules rebuild inventory derived from the active Insightly workflow rules.
Owner-to-User reconciliation
We extract every distinct Insightly Owner (referenced on Contact, Organization, Opportunity, Project, and Task records) and match by email against the Odoo destination environment's res.users table. Any Owner without a matching Odoo User goes to a reconciliation queue. The customer's Odoo administrator provisions the missing Users (active or inactive depending on whether the original Insightly user is still active). This step is required before any record import because Odoo's user_id field on Lead, Opportunity, and Task is a required or strongly-referenced foreign key. We provide the Owner reconciliation list and the customer approves the provisioning before Phase 3 begins.
Schema design and Odoo field mapping
We design the Odoo destination schema before any data loads. This includes provisioning custom fields on crm.lead, res.partner, crm.opportunity, project.project, and project.task models using ir.model.fields or Odoo Studio. For Insightly custom objects, we design the Odoo model (either extending an existing model via _inherit or creating a new ir.model) and define all custom fields with correct Odoo field types (Char, Float, Integer, Date, Selection, Boolean, Many2one). We map Insightly pipeline stages to Odoo CRM stage values, consolidating multiple Insightly pipelines into Odoo's single-pipeline stage sequence. The schema is validated in the Odoo environment before migration data is written.
Staging migration and reconciliation
We run a full migration into the Odoo staging or production environment using production-like data volume. The customer's CRM lead and Odoo administrator reconcile record counts (Leads in, Partners in, Opportunities in, Tasks in, Project records in), spot-check 25-50 records against the Insightly source, and verify that Organization-to-Contact links, Opportunity-to-Partner assignments, and Project-to-Task hierarchies are intact. This validation pass identifies any mapping corrections needed before the production migration runs. Any corrections to field types, custom field definitions, or stage mappings happen here, not in production.
Production migration in dependency order
We run production migration in record-dependency sequence: Partners (from Organizations), Leads (from Contacts and Insightly Leads with lifecycle stage split), Opportunities (with Partner and User references resolved), Tasks (with related-to references resolved to Partner, Opportunity, or Project), Projects and Milestones, Custom Objects (last, because they may reference Partner or Opportunity lookups), and Notes as mail.message records. Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC API with batch chunking and error logging to handle large volumes. No production data is modified until the staging sign-off is received.
Cutover, validation, and workflow rebuild handoff
We freeze Insightly data entry during cutover and run a final delta migration of any records created or modified during the migration window. We enable Odoo CRM as the system of record and deliver the Workflow and Action Rules rebuild inventory document to the customer's Odoo administrator. We support a one-week hypercare window where we resolve any data reconciliation issues raised during the first week of Odoo use. We do not rebuild Insightly Workflow Rules as Odoo Action Rules inside the migration scope; that is a separate engagement estimated during discovery.
Platform deep dives
Insightly Marketing
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 Insightly Marketing and Odoo CRM.
Object compatibility
3 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 Marketing: Not publicly documented; Insightly does not publish explicit rate limits in its developer documentation.
Data volume sensitivity
Insightly Marketing 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 Marketing to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Insightly Marketing 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 Marketing
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.