CRM migration
Field-level mapping, validation, and rollback between Odoo Field Service and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Odoo Field Service
Source
Salesforce Sales Cloud
Destination
Compatibility
10 of 12
objects map 1:1 between Odoo Field Service and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
48–72 hours
Overview
Odoo Field Service structures field-service data around three core models: res.partner (unifying contacts and companies), crm.lead (pre-conversion leads), and fsm.order (work orders with line items, equipment assignments, and location data). The platform stores tasks and project tasks as related records and exposes custom fields through Odoo's ir.model.fields system with no enforced naming convention. Salesforce Sales Cloud splits the equivalent into Account, Contact, Lead, Opportunity, WorkOrder, ServiceAppointment, and Asset — each with a rigid schema where custom fields require the __c suffix and a defined field type before data can land. FlitStack AI maps res.partner records into Account and Contact pairs (or Lead for unconverted records), fsm.order into Salesforce WorkOrder with ServiceAppointment children for each task, Odoo equipment into Salesforce Asset with a location lookup, and Odoo location records into Salesforce Account Address fields or custom location objects. Custom fields on fsm.order and res.partner are inventoried from ir.model.fields, translated to Salesforce custom field definitions, and deployed before the migration run. Odoo attachments re-upload to Salesforce Files. Odoo workflows and automation rules do not migrate — FlitStack provides an export of those definitions as a rebuild reference for Salesforce Flow. The migration runs through Salesforce Bulk API for high-volume record sets, with the Data Loader as a fallback for smaller volumes. Owner resolution uses email matching against Salesforce users, with unmatched owners flagged before the run commits.
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 Odoo Field Service object lands in Salesforce Sales Cloud, 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
res.partner (company type)
Salesforce Sales Cloud
Account
1:1Odoo res.partner records where is_company=True map to Salesforce Account. The Account.Name pulls from partner.name; Account.Website from partner.website; Account.Industry from a value-mapped partner.industry field. Industry mapping uses a lookup table to reconcile Odoo's configurable industry selections against Salesforce's standard Industry pick-list values. Records with unmapped industry values default to 'Other' with the original value preserved in a custom Industry_Source__c field for post-migration cleanup.
Odoo Field Service
res.partner (person type)
Salesforce Sales Cloud
Contact
1:1Odoo res.partner records where is_company=False map to Salesforce Contact, linked via AccountId to the parent Account. partner.email maps to Contact.Email; partner.phone to Contact.Phone; partner.mobile to Contact.MobilePhone. Contacts without an email address are flagged for manual review since Salesforce requires Email on standard Lead conversion paths. The partner.function field populates Contact.Title, and partner.lang maps to Contact.Languages__c if your org uses the multilingual configuration.
Odoo Field Service
res.partner (unconverted lead)
Salesforce Sales Cloud
Lead
1:manyOdoo partners with partner_type='lead' or that have never been converted to opportunities map to Salesforce Lead rather than Contact. The partner.name becomes Lead.Company; partner.email becomes Lead.Email; partner.function becomes Lead.Title. Leads retain the original Odoo create_date in Lead.CreatedDate__c for historical tracking. If the partner has any fsm.order history, the Lead stores a reference to the migrated WorkOrder count in a custom Lead.Work_Orders_Pre_Conversion__c field to preserve service context.
Odoo Field Service
fsm.order
Salesforce Sales Cloud
WorkOrder
1:1Odoo fsm.order maps directly to Salesforce WorkOrder. WorkOrder.Subject pulls from fsm.order.name; WorkOrder.ServiceAddress from fsm.location; WorkOrder.AssetId from the mapped equipment-to-Asset lookup; WorkOrder.AccountId from the partner on the order. The Odoo fsm.order priority integer (1–4) maps to WorkOrder.Priority through the configured value-mapping table. Order description text from fsm.order.note populates WorkOrder.Description for full work-order context.
Odoo Field Service
fsm.order.line
Salesforce Sales Cloud
WorkOrderLineItem
1:1Odoo fsm.order line items (product lines on a work order) map to Salesforce WorkOrderLineItem, linked by WorkOrderId. product_id resolves to the Salesforce Product2 reference; product_uom_qty and price_unit translate to Quantity and UnitPrice. Product matching prioritizes exact SKU alignment, then falls back to product name fuzzy-match against active Product2 records. Products with no Salesforce match are held in a staging table for product creation before the migration run commits.
Odoo Field Service
fsm.task / project.task
Salesforce Sales Cloud
ServiceAppointment
1:1Odoo tasks linked to fsm.order map to Salesforce ServiceAppointment child records under the WorkOrder. scheduled_date_start/end from fsm.task.date_begin/date_end; user_id resolved by email match to Salesforce users for assignment. If no matching ServiceResource exists for the technician, FlitStack creates one using the Odoo user record as the source, enabling the ServiceAppointment to link natively. Task tags (fsm.tag) translate to ServiceAppointment custom fields or Skills records if your org uses the Skills Management feature.
Odoo Field Service
fsm.equipment
Salesforce Sales Cloud
Asset
1:1Odoo fsm.equipment maps to Salesforce Asset. Asset.Name from equipment.name; Asset.SerialNumber from equipment.serial_no; Asset.AccountId from the partner to whom the equipment is assigned; Asset.InstallDate from equipment.date_put_in_service. Equipment.model reference populates Asset.Model__c; equipment.notes map to Asset.Description. The Asset Status field defaults based on equipment.active — active equipment becomes 'Active', inactive records become 'Retired'.
Odoo Field Service
fsm.location
Salesforce Sales Cloud
Account (billing/shipping address) / Custom Address field
1:1Odoo fsm.location records (service sites) map to Account address fields on the linked partner account. street, city, zip, country map to BillingAddress/ShippingAddress on Account. If the location has custom fields, those translate to custom fields on Account. Locations without a linked partner become standalone Account records with the location name as Account.Name and a Location_Type__c flag set to 'Service Site'. Geographic coordinates (lat/long) from fsm.location map to Account.GPS_Location__c for dispatch map rendering.
Odoo Field Service
ir.attachment
Salesforce Sales Cloud
ContentDocument / Salesforce Files
1:1Odoo ir.attachment records linked to fsm.order or res.partner re-upload to Salesforce Files (ContentDocument/ContentVersion). The original file name and MIME type are preserved. Files are linked to the parent Salesforce object by ContentDocumentLink. Attachments exceeding Salesforce's 25MB per-file limit are split into multi-part uploads with a manifest linking the fragments. Image attachments (MIME image/*) set ContentDocument.FileType to match the source format.
Odoo Field Service
Custom fields on fsm.order / res.partner
Salesforce Sales Cloud
Custom fields (__c) on WorkOrder / Account / Contact
1:1Odoo's ir.model.fields custom fields on fsm.order and res.partner are inventoried per model, translated to Salesforce custom field definitions (type, label, pick-list values), and deployed to Salesforce Setup before the migration run. Each field requires a manual __c field creation step or an API-based metadata deployment.
Odoo Field Service
project.project (Field Service projects)
Salesforce Sales Cloud
Salesforce Project (custom object)
1:1Odoo project.project records linked to Field Service map to a Salesforce custom Project__c object if your org has the Salesforce Field Service managed package installed. project.name becomes Project__c.Name; project.user_id resolves by email match to a Salesforce user. Project dates (date_start, date_end) map to Project__c.Start_Date__c and Project__c.End_Date__c. The project.linked_task_count is stored in Project__c.Task_Count__c to preserve the scope scale of each migrated project.
Odoo Field Service
sale.order (linked to fsm.order)
Salesforce Sales Cloud
Opportunity / Order
many:1Odoo sale.order records associated with fsm.order merge into Salesforce Opportunity for the sales side and Salesforce Order for fulfillment tracking. The opportunity amount and stage reflect the linked sale.order state; order records capture line items and delivery status. sale.order.client_order_ref maps to Order.PoNumber for invoice matching. The order's incoterms field populates Order.ShippingMethod__c when available, otherwise defaults to the standard carrier configuration.
| Odoo Field Service | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| res.partner (company type) | Account1:1 | Fully supported | |
| res.partner (person type) | Contact1:1 | Fully supported | |
| res.partner (unconverted lead) | Lead1:many | Fully supported | |
| fsm.order | WorkOrder1:1 | Fully supported | |
| fsm.order.line | WorkOrderLineItem1:1 | Fully supported | |
| fsm.task / project.task | ServiceAppointment1:1 | Fully supported | |
| fsm.equipment | Asset1:1 | Fully supported | |
| fsm.location | Account (billing/shipping address) / Custom Address field1:1 | Fully supported | |
| ir.attachment | ContentDocument / Salesforce Files1:1 | Fully supported | |
| Custom fields on fsm.order / res.partner | Custom fields (__c) on WorkOrder / Account / Contact1:1 | Fully supported | |
| project.project (Field Service projects) | Salesforce Project (custom object)1:1 | Fully supported | |
| sale.order (linked to fsm.order) | Opportunity / Ordermany: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
Salesforce Sales Cloud gotchas
Workflow Rules and Process Builder are retired
Bulk API batch quota exhaustion during large imports
Storage overage billing is non-obvious
Account-Contact many-to-many relationship mapping
Territory and team member import ordering dependencies
Pair-specific challenges
Migration approach
Discover Odoo data model and plan Salesforce schema
FlitStack AI connects to the Odoo database via XML-RPC or direct PostgreSQL access to inventory all active records: res.partner (contacts and companies), fsm.order and fsm.order.line, fsm.task, fsm.equipment, fsm.location, and project.project records linked to Field Service. We query ir.model.fields to enumerate every custom field on each model, record its Odoo field type, and flag any technical name that would collide with Salesforce reserved words. In parallel, we review your Salesforce org: existing Account and Contact data, installed Field Service managed package, any existing WorkOrder or Asset records, and record type configuration. This produces a Migration Scope Document that lists every object and custom field that needs a Salesforce target.
Build field-level mapping and deploy Salesforce custom fields
FlitStack AI generates the complete field mapping from the object mapping phase — direct field pairs, value-mapping definitions for pick-lists (stage names, priority levels), and custom field definitions for every Odoo ir.model.fields entry. Custom fields are deployed to your Salesforce org via the Metadata API before any data moves, so the target schema is ready when the migration runs. For the fsm.order-to-WorkOrder mapping, we create the Scheduling Policy and Service Territory configuration plan as a separate Salesforce admin guide so your team can pre-build those objects. Owner resolution uses email matching: every Odoo user_id on fsm.order and project.task is cross-referenced against Salesforce User records by email, with unmatched owners flagged for your team to create Salesforce users or assign to a fallback.
Run a sample migration with field-level diff
A representative slice of 50–200 records migrates first: a sample of res.partner records, fsm.orders spanning two or three stage values, associated fsm.equipment, and linked attachments. We generate a field-level diff report comparing source values to the Salesforce destination values for every mapped field, so you can verify that stage name mapping, equipment-to-Asset resolution, location-to-address translation, and owner resolution all produced the expected results. Any mapping errors discovered in the sample are corrected before the full run. This phase also surfaces data quality issues — duplicate partners, missing location records, unresolvable equipment — that your team can address before the full cutover.
Execute full migration with delta-pickup and reconciliation
The full migration runs in Salesforce Bulk API batches (or Data Loader batches for smaller volumes), respecting API rate limits to avoid blocking your org's normal operations. A delta-pickup window of 24–48 hours after the initial full run captures any fsm.orders created or completed in Odoo during the cutover window. After the migration, we run a reconciliation report: record counts by object, spot-checks on critical fields (WorkOrder.AccountId, ServiceAppointment.DueDate, Asset.SerialNumber), and identification of any records that failed to migrate due to data errors. A Salesforce snapshot is taken at migration close for one-click rollback if reconciliation reveals systemic issues. The final deliverable is an Audit Log covering every record operation and a Data Migration Summary for your compliance records.
Platform deep dives
Odoo Field Service
Source
Strengths
Weaknesses
Salesforce Sales Cloud
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 Field Service and Salesforce Sales Cloud.
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 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 Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Field Service to Salesforce Sales Cloud 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 Salesforce Sales Cloud
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.