CRM migration
Field-level mapping, validation, and rollback between Exsalerate and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Exsalerate
Source
Odoo CRM
Destination
Compatibility
11 of 15
objects map 1:1 between Exsalerate and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Exsalerate and Odoo CRM are structurally different platforms that require deliberate schema mapping rather than a simple record copy. Exsalerate uses a flat Account-centric model where Contacts are tightly bound to the Account record; Odoo separates these into res.partner (contacts and companies) with explicit address and role types. We pre-create Odoo's Partner records, split Exsalerate's account-contact pairs into separate Odoo contacts, and resolve the parent Partner before importing any dependent records. Exsalerate has no documented public API — our migration path relies on CSV exports and, where available, direct database access — so we build a multi-file reconciliation step into scoping to confirm export completeness before any transform work begins. WorkflowMax quotes imported as Exsalerate Opportunities carry a cross-reference that has no native Odoo equivalent; we store it in a custom field and flag it for manual reconnection post-migration. Colour-coded activity tiles encode urgency metadata we preserve as a custom field on migrated Tasks. We do not migrate Exsalerate's workflow automation, Xero sync configurations, or reporting dashboards — these are documented in a written rebuild inventory for your Odoo admin.
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 Exsalerate 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.
Exsalerate
Account
Odoo CRM
res.partner (Company role) + res.partner (Contact records)
1:manyExsalerate's flat Account is the central entity carrying both company-level data and embedded contact data. We split this into Odoo res.partner records: the Account name and address fields become a res.partner with partner_type = 'company' (or address_type = 'contact' for the primary company contact), and any secondary contacts within the Account become separate res.partner records linked via parent_id to the company partner. The Account-Contact relationship maps to the parent_id lookup in Odoo. We preserve Exsalerate's account owner as a Many2one field on the partner record, resolving Exsalerate user email to an Odoo User record before import.
Exsalerate
Contact
Odoo CRM
res.partner (contact role)
1:1Exsalerate Contacts associated to an Account migrate to Odoo res.partner with parent_id pointing to the Account's company partner record. Contact role (decision-maker, influencer, billing, technical) is stored as a custom field on res.partner since Odoo does not have a native contact-role attribute. Email, phone, mobile, job title, and department fields map directly. We run duplicate detection on email address before import to avoid creating duplicate res.partner records where Exsalerate has already deduplicated.
Exsalerate
Opportunity
Odoo CRM
crm.lead
1:1Exsalerate Opportunities map to Odoo crm.lead records with type = 'opportunity'. Stage name maps to Odoo's stage_id with probability recalculated to Odoo's 0-100 scale; Exsalerate's colour-coded stage tiles do not have a native Odoo equivalent, so stage colour metadata is stored as a custom char field on the crm.lead record. Expected close date, deal value, and owner migrate directly. Exsalerate's deal name maps to crm.lead name, and the Account lookup maps to the resolved res.partner record.
Exsalerate
Pipeline
Odoo CRM
crm.team + crm.stage grouping
1:1Exsalerate Pipelines map to Odoo crm.team (Sales Teams). We create one crm.team per Exsalerate Pipeline, preserving the Pipeline name as the team name. Exsalerate Pipeline Stages are then configured as crm.stage records within that team context, with stage order and colour metadata preserved. Note that Exsalerate's per-pipeline stage sequence is modelled as Odoo's global stage sequence with team-based filtering; we document any pipeline-specific stage logic that requires Odoo Studio or custom code to replicate.
Exsalerate
Pipeline Stage
Odoo CRM
crm.stage
lossyEach Exsalerate Pipeline Stage label becomes an Odoo crm.stage record within the corresponding crm.team. Stage probability from Exsalerate maps to Odoo's stage_id probability field (integer 0-100). Exsalerate's colour coding on stages (which drives visual pipeline tile display) is stored as a custom field stage_color on the crm.stage record. Stage-level automation triggers in Exsalerate do not migrate — we document them in the automation inventory for rebuild in Odoo Studio or a custom Python module.
Exsalerate
To-Do Item (Activity Tile)
Odoo CRM
mail.activity (Task mode)
1:1Exsalerate's colour-coded activity tiles represent tasks and follow-up reminders. We map these to Odoo mail.activity records (or ir.model.data Task records if the Project module is installed). The tile colour encoding (which signals urgency and context in Exsalerate) is captured as a custom char field activity_tile_color on the mail.activity record. Due date, status (complete/overdue), and owner migrate directly. Activity tiles that represent meetings or calls map to mail.activity with activity_type_id set to 'meeting' or 'call' respectively.
Exsalerate
Email Activity
Odoo CRM
mail.message
1:1Exsalerate Email Activities associated to Accounts or Contacts migrate as Odoo mail.message records with message_type = 'email'. Subject, body (plain text), timestamp, sender (author_id resolved to res.partner), and recipient partner_ids are preserved. Attachments migrate as ir.attachment records linked via res_id/res_model to the parent crm.lead or res.partner. Email threading relationships from Exsalerate are not guaranteed to be preserved as Odoo inherits threading via the mail.message parent_id field if the source system exposes this reference; otherwise, threaded context is documented in the migration notes.
Exsalerate
Custom Fields (Accounts, Contacts, Opportunities)
Odoo CRM
Custom fields on res.partner and crm.lead
lossyExsalerate custom fields on Accounts, Contacts, and Opportunities are pre-created as custom fields in Odoo via Odoo Studio before migration begins. We map field types at migration time: Exsalerate picklist values become Odoo selection fields with equivalent option values; date fields normalise to Odoo's datetime format; numeric fields map to float or monetary fields as appropriate. Any Exsalerate custom field that has no Odoo equivalent (e.g., multi-select without a natural selection field) is stored as a char field with the raw value and flagged for the admin to re-evaluate post-migration.
Exsalerate
User / Owner
Odoo CRM
res.users
1:1Exsalerate user accounts map to Odoo res.users records. We create a user mapping table during scoping using email as the lookup key. Inactive Exsalerate users are mapped to inactive res.users with the original Exsalerate Owner name stored in a custom field for reconciliation. Active users are provisioned by the customer's Odoo admin before migration resumes because OwnerId references on crm.lead and res.partner are required at import time. Users with no Exsalerate email (system-generated owners) are mapped to a migration service account flagged for admin reassignment post-import.
Exsalerate
WorkflowMax Quote cross-reference
Odoo CRM
Custom field on crm.lead + ir.model.data note
1:1Exsalerate allows WorkflowMax quotes to be imported as Opportunities with a cross-reference to the originating WorkflowMax job or quote. This reference is an Exsalerate custom attribute that has no native Odoo equivalent. We store the WorkflowMax quote/job ID in a custom char field x_workflowmax_ref on the crm.lead and document the original Exsalerate field name and value in the migration record. Since WorkflowMax is not an Odoo product, customers using WorkflowMax post-migration will need to re-establish this cross-reference manually in Odoo or via a custom integration.
Exsalerate
Xero Integration data
Odoo CRM
res.partner notes + custom fields
1:1Exsalerate stores Xero customer IDs, invoice sync status, and comparative sales data on Account records (e.g., last invoiced date, overdue invoice flags, MTD/YTD sales comparatives). We migrate the Xero customer reference ID as a custom char field x_xero_contact_id on res.partner. The comparative financial data (MTD, YTD, last-12-months sales figures surfaced in Exsalerate's Account Management Dashboard) does not map to a standard Odoo CRM field — we store it in a custom text or float field and flag it for the admin to evaluate whether Odoo's Accounting module can replicate the same view from live data.
Exsalerate
Tag / Category
Odoo CRM
res.partner.category or custom tag
lossyExsalerate uses tags and categories to segment Accounts and Contacts (e.g., industry classification, account tier, team assignment). We map these to Odoo res.partner.category records (Tags in the UI) and create a tag_assignment table linking partner IDs to the resolved category IDs. Tags with no Odoo equivalent are stored as a custom char field and flagged for the admin to create as formal Odoo tags post-migration.
Exsalerate
Engagement history (calls, emails, meetings)
Odoo CRM
mail.activity + mail.message
1:1Exsalerate logs engagement history (calls, emails, meetings, notes) against Accounts and Contacts. We map calls to mail.activity with activity_type_id = 'call', preserving call duration and disposition as custom fields. Meeting records map to mail.activity with activity_type_id = 'meeting' and the original timestamp as activity_date_deadline. Email logs map to mail.message with message_type = 'email' linked to the parent res.partner or crm.lead. Note that Odoo's activity timeline is shared across CRM and Project — if the customer also uses Odoo Project, migrated activities appear in both contexts, which may require a tag-based filter to maintain Exsalerate's account-activity-only view.
Exsalerate
Lead / Prospect (if applicable)
Odoo CRM
crm.lead (Lead type)
1:1Exsalerate does not have a separate Lead object — all prospects are managed as Accounts with a status flag or pipeline assignment. If the customer has records in Exsalerate that represent unqualified prospects (not yet converted to active Accounts), we import them as Odoo crm.lead with type = 'lead' rather than type = 'opportunity'. The Exsalerate Account name becomes the crm.lead contact_name, and any contact details on the Account map to the lead's email and phone fields. This ensures unqualified prospects enter Odoo's standard lead qualification workflow rather than appearing in the sales pipeline directly.
Exsalerate
File Attachments
Odoo CRM
ir.attachment
1:1Exsalerate allows file attachments on Accounts, Contacts, and Opportunities. We migrate these as Odoo ir.attachment records linked via res_model and res_id to the corresponding crm.lead or res.partner. Files are exported from Exsalerate as binary blobs or file URLs, validated for file type and size, and re-uploaded during the Odoo import phase. Files exceeding Odoo's default 25MB attachment limit are flagged for the admin to store in an external document management system (Odoo Documents or a linked cloud storage service).
| Exsalerate | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account | res.partner (Company role) + res.partner (Contact records)1:many | Fully supported | |
| Contact | res.partner (contact role)1:1 | Fully supported | |
| Opportunity | crm.lead1:1 | Fully supported | |
| Pipeline | crm.team + crm.stage grouping1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| To-Do Item (Activity Tile) | mail.activity (Task mode)1:1 | Fully supported | |
| Email Activity | mail.message1:1 | Fully supported | |
| Custom Fields (Accounts, Contacts, Opportunities) | Custom fields on res.partner and crm.leadlossy | Fully supported | |
| User / Owner | res.users1:1 | Fully supported | |
| WorkflowMax Quote cross-reference | Custom field on crm.lead + ir.model.data note1:1 | Fully supported | |
| Xero Integration data | res.partner notes + custom fields1:1 | Fully supported | |
| Tag / Category | res.partner.category or custom taglossy | Fully supported | |
| Engagement history (calls, emails, meetings) | mail.activity + mail.message1:1 | Fully supported | |
| Lead / Prospect (if applicable) | crm.lead (Lead type)1:1 | Fully supported | |
| File Attachments | ir.attachment1: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.
Exsalerate gotchas
WorkflowMax quote-to-opportunity linkage is not a standard CRM field
Exsalerate has no publicly documented bulk export or API endpoint
Colour-coded to-do tiles do not map to standard CRM task priorities
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 export confirmation
We audit the Exsalerate deployment across all objects: Accounts, Contacts, Opportunities, Pipelines, Stages, Activity Tiles, Email Activities, Custom Fields, and User accounts. We also identify any WorkflowMax quote cross-references and Xero sync fields embedded in Exsalerate. The critical discovery step is confirming the export mechanism: we test whether the CSV export includes all objects in a single coordinated download or whether multi-file reconciliation is required. If the CSV export is incomplete, we explore direct database access or flag this as a migration blocker before scoping sign-off.
Schema design in Odoo
We design the destination schema in the customer's Odoo environment before any data moves. This includes creating the crm.team records (one per Exsalerate Pipeline), configuring crm.stage records with probability values and colour metadata from Exsalerate, pre-creating any custom fields on res.partner (x_workflowmax_ref, x_xero_contact_id, activity_tile_color) via Odoo Studio, and designing the res.partner split strategy for the Account-to-company-plus-contacts mapping. Schema is deployed into a staging or sandbox Odoo environment first for validation.
Sandbox migration and reconciliation
We run a full migration into a staging Odoo environment using production-equivalent data volume. The customer's team reconciles record counts (Accounts mapped to company partners and contact partners, Opportunities on crm.lead, Activities on mail.activity), spot-checks 25-50 records against the Exsalerate source for field accuracy and relationship integrity, and verifies that the colour tile metadata, WorkflowMax cross-references, and Xero integration fields are correctly populated. The customer signs off the staging migration before production migration begins.
Owner and user reconciliation
We extract every distinct Exsalerate user referenced as an owner on Accounts, Contacts, and Opportunities and match by email against the Odoo destination's res.users table. Inactive Exsalerate users are mapped to inactive Odoo users with the original name preserved. Any Exsalerate owner without a matching Odoo User record is held in a reconciliation queue for the customer's Odoo admin to provision before record import resumes. OwnerId references on crm.lead and res.partner must be resolved at import time because Odoo enforces referential integrity on these fields.
Production migration in dependency order
We run production migration in record-dependency order: res.users (validated by admin), company partners (from Exsalerate Accounts), contact partners (from Exsalerate Contacts with parent_id to company partner), crm.team (from Exsalerate Pipelines), crm.stage (from Exsalerate Stages), crm.lead type=lead (for unqualified prospects), crm.lead type=opportunity (from Exsalerate Opportunities with WorkflowMax reference in custom field), mail.activity and mail.message (Activities and Emails via Odoo XMLRPC batch import), and ir.attachment (file migrations). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and rebuild handoff
We freeze Exsalerate writes during the cutover window, run a final delta migration for any records modified during the window, then enable Odoo as the system of record. We deliver a written inventory of Exsalerate workflow automations, Xero sync configurations, and reporting dashboards requiring rebuild in Odoo Studio, Odoo automation rules, or the Odoo Accounting module. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's sales team. We do not rebuild Exsalerate automations as Odoo automated actions inside the migration scope — that is a separate engagement or an internal Odoo admin task.
Platform deep dives
Exsalerate
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 Exsalerate 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
Exsalerate: Not publicly documented..
Data volume sensitivity
Exsalerate 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 Exsalerate to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Exsalerate 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 Exsalerate
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.