CRM migration

Migrate from Odoo Field Service to Salesforce Sales Cloud

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 logo

Odoo Field Service

Source

Salesforce Sales Cloud

Destination

Salesforce Sales Cloud logo

Compatibility

83%

10 of 12

objects map 1:1 between Odoo Field Service and Salesforce Sales Cloud.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Odoo Field Service logo

Odoo Field Service

What's pushing teams away

  • High implementation cost: users report that per-user pricing plus partner consulting fees make Odoo FSM expensive relative to standalone FSM alternatives for teams under 20 users.
  • Steep learning curve: multiple reviews cite the broad feature set as overwhelming for new users, with onboarding requiring significant time investment before teams feel productive.
  • Bank reconciliation pain: uploading bank statements does not automatically match transactions to invoices, forcing manual review that frustrates accounting-focused users.
  • Mobile limitations in the field: users report difficulties accessing information on the mobile app in rural areas or with limited connectivity, directly undermining the field service use case.
  • Feature-rich but customization-heavy: power users note that achieving specific business workflows requires developer customization, which becomes technical debt during upgrades.

Choosing

Salesforce Sales Cloud logo

Salesforce Sales Cloud

What's pulling them in

  • The AppExchange marketplace with 5,000+ prebuilt apps gives enterprises integrations for nearly every business workflow without custom development.
  • Native Einstein AI for lead scoring, opportunity insights, and predictive forecasting adds intelligence without a separate platform purchase.
  • Territory management, multi-currency support, and advanced forecasting satisfy the needs of complex B2B sales organizations with structured revenue teams.
  • Slack, Tableau, and CPQ are deeply integrated into the core platform, keeping the sales stack unified for teams already in the Salesforce ecosystem.
  • Organizations with a large, established Salesforce implementation choose it because switching costs — integrations, custom code, trained admins — are prohibitive.

Object mapping

How Odoo Field Service objects map to Salesforce Sales Cloud

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)

maps to

Salesforce Sales Cloud

Account

1:1
Fully supported

Odoo 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)

maps to

Salesforce Sales Cloud

Contact

1:1
Fully supported

Odoo 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)

maps to

Salesforce Sales Cloud

Lead

1:many
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

WorkOrder

1:1
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

WorkOrderLineItem

1:1
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

ServiceAppointment

1:1
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

Asset

1:1
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

Account (billing/shipping address) / Custom Address field

1:1
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

ContentDocument / Salesforce Files

1:1
Fully supported

Odoo 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

maps to

Salesforce Sales Cloud

Custom fields (__c) on WorkOrder / Account / Contact

1:1
Fully supported

Odoo'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)

maps to

Salesforce Sales Cloud

Salesforce Project (custom object)

1:1
Fully supported

Odoo 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)

maps to

Salesforce Sales Cloud

Opportunity / Order

many:1
Fully supported

Odoo 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.

Gotchas + challenges

What specifically takes care here

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 logo

Odoo Field Service gotchas

High

Database version upgrade is not a direct restore

Medium

Custom fields use x_ column naming that can collide

Medium

ir.attachment binaries can exceed API upload limits

Low

Chatter messages use HTML that requires sanitization

Salesforce Sales Cloud logo

Salesforce Sales Cloud gotchas

High

Workflow Rules and Process Builder are retired

High

Bulk API batch quota exhaustion during large imports

Medium

Storage overage billing is non-obvious

Medium

Account-Contact many-to-many relationship mapping

Low

Territory and team member import ordering dependencies

Pair-specific challenges

  • Odoo custom field naming has no enforced convention, creating __c naming collision risk in Salesforce

    Odoo allows custom fields on fsm.order and res.partner with arbitrary technical names — some use snake_case, others camelCase, and some use reserved words like 'type' or 'state'. When these land in Salesforce, they must be translated to __c-suffixed API names that don't collide with existing fields. A field named x_type on fsm.order becomes a conflict risk with Salesforce's built-in record type field references. We pre-audit all custom field names from ir.model.fields and resolve naming collisions before generating Salesforce metadata, but any Odoo custom field using a Salesforce reserved word must be renamed in the source or mapped to an alternative target field.

  • Odoo's N:N equipment-to-order assignment requires junction-table mapping to Salesforce ServiceTerritory

    Odoo fsm.order supports multiple equipment assignments via an equipment_ids many2many field — a single work order can reference N pieces of equipment simultaneously. Salesforce's ServiceAppointment links to a single AssetId directly; complex multi-asset assignments require ServiceTerritory objects with associated ServiceResourceCapacity records, or a custom junction object. We map the primary equipment_id to the WorkOrder.AssetId and surface secondary equipment IDs in a custom multi-select field (Equipment_Ids__c) for reference, but this does not create native Salesforce scheduling dependencies for those secondary assets without a ServiceTerritory configuration that your admin must build post-migration.

  • Odoo field service lacks native offline capability, breaking technician continuity during cutover

    G2 reviewers consistently note that Odoo Field Service's mobile app depends on a live internet connection — work orders completed offline in the Odoo mobile app sync on reconnection, but those records may not be captured in the migration export window if the delta-pickup timing misses the sync event. Salesforce Field Service mobile supports offline mode natively, which is a key driver for this migration. We configure the delta-pickup window to align with your technicians' sync behavior and explicitly flag any fsm.order with a date_done within 48 hours of cutover for manual reconciliation after go-live.

  • Salesforce API rate limits cap bulk migration throughput, extending cutover windows for large record sets

    Salesforce enforces 100,000 daily API requests on Enterprise Edition plus 1,000 additional requests per user license, with Bulk API capped at 15,000 batches per day at 10,000 records per batch. Odoo's XML-RPC and JSON-RPC APIs export at full database speed with no equivalent throttling. For migrations exceeding 150,000 total records, the Salesforce API ceiling is the binding constraint — we batch migration runs to respect limits, which can extend the cutover window by 12–24 hours for large-volume scenarios. We monitor API consumption daily and pause the migration run automatically if usage exceeds 80% of the daily limit.

  • Odoo project.task stages do not translate to Salesforce ServiceAppointment scheduling policies

    Odoo project.task uses configurable stage records (stage_id) that define task state without any scheduling-policy association. Salesforce ServiceAppointment scheduling policies govern which technician resources can fulfill an appointment based on skill requirements, territory, and working hours. If your Odoo task stages encode skill or territory information (e.g., a stage named 'HVAC-Certified Only'), this encoding is lost in the migration unless your admin recreates it as Salesforce Scheduling Policy Work Rule records after migration. We preserve the original stage name as a custom field on ServiceAppointment (FSM_Stage__c), but the scheduling policy logic must be rebuilt in Salesforce FSL Setup.

