CRM migration
Field-level mapping, validation, and rollback between Dashly and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Dashly
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Dashly and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Dashly to Odoo CRM is a structural migration from a conversational marketing platform to a full ERP-adjacent CRM. Dashly stores leads as unified contact records with threaded conversation arrays, while Odoo CRM uses a single crm.lead table with a type field separating unqualified Leads from qualified Opportunities, and stores partner data in res.partner rather than a separate Contact object. We resolve the Dashly conversation-to-lead association during scoping, map conversation metadata to Odoo's mail.thread model, and preserve message timestamps and participant attribution. Visitor sessions, ephemeral behavioral data, and leadbot automation configs do not migrate as functional equivalents; we deliver exported JSON configs and a written rebuild guide for the customer's Odoo admin. Odoo Community edition is free and self-hosted, while Odoo Online and Enterprise are subscription-based, making pricing substantially different from Dashly's visitor-quota model.
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 Dashly 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.
Dashly
Lead
Odoo CRM
crm.lead
1:1Dashly Leads map directly to Odoo crm.lead records. Standard properties (name, email, phone, company) map to crm.lead fields name, email_from, phone, and partner_name respectively. Custom Lead properties are inventoried during discovery and created as ir.model.field definitions on crm.lead before migration. The crm.lead type field defaults to lead for unqualified records and is set to opportunity when a deal amount or pipeline assignment exists. We use Odoo's XML-RPC API with create() calls to insert records in batches of up to 100, handling field type mapping (date fields, many2one lookups, char/text fields) per Odoo's ORM expectations.
Dashly
Company
Odoo CRM
res.partner
1:1Dashly Company records map to Odoo res.partner with is_company=True. Dashly's standard company fields (name, domain, industry) map to partner name, website, and industry_id respectively. Custom company properties migrate as custom fields on res.partner. The res.partner record is created before any Lead migration so that the crm.lead partner_id lookup (many2one) is satisfied at insert time. If a Dashly Lead references a Company, we create the partner first, then link the lead via partner_id on crm.lead.
Dashly
Conversation
Odoo CRM
mail.thread
1:manyDashly Conversations attached to a Lead map to Odoo mail.thread records linked to the corresponding crm.lead. Odoo does not have a native conversation object; instead, each crm.lead gets a mail.thread record that accumulates mail.message child records. Conversation metadata (status, assignee, source channel, created timestamp) is stored as mail.thread custom fields or crm.lead extension fields. Multiple Dashly conversations per Lead become multiple thread entries within the same lead's conversation history in Odoo.
Dashly
Message
Odoo CRM
mail.message
1:1Dashly Messages within Conversations map to Odoo mail.message records as child records of the crm.lead's mail.thread. Each message preserves sender attribution (agent name or visitor identifier), body content, timestamp, and delivery channel via mail.message body, author_id, date, and subtype fields. We reconstruct thread ordering by setting mail.message date to the original Dashly timestamp. Messages from Dashly that reference a deleted or unmigrated Lead are held in a dead-letter queue for manual review.
Dashly
User (Agent)
Odoo CRM
res.users
1:1Dashly User accounts (agents and admins) map to Odoo res.users by matching on email address. We extract Dashly user records including name, email, role, and availability status. Inactive Dashly users map to Odoo Portal users or inactive res.users records depending on whether the customer wants historical attribution preserved. The Odoo res.users records must exist before any crm.lead owner assignment because crm.lead user_id is a many2one to res.users.
Dashly
Company
Odoo CRM
res.partner (contact)
1:manyDashly Contacts nested under Companies in Dashly map to Odoo res.partner records with is_company=False and parent_id pointing to the company partner record. Dashly contact records (name, email, phone, job title) map to res.partner name, email, phone, and function respectively. This creates the Odoo standard partner hierarchy: company as the parent partner with individual contacts as child records. If Dashly stored contacts without a parent company, they migrate as standalone res.partner records without a parent_id.
Dashly
Tag
Odoo CRM
crm.tag
1:1Tags applied to Dashly Leads and Companies map to Odoo crm.tag records attached via crm.lead.tag_ids (many2many). Dashly tag names become crm.tag names, deduplicated at migration time to avoid duplicate Odoo tags. If a Dashly tag name conflicts with an existing Odoo crm.tag, we merge them under the existing tag ID. Tags on Companies map to res.partner category_id (many2many to res.partner.category) for consistency.
Dashly
Custom Properties
Odoo CRM
ir.model.field (custom fields on crm.lead and res.partner)
1:1Dashly custom fields on Leads and Companies are inventoried during discovery, including data type, required status, and all unique values for picklist fields. We create corresponding custom fields on crm.lead and res.partner via Odoo's ir.model.data before migration begins. Char fields map to char, text areas to text, dates to date, numbers to float or integer, and multi-select or checkbox fields to char or many2many depending on Odoo version. All custom field values migrate as part of the Lead and Company insert phases.
Dashly
Leadbot Configurations
Odoo CRM
Server Action / Automated Action (documentation only)
lossyDashly Leadbots are structured automation configs with trigger conditions, dialogue trees, and action sequences stored as JSON. Odoo does not share this schema. We export the full bot configuration as structured JSON files (one per Leadbot) and deliver a written rebuild guide mapping each Dashly trigger condition to an Odoo Automated Action or Server Action with the equivalent logic. The automation rebuild itself is manual and not within standard migration scope. The exported JSON files are delivered as part of the migration handoff package.
Dashly
Triggered Message Rules
Odoo CRM
Automated Action (documentation only)
lossyDashly triggered message rules define automated outbound sequences tied to visitor behavior or time delays. The trigger rules and message content are exported as structured automation data. Odoo's Automated Actions support time-based triggers and write actions but do not have native email sequence cadence logic. We deliver an exported JSON file of all triggered message configurations and a written mapping guide recommending the closest Odoo Automated Action equivalent for each rule. The rebuild is a manual admin task post-migration.
Dashly
Knowledge Base Articles
Odoo CRM
document.page
1:1Dashly Knowledge Base articles (title, body content, category associations) map to Odoo document.page records. Article body content migrates as document.page content. Dashly article categories map to document.folder or parent document.page hierarchy depending on the target Odoo version. SEO settings (meta title, meta description, URL slug) are preserved in document.page custom fields since Odoo's document.page does not have native SEO fields. The customer should review and republish migrated articles in Odoo's document management module after migration.
Dashly
Team Inbox Assignments
Odoo CRM
crm.team
1:1Dashly conversation assignee data and team routing rules map to Odoo crm.team records and crm.lead.team_id / user_id assignments. We extract Dashly team inbox assignments and map them to Odoo crm.team structure (name, member_user_ids). Dashly assignee agents map to res.users and are linked to crm.team as member_user_ids. Conversation routing rules are exported as configuration data and delivered as a written mapping document; the actual crm.team setup is configured in Odoo during migration setup.
| Dashly | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | crm.lead1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Conversation | mail.thread1:many | Fully supported | |
| Message | mail.message1:1 | Fully supported | |
| User (Agent) | res.users1:1 | Fully supported | |
| Company | res.partner (contact)1:many | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| Custom Properties | ir.model.field (custom fields on crm.lead and res.partner)1:1 | Mapping required | |
| Leadbot Configurations | Server Action / Automated Action (documentation only)lossy | Fully supported | |
| Triggered Message Rules | Automated Action (documentation only)lossy | Fully supported | |
| Knowledge Base Articles | document.page1:1 | Mapping required | |
| Team Inbox Assignments | crm.team1:1 | 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.
Dashly gotchas
Visitor-based pricing affects migration scoping
No public bulk export endpoint
Leadbot and triggered message configs require manual rebuild
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 data audit
We audit the Dashly account across all objects: Lead count, Company count, conversation thread volume (total messages), User count, active Tags, Knowledge Base article count, and Leadbot configuration count. We check the current Dashly plan tier and visitor quota during scoping because exceeding the visitor quota during the migration window (when data is accessed via API) does not suspend service but triggers per-visitor overage fees. We produce a written migration scope document listing all source objects, estimated record counts per object, any known data quality issues, and the custom field inventory derived from Dashly's custom property definitions.
Odoo schema design and custom field creation
We design the destination Odoo CRM schema before any data import. This includes creating crm.tag records for each unique Dashly tag, creating crm.team records for each Dashly team inbox, and defining custom fields on crm.lead and res.partner via Odoo's ir.model.field for every Dashly custom property discovered during audit. Custom fields are deployed via XML-RPC to the target Odoo database before the data migration phase begins. We configure crm.lead stage pipelines matching any Dashly lead stages identified, and design the lead-to-opportunity type assignment rule based on the customer's deal data presence in Dashly.
Sandbox migration and reconciliation
We run a full migration into a staging Odoo environment using production-like data volume. The customer reconciles record counts (Leads in, Companies in, res.partner contacts in, mail.message records in, Tags in), spot-checks 25-50 random records against the Dashly source for field-level accuracy, and validates the crm.lead type assignment logic. Any mapping corrections, missed custom fields, or tag deduplication issues are resolved in this phase. Production migration does not begin until the customer signs off on the staging reconciliation report.
User and team provisioning
We extract every distinct Dashly agent and admin referenced on Conversations and assign them to res.users records in Odoo. Agent names and emails are matched to Odoo users; inactive Dashly agents are mapped to inactive res.users. crm.team membership is configured by mapping Dashly team inbox membership to crm.team member_user_ids. Any Dashly agent without a corresponding Odoo user goes to a reconciliation queue for the customer's admin to provision before the Lead migration phase proceeds.
Production migration in dependency order
We run production migration in record-dependency order: crm.tag records first (no dependencies), then res.partner (company records), then res.partner child contacts with parent_id linking to company, then crm.lead records with partner_id resolved and type assigned (lead vs opportunity), then mail.thread and mail.message records linked to crm.lead. Each phase emits a row-count reconciliation report before the next phase begins. Custom field values are written as part of each insert call. We use Odoo's XML-RPC batch create (up to 100 records per call) with error logging and retry logic for partial failures.
Cutover, validation, and handoff
We freeze Dashly writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver the Leadbot and triggered message JSON exports with a written rebuild guide mapping Dashly automation logic to Odoo Automated Actions and Server Actions. We support a one-week hypercare window to resolve reconciliation issues raised by the customer's team. We do not rebuild Dashly automations as Odoo automated actions within the migration scope; that work is a separate engagement or an internal Odoo admin task.
Platform deep dives
Dashly
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Dashly and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Dashly and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Dashly 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
Dashly: Not publicly documented.
Data volume sensitivity
Dashly 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 Dashly to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Dashly 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 Dashly
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.