CRM migration
Field-level mapping, validation, and rollback between Odoo Field Service and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Odoo Field Service
Source
Freshsales
Destination
Compatibility
12 of 13
objects map 1:1 between Odoo Field Service and Freshsales.
Complexity
BStandard
Timeline
48–72 hours
Overview
Odoo Field Service stores field operations as fsm.order tasks linked to res.partner contacts, fsm.location sites, and project.timesheet entries — a task-centric, ERP-integrated model. Freshsales is a standard CRM that splits prospects into Lead and Contact objects, manages Accounts, and tracks Deals through a pipeline. The migration must translate Odoo's task hierarchy and location associations into Freshsales entities, resolve Odoo worker logins to Freshsales users by email, and preserve timesheet data as custom fields or activity logs on the relevant Deals or Contacts. Freshsales has no native field-service scheduling, Gantt, or map-view equivalent — those dimensions of Odoo data are surfaced as custom fields for reference and rebuilt manually in Freshsales workflows. FlitStack uses Odoo's XML-RPC API to export records and Freshsales REST API to create matching entities, with a 24–48 hour delta-pickup window capturing changes during cutover. Workflows, automation rules, and project dependencies do not migrate — FlitStack exports Odoo workflow definitions as a rebuild specification for your Freshsales admin.
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 Freshsales, 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
Freshsales
Contact + Account
many:1Odoo res.partner records (customers and companies combined) split into Freshsales Account (company-level data) and Contact (individual person). When partner_id has child contacts in Odoo, those become separate Freshsales Contact records linked to the same Account via Account Contact Relationships, preserving the hierarchical structure and ensuring all related contacts are accessible from the parent Account record.
Odoo Field Service
fsm.order
Freshsales
Deal + Task
1:1fsm.order task records map to Freshsales Deal (Opportunity) for the commercial dimension and to Task records for the activity log. Deal.Amount pulls from fsm_order.total_amount_revenue_line_ids; Task records preserve the fsm_order.description, stage history, and technician assignments as activity notes, maintaining complete audit trail of all field service activities and their financial impact.
Odoo Field Service
fsm.location
Freshsales
Account + Custom Fields
1:1fsm.location site records map to Freshsales Account with address fields populated from location.street, location.city, location.zip. GPS coordinates (location.partner_latitude, location.partner_longitude) migrate to custom number fields on the Account. The location.contact_id partner link resolves to a Contact record first, ensuring accurate assignment and preventing orphaned location data in the target system.
Odoo Field Service
fsm.worker
Freshsales
User + Contact Custom Fields
1:1Odoo fsm_worker records link to res_users for login credentials. The worker.partner_id res.partner becomes a Freshsales Contact record. Worker skills (worker.skill_ids) and team assignments (worker.team_id) migrate as custom pick-list and multi-select fields on the Contact so the technician profile is preserved.
Odoo Field Service
fsm.stage
Freshsales
Deal Stage
1:1Odoo fsm_stage.name values map to Freshsales Deal StageName via value-by-value mapping. Stage sequence (stage.sequence) determines the order in Freshsales pipeline. If fsm_stage.fold is True, the stage is marked as Closed/Won or Closed/Lost in Freshsales based on business rules defined during scoping.
Odoo Field Service
project.project
Freshsales
Deal Custom Fields
1:1Odoo project.project records linked to fsm_order map to Freshsales custom fields on the Deal — specifically Project_Name__c (text) and Project_ID__c (text) capture the source project reference. Project.task_count migrates as an integer custom field for reporting continuity, allowing teams to track project-related metrics and maintain visibility into field service operations tied to specific projects.
Odoo Field Service
project.task
Freshsales
Task + Deal Custom Fields
1:1Odoo project_task records linked to fsm_order migrate as Freshsales Task records. Task.name maps to Task.Subject, task.description to Task.Description, task.stage_id.name to Task.Status. Parent task hierarchy is not preserved natively in Freshsales — FlitStack captures it as a custom text field (Parent_Task_Reference__c) for manual reconstruction.
Odoo Field Service
project.timesheet
Freshsales
Task + Custom Fields
1:1Timesheet entries (project_timesheet with line_id linking to fsm_order) migrate as Freshsales Tasks with Type='Time Entry'. The timesheet.hours value populates a custom Hours_Logged__c number field; timesheet.date becomes the Task.ActivityDate. Original user_id resolves to Freshsales User by email match, ensuring accurate assignment of time entries to the correct technician in the target system.
Odoo Field Service
ir.attachment
Freshsales
Files
1:1Odoo ir_attachment records on fsm_order, project_task, and res_partner migrate as Freshsales Files attached to the corresponding Deal, Task, or Contact. File size limits of 25MB per file apply; files exceeding this threshold are flagged for chunked re-upload or alternative delivery.
Odoo Field Service
account.move
Freshsales
Deal Custom Fields + External Reference
1:1Odoo invoices (account_move) linked to fsm_order are not replicated as Freshsales billing records (Freshsales manages deals, not accounting). Instead, account_move.name and account_move.amount_total migrate as custom text and currency fields on the related Deal — Invoice_Number__c and Invoice_Total__c — preserving the financial reference.
Odoo Field Service
res.users
Freshsales
User
1:1Odoo res_users records map to Freshsales Users by email address match. Active status (res_users.active=True) determines Freshsales User status. Unmatched users are flagged before migration — teams either invite them to Freshsales or assign their records to a fallback owner, ensuring no data is lost due to missing user accounts in the target system.
Odoo Field Service
Custom field: fsm_order.priority
Freshsales
Deal Custom Field
1:1Odoo fsm_order.priority selection field (very high/high/normal/low/very low) maps to Freshsales custom pick-list Deal_Priority__c with the same values. Stage-entered timestamps from fsm_order.stage_date are preserved as custom datetime fields for reporting continuity, allowing teams to analyze response times and prioritize follow-up activities based on original service level commitments.
Odoo Field Service
Custom field: fsm_order.sla_deadline
Freshsales
Deal Custom Field
1:1SLA deadline (fsm_order.sla_deadline datetime) migrates to Freshsales custom datetime field SLA_Deadline__c on the Deal. Odoo SLA map configuration is not transferable — this field preserves the reference date for Freshsales-side workflow triggers, enabling teams to set up automated reminders and escalations based on original service level agreements established in Odoo.
| Odoo Field Service | Freshsales | Compatibility | |
|---|---|---|---|
| res.partner | Contact + Accountmany:1 | Fully supported | |
| fsm.order | Deal + Task1:1 | Fully supported | |
| fsm.location | Account + Custom Fields1:1 | Fully supported | |
| fsm.worker | User + Contact Custom Fields1:1 | Fully supported | |
| fsm.stage | Deal Stage1:1 | Fully supported | |
| project.project | Deal Custom Fields1:1 | Fully supported | |
| project.task | Task + Deal Custom Fields1:1 | Fully supported | |
| project.timesheet | Task + Custom Fields1:1 | Fully supported | |
| ir.attachment | Files1:1 | Fully supported | |
| account.move | Deal Custom Fields + External Reference1:1 | Fully supported | |
| res.users | User1:1 | Fully supported | |
| Custom field: fsm_order.priority | Deal Custom Field1:1 | Fully supported | |
| Custom field: fsm_order.sla_deadline | Deal Custom Field1: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
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
Inventory Odoo records and resolve foreign key dependencies
FlitStack connects to Odoo via XML-RPC using your database credentials and lists all fsm_order, fsm_location, fsm_worker, project_project, project_task, project_timesheet, res_partner, res_users, and account_move records. We identify foreign key dependencies — particularly fsm_order.partner_id, fsm_order.location_id, and timesheet.user_id — and build a dependency graph so Accounts and Contacts are created before Deals. Any circular references or missing linked records are flagged in a pre-migration report.
Create Freshsales schema: custom fields, pipeline stages, and user accounts
Before data moves, your Freshsales admin (or FlitStack) creates the custom fields required by the migration: Location_Latitude__c, Location_Longitude__c, Territory__c, Deal_Priority__c, SLA_Deadline__c, Hours_Logged__c, Invoice_Number__c, Invoice_Total__c, Source_System_ID__c, and Original_Create_Date__c on the appropriate entities. Freshsales pipeline stages are configured to match the fsm_stage values mapped during scoping. All Odoo res_users with active status are invited to Freshsales or mapped to existing users, ensuring continuity of ownership throughout the migration process.
Run sample migration with field-level diff on 100–500 representative records
A representative slice of fsm_order records (across stages, priorities, and worker assignments), linked contacts, accounts, locations, and timesheet entries migrates first. FlitStack generates a field-level diff comparing source Odoo values against Freshsales field values, verifying stage mapping, owner resolution, location coordinate preservation, and timesheet hour totals. You review the diff and approve before the full run commits. Any mapping adjustments are made in this phase.
Execute full migration with delta-pickup window and audit logging
The full migration runs against Freshsales REST API in batched operations. An audit log captures every record created, every custom field populated, and every owner assignment made. During cutover (typically 24–48 hours), FlitStack captures delta changes — new fsm_order records, updated stages, new timesheet entries — that occur in Odoo while the migration is running. At go-live, a final delta sync brings Freshsales to parity with Odoo's last state before the switch. One-click rollback reverts all Freshsales records if reconciliation reveals data integrity issues.
Platform deep dives
Odoo Field Service
Source
Strengths
Weaknesses
Freshsales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Freshsales.
Object compatibility
2 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 Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Field Service to Freshsales 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 Freshsales
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.