CRM migration
Field-level mapping, validation, and rollback between Odoo Field Service and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
Odoo Field Service
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
11 of 12
objects map 1:1 between Odoo Field Service and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
48–72 hours
Overview
Odoo Field Service organises work around task records with Kanban stages, employee assignees, planned hours, and chatter threads. Microsoft Dynamics 365 Sales uses Opportunities and Accounts as its primary sales records, with a separate Work Order table available in the Field Service module or via Dataverse custom tables. FlitStack AI extracts Odoo field-service tasks via the XML-RPC external API in batches of up to 1,000 records per call, resolves assignees by email against Dynamics users, maps stage names to custom picklists, and re-hosts attachments in SharePoint or Dataverse Files. Automation rules, server actions, and assignment logic in Odoo do not transfer — those require Power Automate flows or Dataverse workflows to be rebuilt. The migration carries all standard task fields, custom fields, product lines, chatter history, and timestamps into your chosen Dynamics schema, with a 24–48h delta pickup capturing any in-flight changes at cutover. Odoo's scoped read-only API access means your field technicians keep operating normally during the migration window.
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 Field Service platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo Field Service.
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 Field Service 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 Field Service
Task (fsm.worker.task)
Microsoft Dynamics 365 Sales
msdyn_workorderservicetask / Custom Work Order Table
1:1Odoo field-service tasks have no native Dynamics equivalent in the Sales app. We create a custom Work Order table in Dataverse (or map to msdyn_workorder) so stage, priority, planned time, and product lines all land in one place. Original Odoo stage names are preserved as a custom picklist value; the Dynamics Option Set is pre-seeded with source stage names before migration runs.
Odoo Field Service
Contact / Partner (res.partner)
Microsoft Dynamics 365 Sales
Contact
1:1Odoo partners with type='contact' map to Dynamics Contacts. We match by email address as the primary key. Unmatched partners (no email) are flagged with a source_system_id custom field for manual review. Multi-company partners are resolved to the primary company contact role.
Odoo Field Service
Company (res.partner type='company')
Microsoft Dynamics 365 Sales
Account
1:1Odoo companies map to Dynamics Accounts. Company name, street, city, state, country, and zip transfer as Account Name and address fields. Odoo parent-company hierarchies (parent_id) map to Account.ParentAccountId, but circular references are flagged before the migration commits so the admin can resolve them manually.
Odoo Field Service
Product (product.product)
Microsoft Dynamics 365 Sales
Product
1:1Odoo products used on field-service tasks — including service products, spare parts, and consumables — map directly to Dynamics Products. Field mapping covers product Name, default_code (SKU), description, and product type (service versus stock). Products that exist in Odoo without a SKU are automatically assigned a system-generated alphanumeric code during migration to satisfy Dynamics's required ProductNumber field.
Odoo Field Service
Employee (hr.employee)
Microsoft Dynamics 365 Sales
SystemUser
1:1Odoo employees assigned to tasks are resolved to Dynamics SystemUser records by email match. The Odoo employee internal reference is stored as a custom field (fs_employee_id__c) for reconciliation. If an employee has no matching Dynamics user, the task owner defaults to the migration service account and is flagged for admin reassignment.
Odoo Field Service
Task Assignees (task.employee.ids)
Microsoft Dynamics 365 Sales
OwnerId + Custom Multi-Assignee Field
1:manyOdoo allows multiple employees on a single task. We map the primary assignee (first in sequence) to the Dynamics OwnerId field. Any secondary assignees are stored as a semicolon-separated string in a custom text field (fs_secondary_assignees__c) for admin review and manual resolution in Dynamics.
Odoo Field Service
Attachment / IrAttachment
Microsoft Dynamics 365 Sales
SharePoint / Dataverse File
1:1Task attachments — images, signed PDFs, photos — are downloaded from Odoo's filestore and re-uploaded to the SharePoint document library linked to the Work Order table, or stored as Dataverse File fields. The original filename and Odoo attachment ID are preserved in custom reference fields on the Dynamics record.
Odoo Field Service
Chatter / MailMessage
Microsoft Dynamics 365 Sales
Annotation
1:1Task chatter (internal notes, customer replies, system notifications) is extracted as MailMessage records and written as Dataverse Annotations against the target Work Order record. Rich-text formatting is simplified to plain text during migration; original timestamps and author names are preserved.
Odoo Field Service
Stage (fsm.stage)
Microsoft Dynamics 365 Sales
Custom Option Set (fs_task_stage__c)
1:1Odoo Kanban stage names have no direct equivalent in Dynamics. We create a custom Option Set field (fs_task_stage__c) on the Work Order table and seed it with every stage name found in the source Odoo database. Stage sequence numbers are stored in a separate integer field for optional ordering logic.
Odoo Field Service
Custom Field (x_ fields / ir.model.fields)
Microsoft Dynamics 365 Sales
Custom Column (fs_x_ field__c)
1:1Odoo custom fields created via Settings or Python are identified during the audit phase and created as Dataverse custom columns on the target Work Order table. Field types are translated: selection fields become Option Sets, many2one fields become Lookups, and monetary fields become Decimal fields with appropriate precision.
Odoo Field Service
Planned Hours / Effective Hours
Microsoft Dynamics 365 Sales
EstimatedDurationMinutes / ActualDurationMinutes
1:1Odoo stores planned and actual hours as Float fields (uom_hour). These are multiplied by 60 and stored as Dynamics Duration fields in minutes, which is the standard Dataverse duration unit. If Odoo uses a different UoM, a conversion factor is applied from the product's uom_id.
Odoo Field Service
Task User (res.users)
Microsoft Dynamics 365 Sales
SystemUser
1:1Odoo's internal user record (res.users) for task creation and last-write tracking is matched to a Dynamics SystemUser by email. The Odoo user login is stored as fs_created_by_login__c for reference. Users without a Dynamics account are noted in the pre-migration audit report.
| Odoo Field Service | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Task (fsm.worker.task) | msdyn_workorderservicetask / Custom Work Order Table1:1 | Fully supported | |
| Contact / Partner (res.partner) | Contact1:1 | Fully supported | |
| Company (res.partner type='company') | Account1:1 | Fully supported | |
| Product (product.product) | Product1:1 | Fully supported | |
| Employee (hr.employee) | SystemUser1:1 | Fully supported | |
| Task Assignees (task.employee.ids) | OwnerId + Custom Multi-Assignee Field1:many | Fully supported | |
| Attachment / IrAttachment | SharePoint / Dataverse File1:1 | Fully supported | |
| Chatter / MailMessage | Annotation1:1 | Fully supported | |
| Stage (fsm.stage) | Custom Option Set (fs_task_stage__c)1:1 | Fully supported | |
| Custom Field (x_ fields / ir.model.fields) | Custom Column (fs_x_ field__c)1:1 | Fully supported | |
| Planned Hours / Effective Hours | EstimatedDurationMinutes / ActualDurationMinutes1:1 | Fully supported | |
| Task User (res.users) | SystemUser1: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 Field Service gotchas
Database version upgrade is not a direct restore
Custom fields use x_ column naming that can collide
ir.attachment binaries can exceed API upload limits
Chatter messages use HTML that requires sanitization
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
Schema design and Dynamics solution preparation
We audit the Odoo Field Service configuration — task fields, Kanban stages, custom fields via ir.model.fields, employee records, and attachment volumes. We then design the target Dynamics schema: either a custom Work Order Dataverse table or mapping to the msdyn_workorder entity, pre-seeded Option Sets for stage and priority values, custom columns for Odoo fields with no Dynamics equivalent, and SharePoint document-library configuration for attachments. The solution-component plan is delivered to your Dynamics admin for import before the migration date. This step blocks the data phase — no records move until the schema is confirmed.
User and contact resolution against Dynamics
We extract all Odoo res.partner contacts, res.partner companies, and hr.employee records and run them against the Dynamics API to match by email address. Matched records get the corresponding Dynamics ID written to a staging table. Unmatched records are grouped: contacts with no email, employees without a Dynamics user account, and companies that need to be created as new Account records. We deliver a resolution report with recommended actions — create missing users, invite employees to Dynamics, or accept default-ownership assignments — so nothing lands without an owner.
Chunked data extraction from Odoo XML-RPC API
We pull field-service tasks, chatter messages, and attachments from Odoo using the xmlrpc/2/object endpoint in batches of 1,000 records per call, following Odoo's external API rate limits. Each batch is checkpointed to local storage so that an interrupted run resumes from the last successful batch rather than restarting. Attachments are downloaded in parallel streams and stored temporarily with a manifest linking each file to its parent task ID. Custom field definitions are read from ir.model.fields to build the field-type translation map before the field-level migration script is generated.
Sample migration with field-level diff
A representative slice — typically 100–300 task records spanning the full range of stages, priorities, and attachment types — is migrated first. We generate a field-level diff report comparing source Odoo values against the Dynamics record values after transformation. The diff surfaces picklist unmapped values, assignee resolution failures, attachment download errors, and chatter conversion anomalies. You review the diff and approve or request corrections before the full migration runs. Stage-to-Option-Set mapping and multi-assignee handling are validated at this step.
Full migration with delta pickup and audit log
The complete task dataset, contacts, companies, products, and chatter history is migrated in batched API calls to Dynamics. Attachments are uploaded to SharePoint or Dataverse Files and linked back to their parent Work Order records. Timestamps from Odoo (create_date, write_date, stage-entered dates) are preserved in custom datetime fields since Dynamics system fields are stamped at migration time. A 24–48 hour delta-pickup window follows the cutover: any Odoo tasks modified or created during the migration window are fetched and written to Dynamics. An audit log records every create and update operation with the source Odoo ID for rollback if reconciliation fails.
Platform deep dives
Odoo Field Service
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Odoo Field Service and Microsoft Dynamics 365 Sales .
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo Field Service and Microsoft Dynamics 365 Sales .
Object compatibility
All 8 core objects map 1:1 between Odoo Field Service and Microsoft Dynamics 365 Sales .
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 Field Service: Not publicly documented; Odoo documentation notes timeout thresholds for large exports and imports that effectively cap batch size.
Data volume sensitivity
Odoo Field Service 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 Field Service to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Field Service 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 Field Service
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.