CRM migration
Field-level mapping, validation, and rollback between Dashcord and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Dashcord
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Dashcord and Odoo CRM.
Complexity
BStandard
Timeline
6-10 weeks
Overview
Moving from Dashcord to Odoo CRM is a cross-platform migration that begins inside Salesforce rather than inside Dashcord, because Dashcord has no independent API and all data lives in the host Salesforce org. We authenticate via OAuth into the customer's Salesforce org, enumerate the active Dashcord package schema via the Tooling API, and export Leads, Contacts, Accounts, Campaigns, Campaign Members, and custom Dashcord objects. Odoo CRM uses a unified Lead model where lifecycle stages from Dashcord are preserved as custom fields rather than driving a record split, because Odoo's CRM module does not separate Leads from Opportunities the way Salesforce does. We load via Odoo's XML-RPC API with validation-aware chunking, resolve Account-Contact and User-Owner lookups before inserting child records, and deliver a written inventory of Dashcord automations requiring rebuild in Odoo's Automations or Studio. We do not migrate Workflows, Sequences, or Event management configurations as code.
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 Dashcord 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.
Dashcord
Lead
Odoo CRM
CRM Lead
1:1Dashcord Lead records map to Odoo CRM Lead (crm.lead model). The Salesforce Lead object is the source; we transform all standard fields (Name, Email, Phone, Company, Status) and any Dashcord-specific custom fields (lifecycle stage, lead score) into Odoo Lead fields. Dashcord's lifecycle stage value is preserved in a custom char field x_dashcord_lifecycle_stage on the Odoo Lead for reporting continuity. Lead owner maps by email match to the Odoo res.users record.
Dashcord
Contact
Odoo CRM
CRM Lead (from Contact conversion)
1:1Dashcord Contacts map to Odoo CRM Lead with type='lead' and is_customer=True set after Account resolution. In Odoo's unified model, Contacts from Salesforce do not create a separate Contact object — they create Leads that the customer's sales team converts to Opportunities. We preserve the original Salesforce ContactId as x_sf_contact_id on the Odoo Lead for cross-reference. Standard contact fields (name, email, phone, title) map directly.
Dashcord
Account
Odoo CRM
Res Partner (customer)
1:1Dashcord Account records map to Odoo res.partner with customer=True. The Salesforce Account becomes the Odoo Partner that Contacts and Opportunities attach to. Account name, website, industry, phone, and address fields map to their Odoo equivalents. Billing and shipping addresses from Salesforce Account are preserved as Odoo partner address records (res.partner.address). Account is created before any Contact or Opportunity insert to satisfy the partner_id foreign key.
Dashcord
Campaign
Odoo CRM
CRM Campaign
1:1Dashcord wraps Salesforce Campaigns for marketing automation. We export Campaigns and map them to Odoo CRM Campaign (crm.campaign). Campaign name, start and end dates, budget, and status transfer. Campaign member tracking data (how many Leads and Contacts are in each Campaign) is preserved as Odoo campaign statistics. Odoo campaign model supports tag-based segmentation equivalent to Salesforce Campaign Member status.
Dashcord
Campaign Member
Odoo CRM
CRM Campaign Lead
1:1Campaign Members link Salesforce Leads and Contacts to Campaigns with status, timing, and response tracking. We map them to Odoo crm.tag.assignment records tied to the CRM Campaign. Dashcord campaign member status values (Sent, Open, Clicked, Responded) are preserved as custom selection values on the Odoo campaign record. Each member record is linked to the corresponding Odoo Lead converted from the source Contact or Lead.
Dashcord
Events (Dashcord custom object)
Odoo CRM
Calendar Event
lossyDashcord stores event records as custom Salesforce objects with schema that varies by package version. We introspect the custom object field definitions during pre-flight via the Salesforce Tooling API, export the active event records, and map them to Odoo calendar.event. Event name, start datetime, end datetime, location, and description transfer. Attendee relationships from Salesforce EventRelation map to calendar.attendee records on the Odoo event. Dashcord-specific event fields (event type, capacity, RSVP status) become custom fields on the Odoo event record.
Dashcord
Lifecycle Stages
Odoo CRM
Lead Stage + Custom Field
lossyDashcord assigns lifecycle stage values (subscriber, lead, MQL, SQL, customer, evangelist) to Leads and Contacts as custom picklist fields. Odoo CRM uses its own stage model for the sales pipeline (New, Qualified, Proposition, Won, Lost) which is distinct from lifecycle stage. We preserve Dashcord lifecycle stage values in a custom field x_dashcord_lifecycle_stage on the Odoo Lead record. Customers who need lifecycle stage to drive automation in Odoo rebuild it as a separate stage column in Odoo Studio.
Dashcord
Lead Scoring
Odoo CRM
Custom Field on Lead
lossyDashcord stores numeric or tiered lead scores as custom fields on Salesforce Lead records. We export the raw score values and the scoring model name or rule set reference if stored in a custom object. The numeric score transfers to a custom integer field x_dashcord_lead_score on the Odoo Lead. The score tier label (Cold, Warm, Hot) transfers to x_dashcord_score_tier as a selection field.
Dashcord
Custom Dashcord Properties
Odoo CRM
Custom Fields on Lead
lossyAny custom fields added by Dashcord or the customer on Salesforce objects are introspected via the Salesforce Metadata API during pre-flight. We enumerate every custom field on each standard object, map Salesforce field types to Odoo field types (checkbox to boolean, text to char or text, number to float or integer, picklist to selection), create the Odoo custom fields via Studio or data migration payload, and populate the values during record import.
Dashcord
Email Activity History
Odoo CRM
Mail Message (on Lead)
1:1Dashcord tracks email sends, opens, and clicks via Salesforce Activity records (Task and EmailMessage objects). We export EmailMessage records with body, subject, from address, to address, and status (Sent, Read, Bounced). These load into Odoo as mail.message records linked to the crm.lead via the model and res_id foreign key. Email attribution (which Campaign drove the send) is preserved as a custom field x_sf_campaign_id on the Odoo message record.
Dashcord
Attachments
Odoo CRM
Ir Attachment
1:1File attachments on Salesforce Campaign, Contact, or Account records are stored as Salesforce ContentDocument, ContentVersion, or Attachment objects depending on org configuration. We export the file binary data and name, then create Odoo ir_attachment records linked via res_model and res_id to the matching Odoo Lead or Partner record. Files exceeding Odoo's default attachment size limits are flagged for the customer's admin to store externally and link via URL.
Dashcord
User / Owner
Odoo CRM
Res Users
1:1Dashcord does not have its own user model — user records are Salesforce User objects. We resolve Dashcord owner references by matching Salesforce User email against Odoo res.users email. Any Salesforce User without a matching Odoo user is held in a reconciliation queue for the customer's Odoo admin to provision before record import resumes. OwnerId on all migrating records is resolved to the Odoo res.users id at migration time.
| Dashcord | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | CRM Lead1:1 | Fully supported | |
| Contact | CRM Lead (from Contact conversion)1:1 | Fully supported | |
| Account | Res Partner (customer)1:1 | Fully supported | |
| Campaign | CRM Campaign1:1 | Fully supported | |
| Campaign Member | CRM Campaign Lead1:1 | Fully supported | |
| Events (Dashcord custom object) | Calendar Eventlossy | Fully supported | |
| Lifecycle Stages | Lead Stage + Custom Fieldlossy | Mapping required | |
| Lead Scoring | Custom Field on Leadlossy | Mapping required | |
| Custom Dashcord Properties | Custom Fields on Leadlossy | Fully supported | |
| Email Activity History | Mail Message (on Lead)1:1 | Mapping required | |
| Attachments | Ir Attachment1:1 | Mapping required | |
| User / Owner | Res Users1: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.
Dashcord gotchas
No publicly documented API endpoint for Dashcord
Dashcord data model not independently documented
Salesforce Edition gating may restrict API access
No public pricing tiers means migration scoping has no self-serve reference
Small vendor elevates product discontinuation risk
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
Salesforce org discovery and schema enumeration
We authenticate via OAuth into the customer's Salesforce org and run a full org audit. This covers Salesforce Edition (to identify API access restrictions on Group and Professional tiers), active Dashcord package components, custom Dashcord object names and field definitions via the Tooling API describe endpoint, and record counts across all standard and custom CRM objects. We also extract Salesforce User records by email for owner resolution. The discovery output is a written migration scope document identifying all source objects, estimated volumes, and any schema gaps that require manual enumeration.
Odoo environment provisioning and schema design
We provision or audit the customer's Odoo environment (Odoo Online, Odoo.sh, or On-Premise) and configure the CRM module. This includes activating the CRM app, creating the pipeline stages (mapped from Salesforce opportunity stages and Dashcord lifecycle stages), designing custom fields on crm.lead to receive Dashcord lifecycle stage and lead score values, and setting up team structures and user assignments. If the customer is also adopting Odoo Accounting or Inventory, we design the partner account structure in res.partner to support multi-model usage.
Data extraction from Salesforce
We export all source records from Salesforce via the Bulk API 2.0 for large datasets and the REST API for incremental or custom object queries. Exports run in dependency order: Users first (for owner resolution), then Accounts, Campaigns, Contacts, Leads, Campaign Members, custom Dashcord objects, and engagement history. We chunk Bulk API jobs into 10,000-record batches with exponential backoff on rate limit responses. Every export phase emits a row-count reconciliation report against the Salesforce UI record count. Custom Dashcord field values are enumerated during this phase and mapped to Odoo field definitions.
Owner reconciliation and user provisioning
We extract every distinct Salesforce User referenced as OwnerId on any migrating record and match by email against the Odoo res.users table. Any Salesforce User without a matching Odoo User is placed in a reconciliation queue. The customer's Odoo admin provisions the missing users in Odoo (active or inactive based on whether the original Salesforce user is still employed). Migration cannot proceed past record loading until all owner references are resolved, because Odoo's CRM module requires a valid user_id on Lead and Opportunity records.
Sandbox staging migration and mapping validation
We run a full migration into the customer's Odoo staging or sandbox environment using production-like data volumes. The customer's RevOps lead reviews record counts (Leads in, Accounts in, Campaigns in, email activities in), spot-checks 25-50 records against the Salesforce source data, and validates that Dashcord lifecycle stage values are correctly preserved in the custom fields. Any field mapping corrections, custom field additions, or stage label adjustments happen in staging before production migration begins.
Production migration in dependency order
We run production migration in strict record-dependency order: Users (manual provisioning, validated), Partners (from Salesforce Accounts), Leads (with lifecycle stage in x_dashcord_lifecycle_stage, lead score in x_dashcord_lead_score, and OwnerId resolved to Odoo user id), Campaign records, Campaign member links, Calendar events, email activity history (mail.message via XML-RPC with parent record lookup by external ID), and custom Dashcord objects (last, because they often have many2one lookups to Leads and Partners). Each phase emits a row-count report and error log before the next phase begins.
Cutover, delta sync, and automation rebuild handoff
We freeze Salesforce writes during the cutover window, run a final delta migration of any records modified during the migration, validate critical record counts in Odoo, and enable Odoo as the system of record. We deliver the automation inventory document listing every Dashcord lifecycle automation, event configuration, and lead scoring rule with an Odoo Studio or Automations equivalent recommendation. We support a one-week hypercare window for reconciliation issues. We do not rebuild Dashcord automations as Odoo actions inside the migration scope; that work is a separate engagement or an internal Odoo admin task.
Platform deep dives
Dashcord
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Dashcord and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Dashcord and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Dashcord and Odoo CRM.
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
Dashcord: Salesforce API limits apply — determined by Salesforce Edition (Group/Professional editions are capped; Enterprise and above have higher limits).
Data volume sensitivity
Dashcord 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 Dashcord to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Dashcord 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 Dashcord
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.