Migration approach

Six steps for a successful Odoo Field Service to Salesforce Sales Cloud data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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

Context on both ends of the pair

Odoo Field Service logo

Odoo Field Service

Source

Strengths

  • All-in-one ERP integration: FSM tasks automatically link to Sales orders, Invoices, and Inventory without manual re-entry.
  • Multiple planning views: Kanban, Gantt, Calendar, and Map give dispatchers flexibility to plan by workflow, timeline, time slot, or geography.
  • Mobile app for field technicians: covers end-to-end task completion including worksheet filling, parts recording, and signature capture.
  • Free tier available: Odoo Online One App Free plan lets small teams evaluate FSM before committing to a paid subscription.
  • Open-source community: OCA maintains field-service-maintenance and other FSM extensions that extend functionality beyond the core module.

Weaknesses

  • Per-user pricing scales directly: every technician, dispatcher, and admin adds to the monthly bill, making it expensive for large field teams.
  • Bank reconciliation is manual: the accounting module does not auto-match bank statements to invoices, requiring accounting staff to review mismatches manually.
  • iOS navigation bug: clicking Navigate to on task locations fails on iOS devices, breaking route planning in the field for Apple users.
  • Upgrade path requires OpenUpgrade: Odoo database upgrades between versions are not simple restores; community users must use OCA/OpenUpgrade scripts or migrate one version at a time.
  • Limited standalone FSM branding: the module is positioned as one app within the Odoo suite rather than a dedicated FSM product, making it harder to evaluate in isolation.
Salesforce Sales Cloud logo

Salesforce Sales Cloud

Destination

Strengths

  • Largest enterprise app ecosystem in CRM with 5,000+ AppExchange integrations covering nearly every vertical workflow.
  • Native Einstein AI delivers lead scoring, opportunity insights, and predictive forecasting without a third-party layer.
  • Advanced territory management, multi-currency, and flexible forecasting satisfy complex B2B revenue structures.
  • Deep platform extensibility: Custom Objects, Apex, Flow, and the Metadata API allow full schema customization.
  • Well-documented REST API, Bulk API, and Composite API with published rate limits for programmatic migration.

Weaknesses

  • Pricing model is layered and opaque in practice: per-seat fees plus storage overages, add-on subscriptions, and annual uplifts compound to 30–40% above sticker price.
  • Workflow Rules and Process Builder are deprecated, forcing all orgs onto Salesforce Flow — a migration task that catches many teams by surprise.
  • Steep administrative complexity: meaningful configuration requires a dedicated Salesforce admin or consultant.
  • API rate limits are edition-gated (100k/day base for Enterprise) and easily exhausted by large historical imports without throttling.
  • Data export is exportable via Data Loader but preserving relationship integrity across 30+ objects requires careful ETL sequencing.

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo Field Service and Salesforce Sales Cloud.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Odoo Field Service: Not publicly documented; Odoo documentation notes timeout thresholds for large exports and imports that effectively cap batch size.

  • Data volume sensitivity

    B

    Odoo Field Service doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Odoo Field Service to Salesforce Sales Cloud migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Odoo Field Service to Salesforce Sales Cloud data migrations

Answers to the questions buyers ask most during Odoo Field Service to Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most Odoo Field Service to Salesforce Sales Cloud migrations complete in 48–72 hours of clock time for under 50,000 total records across res.partner, fsm.order, fsm.task, and fsm.equipment. Setups exceeding 200,000 records or with more than 30 custom fields per Odoo model extend to 5–10 days, primarily because each custom field requires a separate Salesforce metadata deployment and validation pass before data can land. The sample migration and field-level diff phase typically takes one business day and runs before the production cutover window opens.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Odoo Field Service.
Land in Salesforce Sales Cloud, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day