CRM migration
Field-level mapping, validation, and rollback between Salesforce Field Service and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Salesforce Field Service
Source
Odoo CRM
Destination
Compatibility
13 of 13
objects map 1:1 between Salesforce Field Service and Odoo CRM.
Complexity
BStandard
Timeline
72–120 hours
Overview
Salesforce Field Service stores dispatch schedules in WorkOrder and ServiceAppointment objects with specialized resource-availability logic, skill-matching, and geographic routing that sit on top of the Salesforce CRM core. Odoo CRM handles leads, opportunities, and project-based tasks in a unified crm.lead model and project.task structure without a native field-service optimization engine. We migrate the data layer: accounts, contacts, leads, opportunities, work orders, appointments, service resources, and activities — preserving original create dates, owner assignments, and scheduling timestamps. What does not migrate: Salesforce OmniStudio flows, Dynamic Forms, FSL optimization policies, Dispatcher Console configurations, and entitlement rules. Those require Odoo studio configuration or custom development post-migration. We export your Salesforce workflow definitions as JSON reference files for your Odoo implementation team to rebuild in Odoo Studio. The migration runs via Salesforce REST/Bulk API against Odoo's XML-RPC interface, with a 24–48 hour delta-pickup window capturing any records created or updated during cutover. Before migration begins, FlitStack AI validates field-level compatibility and generates a pre-migration audit report identifying any data quality issues that need resolution.
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 Salesforce Field Service 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.
Salesforce Field Service
Account
Odoo CRM
res.partner
1:1Salesforce Account maps directly to Odoo res.partner in company mode. The primary address, phone, website, and industry fields transfer directly. Parent-account hierarchies map to Odoo's commercial_partner_id field for hierarchical reporting. Multi-site accounts (Salesforce child locations) become separate res.partner records linked via parent_id to preserve site-level detail.
Salesforce Field Service
Contact
Odoo CRM
res.partner (individual)
1:1Salesforce Contact maps to res.partner in individual mode. First name, last name, email, phone, mobile, title, and mailing address fields transfer directly. The Salesforce contact-account relationship maps to Odoo's partner_id field on the individual res.partner record. If a Salesforce Contact has no associated Account, the individual partner record is created without a parent link.
Salesforce Field Service
Lead
Odoo CRM
crm.lead
1:1Salesforce Lead maps to Odoo crm.lead with the Lead radio button selected. Standard fields — Name, Company, Email, Phone, Status, Rating, Source, Annual Revenue, Number of Employees — transfer directly. The Salesforce IsConverted flag determines whether the Odoo crm.lead lands as a new opportunity or merges with an existing partner record. Unconverted leads map as open crm.lead records.
Salesforce Field Service
Opportunity
Odoo CRM
crm.lead (opportunity mode)
1:1Salesforce Opportunity maps to an Odoo crm.lead with the Opportunity radio button selected, using the Sales tab. Stage, Amount, Close Date, Probability, and Description transfer directly. The Opportunity's AccountId lookup resolves to the corresponding res.partner id already migrated from the Accounts step. Stage probability percentages are recalculated to Odoo's default scale during the mapping phase, with the original Salesforce probability preserved in a custom field for reporting continuity.
Salesforce Field Service
WorkOrder
Odoo CRM
project.task
1:1Salesforce WorkOrder is the primary field-service record and maps to Odoo project.task linked to a dedicated project. Subject, Description, Status, Priority, and Scheduled Start/End dates transfer directly. AccountId resolves to the migrated res.partner record. The work order's address maps to the task's Planned Date range. Custom fields on WorkOrder (e.g., WorkOrderType__c, ResolutionCode__c) migrate as Odoo custom fields on project.task. The original WorkOrderNumber is preserved in a custom field for audit traceability.
Salesforce Field Service
ServiceAppointment
Odoo CRM
calendar.event
1:1Salesforce ServiceAppointment maps to Odoo calendar.event linked to the project.task created from the parent WorkOrder. Subject, Status, EarliestStartTime, DueDate, and actual travel time fields transfer to the calendar event's start_datetime, stop_datetime, and duration. The assigned ServiceResource resolves to the Odoo user who owns the calendar event. Status mapping: Scheduled → Open, In Progress → Confirmed, Completed → Held, Cancelled → Cancelled.
Salesforce Field Service
ServiceResource
Odoo CRM
res.users
1:1Salesforce ServiceResource maps to Odoo res.users by email matching — each service technician's Salesforce UserId email resolves to an Odoo user account created before migration. The resource type (technician vs. dispatcher) maps to Odoo's access rights group membership. Salesforce ResourceAbsence records (vacation/availability windows) transfer to Odoo's resource.calendar.leaves table so vacation schedules carry over.
Salesforce Field Service
OperatingHours
Odoo CRM
resource.calendar
1:1Salesforce OperatingHours define availability windows and timezone settings for service territories. These map to Odoo resource.calendar records with time slots converted from Salesforce's weekly-hour structure to Odoo's hour-line model. The timezone field on OperatingHours sets the resource.calendar's timezone. If multiple operating hours exist per territory, each creates a separate calendar linked to the corresponding service resource group.
Salesforce Field Service
WorkOrderLineItem
Odoo CRM
sale.order.line (linked to project.task)
1:1Salesforce WorkOrderLineItem records (line items for parts, labor, and services on a work order) map to Odoo sale.order.line records generated from the Odoo Sale Orders app linked to the project.task. Product lookup resolves by SKU matching to Odoo product.product. Quantity, unit price, and description transfer directly. If the source line item has no Odoo product match, a placeholder product is created with the original description and a zero price for post-migration review.
Salesforce Field Service
Task (Salesforce standard activity)
Odoo CRM
mail.activity
1:1Salesforce Tasks attached to WorkOrders, Accounts, or Contacts map to Odoo mail.activity records linked to the corresponding migrated record (project.task, res.partner, or crm.lead). Subject, Status, Activity Date, Priority, and Description transfer directly. The task owner resolves by email match to the Odoo user. Completed tasks appear as closed activities in Odoo's chatter thread.
Salesforce Field Service
Event (Salesforce standard activity)
Odoo CRM
calendar.event
1:1Salesforce Events linked to field records map to Odoo calendar.event. Subject, StartDateTime, EndDateTime, Location, and Description transfer directly. The WhoId (Contact/Lead) resolves to the migrated res.partner or crm.lead. The WhatId (WorkOrder or Account) resolves to the migrated project.task or res.partner. Recurring events are not migrated as recurring Odoo events — each occurrence becomes a separate calendar.event record.
Salesforce Field Service
Attachment / ContentDocument
Odoo CRM
ir.attachment
1:1Salesforce ContentDocuments and Notes attached to WorkOrders, ServiceAppointments, or Accounts migrate as ir.attachment records in Odoo linked to the corresponding model (project.task, res.partner, crm.lead). Files are downloaded from Salesforce and re-uploaded to Odoo's filestore. File size limits: Odoo allows attachments up to the file system limit; Salesforce's 25MB per-file limit is preserved as a hard boundary during export. Rich-text note bodies migrate as ir.attachment records of type binary with a text_description field populated from the source body.
Salesforce Field Service
Custom Object (FSL extension)
Odoo CRM
Custom Model (ir.model + ir.model.fields)
1:1Any Salesforce custom objects used to extend WorkOrder (e.g., InspectionResult__c, SafetyCheck__c) map to Odoo custom models created in developer mode. Each custom object becomes a new Odoo model inheriting from mail.thread, with fields defined using Odoo's field type system. Relationships to WorkOrder (now project.task) are preserved as many2one fields pointing to project.task. Your Odoo administrator creates these models in the Odoo Settings > Technical > Models panel before the migration run.
| Salesforce Field Service | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account | res.partner1:1 | Fully supported | |
| Contact | res.partner (individual)1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Opportunity | crm.lead (opportunity mode)1:1 | Fully supported | |
| WorkOrder | project.task1:1 | Fully supported | |
| ServiceAppointment | calendar.event1:1 | Fully supported | |
| ServiceResource | res.users1:1 | Fully supported | |
| OperatingHours | resource.calendar1:1 | Fully supported | |
| WorkOrderLineItem | sale.order.line (linked to project.task)1:1 | Fully supported | |
| Task (Salesforce standard activity) | mail.activity1:1 | Fully supported | |
| Event (Salesforce standard activity) | calendar.event1:1 | Fully supported | |
| Attachment / ContentDocument | ir.attachment1:1 | Fully supported | |
| Custom Object (FSL extension) | Custom Model (ir.model + ir.model.fields)1: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.
Salesforce Field Service gotchas
250-record batch limit for Enhanced Scheduling optimization
Process Builder workflows do not migrate—must be rebuilt in Flow Builder
API rate limits vary by edition and are easy to exhaust during bulk migration
Storage overages at $125/GB inflate migration data costs
Custom fields and lookups require explicit field-level mapping
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
Audit Salesforce Field Service data model and Odoo schema setup
FlitStack AI begins by cataloging every Salesforce object in scope — WorkOrder, ServiceAppointment, ServiceResource, OperatingHours, WorkOrderLineItem, and all standard CRM objects (Account, Contact, Lead, Opportunity, Task, Event, ContentDocument). We export the field list for each object, identify custom fields with __c suffix, and assess pick-list value sets for value-mapping preparation. In parallel, your Odoo administrator (or our team) activates developer mode and creates the custom fields on project.task, calendar.event, res.partner, and crm.lead that the migration requires. We deliver a schema setup checklist with exact field names, types, and Odoo model targets so the Odoo instance is migration-ready before any data moves.
Map FSL resource and territory data to Odoo user and calendar structures
Salesforce ServiceResources are resolved to Odoo res.users by email matching against the Salesforce User records that drive FSL authentication. OperatingHours are mapped to Odoo resource.calendar records with time slots converted from Salesforce's hour structure. Service territories (if used for geographic dispatch grouping) become Odoo project.team records or tags on project.task. Any Salesforce ResourceAbsence records (vacation blocks) migrate to Odoo resource.calendar.leave records so technician availability carries over. This step runs before WorkOrder migration so that the assigned technician lookups resolve correctly when tasks land in Odoo.
Extract and migrate CRM records first (Accounts, Contacts, Leads, Opportunities)
The migration follows a dependency order: Accounts → Contacts → Leads → Opportunities → WorkOrders → ServiceAppointments → Activities → Attachments. This ordering ensures foreign-key lookups resolve correctly — project.task records linking to AccountId must land after res.partner records exist, and calendar.event records for ServiceAppointments must land after project.task records. We extract each object from Salesforce using Bulk API 2.0, transform records per the field-mapping specification, and load via Odoo's XML-RPC API. Each object batch is validated against the Odoo schema before commit — records that fail validation are written to a separate error queue for review and retry.
Run a sample migration with field-level diff across WorkOrders and ServiceAppointments
Before the full migration runs, FlitStack AI extracts a representative slice — typically 100–500 records spanning WorkOrders at different stages, ServiceAppointments assigned to different technicians, and a sample of CRM records. The sample is loaded into a staging Odoo environment (or a duplicate Odoo database alongside production) and a field-level diff is generated comparing source values against destination values. You can verify that priority mapping, date conversion, owner resolution, and custom field population all meet expectations. Stage names, pick-list values, and status codes are spot-checked against the mapping specification. No full run commits until you approve the diff output.
Execute full migration with delta-pickup and post-load audit
The full migration runs in a planned low-activity window. Salesforce records are extracted in parallel batches, transformed per the approved mapping, and loaded into Odoo. A delta-pickup window of 24–48 hours after the initial load captures any WorkOrders, appointments, or CRM records created or updated in Salesforce during the migration run. All operations are logged in the FlitStack AI audit trail: object counts, failed records, skipped records, and transformation decisions. After the delta window closes, we run a reconciliation report comparing Salesforce record counts by object against Odoo record counts, flagging any discrepancies for manual review. One-click rollback reverts the Odoo database to its pre-migration state if reconciliation uncovers critical issues.
Deliver workflow reference export and post-migration handoff package
FlitStack AI exports your Salesforce workflow definitions, assignment rules, and process builder logic as JSON reference files. These files are not usable inside Odoo — they document what your Salesforce automation did so your Odoo administrator or consultant can rebuild equivalent logic in Odoo Studio. The handoff package includes the reconciliation report, a mapping summary CSV for each object, a list of Odoo custom fields created during setup, and the delta-pickup change log. We schedule a 30-minute handoff call to walk through the package and answer questions before closing the migration engagement.
Platform deep dives
Salesforce Field Service
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Salesforce Field Service and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Salesforce Field Service and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Salesforce Field Service 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
Salesforce Field Service: Per-org daily API limit starts at 100,000 requests / 24 hours for Enterprise Edition and scales with licenses purchased. Additional API calls can be purchased in 200-10,000 increments. Bulk API and Bulk API 2.0 share an allocation of 15,000 batch submissions per 24 hours. HTTP 429 returned when rate-limited..
Data volume sensitivity
Salesforce Field Service exposes a bulk API — large-volume migrations stream efficiently.
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 Salesforce Field Service to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Salesforce Field Service 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 Salesforce Field Service
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.