CRM migration
Field-level mapping, validation, and rollback between Odoo Marketing Automation and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
Odoo Marketing Automation
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
7 of 8
objects map 1:1 between Odoo Marketing Automation and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Odoo Marketing Automation to Microsoft Microsoft Dynamics 365 Sales is a migration between two fundamentally different CRM philosophies. Odoo treats Companies and Contacts as one partner model with a shared ID, while Dynamics 365 separates Accounts and Contacts with explicit lookup relationships that must be resolved before any Contact import. Odoo's Marketing Automation module depends on the Email Marketing app and optionally SMS Marketing, which means campaigns, automation rules, and mass mailing records often span three apps simultaneously. We map that multi-app activity structure into Dynamics 365's Campaign, Lead, and Opportunity objects, preserving email template HTML and engagement timestamps while flagging any automation rule that contains a Python Code activity as a manual-rebuild item for Power Automate. Odoo Standard-plan databases lack external API access and require CSV/XLS extraction from list views, which we scope separately from Custom-plan XML-RPC exports. Workflows, server actions, and automation rules do not migrate as code; we deliver a written inventory for the customer's admin to rebuild.
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.
Source platform
Odoo Marketing Automation platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo Marketing Automation.
Destination platform
Microsoft Dynamics 365 Sales platform overview
Scorecard, SWOT, gotchas, and pricing for Microsoft Dynamics 365 Sales .
Data migration guide
The complete Microsoft Dynamics 365 Sales migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Destination checklist
Microsoft Dynamics 365 Sales migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Sales .
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Odoo Marketing Automation object lands in Microsoft Dynamics 365 Sales , including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo Marketing Automation
Contact
Microsoft Dynamics 365 Sales
Contact
1:1Odoo res.partner records with type = 'contact' map to Microsoft Dynamics 365 Contact. The Odoo partner ID becomes the source_reference field for deduplication. Email, phone, mobile, street, city, country, and custom fields migrate directly. The partner's parent_id (linking to a company-type partner) resolves to an Account on the destination before Contact insert so that the accountid lookup is satisfied. Tags stored as a many2many tag_ids relation flatten to a string array on the Contact custom attribute.
Odoo Marketing Automation
Company
Microsoft Dynamics 365 Sales
Account
1:1Odoo res.partner records with type = 'company' map to Dynamics 365 Account. Company name becomes the Account Name field, website migrates to Account WebSite URL, and street/city/country/phone map to the standard Address and Phone columns. The Odoo partner ID is preserved as source_reference for reconciliation. Account is created before any Contact import because the Contact-to-Account lookup is a hard requirement on the Dynamics 365 Contact insert.
Odoo Marketing Automation
Lead
Microsoft Dynamics 365 Sales
Lead
1:1Odoo CRM Leads map directly to Dynamics 365 Lead. Lead name, email, phone, company name, source, priority, and stage all have direct column equivalents in the Dynamics 365 Lead table. The Odoo lead_stage_id maps to Lead Status via a staging table we build during scoping. Custom fields on the Odoo CRM lead model migrate as custom columns on the Dynamics 365 Lead entity. Lead scoring values stored as custom float fields on Odoo migrate to a custom integer field on Lead.
Odoo Marketing Automation
Opportunity
Microsoft Dynamics 365 Sales
Opportunity
1:1Odoo CRM Opportunities map to Dynamics 365 Opportunity. The Odoo stage name maps to Dynamics 365 StageName via a per-pipeline mapping table. Expected revenue, partner (account link), lost reason, and priority migrate directly. Close date migrates to EstimatedCloseDate. If the Odoo database has multiple CRM pipelines, each maps to a separate Microsoft Dynamics 365 Sales Process or Opportunity Record Type. Closed-Won and Closed-Lost outcomes are preserved as stage names rather than separate status flags.
Odoo Marketing Automation
Campaign
Microsoft Dynamics 365 Sales
Campaign
1:1Odoo Marketing Automation Campaigns map to Dynamics 365 Campaign. Campaign name, target model (Contact, Lead, or Sales Order reference), audience domain filter, and state (draft, running, done, cancelled) migrate as Campaign metadata. Traces and activity logs (which contact entered which campaign under which condition) migrate as CampaignActivity records linked to the Campaign. Note that Dynamics 365 Campaign is a container for marketing initiatives rather than a trigger-based automation engine.
Odoo Marketing Automation
Automation Rule
Microsoft Dynamics 365 Sales
Power Automate Flow (manual rebuild)
lossyAutomation Rules from Odoo Marketing Automation cannot migrate as executable code. We extract every rule's name, trigger type (time-based, email event-based, server action, record update), filter domain, action chain, and activity sequence and present them as a written inventory document. The customer's admin or a Power Automate specialist uses this inventory to rebuild the automation logic in Power Automate, which uses a different trigger-condition-action model. Rules containing Python Code activities are flagged separately with a note that the logic requires a custom connector or Azure Function replacement.
Odoo Marketing Automation
Email Template
Microsoft Dynamics 365 Sales
Email Template (editable)
1:1Odoo Email Marketing templates (name, subject, body HTML, inline images) migrate as Dynamics 365 Email Template records. The HTML body transfers as-is; inline image URLs that reference Odoo's /web/binary/ path are flagged for manual re-hosting on SharePoint or Dynamics 365 marketing asset storage. Variable placeholders using Odoo's {{ }} syntax require conversion to Dynamics 365 token syntax ({{contact.firstname}}) during template import.
Odoo Marketing Automation
Mass Mailing
Microsoft Dynamics 365 Sales
CampaignActivity or Email Template
1:1Odoo Mass Mailings (sent email records from Email Marketing) contain subject, recipient count, scheduled date, and body HTML. We migrate the most recent 12 months of Mass Mailing records as CampaignActivity entries linked to the parent Campaign, preserving subject, send date, and recipient count. Full email body content migrates via the Email Template object. Older mass mailings beyond the 12-month window migrate as counts and metadata only.
| Odoo Marketing Automation | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Company | Account1:1 | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Campaign | Campaign1:1 | Fully supported | |
| Automation Rule | Power Automate Flow (manual rebuild)lossy | Fully supported | |
| Email Template | Email Template (editable)1:1 | Fully supported | |
| Mass Mailing | CampaignActivity or Email Template1: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.
Odoo Marketing Automation gotchas
External API access is gated behind the Custom plan
Automation rules with Python server actions cannot replay on non-Odoo destinations
No native conversion tracking within Marketing Automation
Two dependent apps must both be installed for full feature access
Microsoft Dynamics 365 Sales gotchas
Professional tier 15-table custom table limit blocks migrations
October 2024 pricing increase applies at renewal for all customers
Custom fields must be created in the UI before API writes
Power Platform request limits apply to bulk migrations
Activity records orphaned to inactive owners fail silently
Pair-specific challenges
Migration approach
Discovery and Odoo plan assessment
We audit the source Odoo database for plan tier (Standard vs Custom), installed apps (Marketing Automation, Email Marketing, SMS Marketing), and active modules. We inventory Contacts, Leads, Opportunities, Campaigns, Automation Rules, Email Templates, Mass Mailings, and custom fields via Odoo Studio or ir.model.fields metadata. If the database is on Standard plan, we confirm that CSV/XLS list-view exports are accessible for all required models and scope the manual export process. The discovery output is a written migration scope document covering record counts per object, identified automation rules, and a migration method recommendation.
Data export and field mapping
For Custom-plan Odoo databases, we export via XML-RPC using the external API endpoint /xmlrpc/2/common and /xmlrpc/2/object. For Standard-plan databases, we coordinate with the customer's Odoo admin to export CSV/XLS from list views for Contacts, Leads, Opportunities, and Campaigns, and we manually capture automation rule metadata from the Marketing Automation rule editor. We build a field mapping spreadsheet mapping each Odoo model field (name, type, required flag) to a corresponding Dynamics 365 column (name, type, required flag). Custom fields require explicit mapping because Odoo Studio fields and ir.model.fields entries do not have automatic Dynamics 365 equivalents.
Dynamics 365 schema provisioning
We create the target schema in the customer's Microsoft Dynamics 365 Sales environment before any data import. This includes creating any custom columns referenced in the field mapping, configuring Lead Status values to match the Odoo CRM stage names, creating Sales Processes and Record Types for each Odoo CRM pipeline, and configuring the Account-Contact relationship as required. We deploy the schema via the Dataverse Web API or a solution file into a Sandbox environment first for validation. The customer reconciles 25-50 records against the source Odoo data and signs off before production migration begins.
Owner and user reconciliation
We extract every distinct Odoo user referenced as create_uid, write_uid, or assignee on CRM records and automation rules. We match by email against the Dynamics 365 User table. Any Odoo user without a matching Dynamics 365 User goes to a reconciliation queue, and the customer's admin provisions the missing User before record import resumes. OwnerId references on Opportunities and Leads must be resolved before those records can be inserted.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from Odoo company-type partners), Contacts (with accountid resolved from the Account migration), Leads, Opportunities (with accountid, ownerid, and RecordTypeId resolved), Campaigns and CampaignActivities (from Odoo Marketing Automation Campaigns), Email Templates (HTML body and subject), then custom fields last. Each phase emits a row-count reconciliation report before the next phase begins. For large engagement histories, we use the Dataverse Bulk API with batch chunking and exponential backoff.
Cutover, validation, and automation rebuild handoff
We freeze Odoo writes during cutover and run a final delta migration of any records modified during the migration window. We enable Microsoft Dynamics 365 Sales as the system of record and deliver the automation inventory document (all Automation Rules, triggers, conditions, and recommended Power Automate equivalents) to the customer's admin team. We support a one-week hypercare window for reconciliation issues. We do not rebuild Odoo automation rules as Power Automate flows within the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Odoo Marketing Automation
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
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 Odoo Marketing Automation and Microsoft Dynamics 365 Sales .
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
Odoo Marketing Automation: Not publicly documented by Odoo.
Data volume sensitivity
Odoo Marketing Automation 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 Odoo Marketing Automation to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Marketing Automation to Microsoft Dynamics 365 Sales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Odoo Marketing Automation
Other ways to arrive at Microsoft Dynamics 365 Sales
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.