CRM migration
Field-level mapping, validation, and rollback between FieldFX and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
FieldFX
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between FieldFX and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
FieldFX is a field service management platform built on Salesforce — it uses standard Salesforce objects (Account, Contact) plus FieldFX-specific objects (Ticket, Job, Ticket Item, Asset, E-Ticketing) and a licensing model tied to named users and module add-ons. Odoo CRM uses a different paradigm: contacts and companies are both res.partner records, field service data is not a native concept, and automations live in Odoo Action Rules rather than Salesforce Flows. We map FieldFX Accounts to Odoo res.partner records with company_type='company', FieldFX Contacts to res.partner with company_type='person', FieldFX Tickets and Jobs to crm.opportunity records (or project.task if the team uses Odoo's project module), and FieldFX Ticket Items to sale.order.line records on a linked sale.order derived from the opportunity. FieldFX custom fields and DataGuide form-capture data migrate as Odoo custom fields on the corresponding model. Odoo does not have a native equivalent for FieldFX's scheduling dispatch, asset tracking, or timecard modules — those require Odoo Project + Timesheets and must be evaluated for fit post-migration. Workflows, approval chains, and FieldFX Status Workflows do not migrate; we export definitions as a rebuild reference for Odoo Action Rules. The migration runs against Odoo's XML-RPC / JSON-RPC API with rate-limit awareness, and uses the External API on Odoo Custom plan (which requires API access — not available on Community without a workaround).
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 FieldFX 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.
FieldFX
Account
Odoo CRM
res.partner (company_type = 'company')
1:1FieldFX Account records map to Odoo res.partner with company_type set to 'company'. The account name becomes partner name, website maps to website field, industry maps via Odoo's industry_id selection list, and parent-child company hierarchies map to Odoo's parent_id field on res.partner.
FieldFX
Contact
Odoo CRM
res.partner (company_type = 'person')
1:1FieldFX Contact records map to Odoo res.partner with company_type set to 'person'. Each contact is a separate partner record linked to its primary Account via the parent_id field. Multi-email addresses in FieldFX (email and secondary email fields) collapse to Odoo's single email field; additional emails are stored in a custom field.
FieldFX
Ticket
Odoo CRM
crm.opportunity
1:1FieldFX Ticket is the core work-order object with status, priority, and service-type fields. It maps to Odoo crm.opportunity (crm_lead model) — ticket name becomes opportunity name, ticket status maps to Odoo stage_id via value mapping, priority maps to a custom priority field, and the ticket's linked account and contact become Odoo's partner_id and contact_id. Ticket description and long-text fields map to Odoo's description field.
FieldFX
Job
Odoo CRM
project.project + project.task
1:1FieldFX Job records represent the work-order header in FX E-Ticketing and FX Schedule & Dispatch. They map to Odoo project.project as the project record, with individual Job Tasks mapping to project.task records linked to that project. Job status, estimated duration, and crew assignments become project.task fields and Odoo custom fields on the task model. If Odoo Project is not installed, Job maps to crm.opportunity with a project_id custom field for reference.
FieldFX
Ticket Item
Odoo CRM
sale.order.line
1:1FieldFX Ticket Item records (line items on a ticket) map to Odoo sale.order.line. Each Ticket Item's product, quantity, and pricing map to Odoo's product_id, product_uom_qty, and price_unit. Ticket Items linked to a Ticket that becomes an Opportunity can derive a sale.order from the opportunity using Odoo's quotation-from-opportunity flow, with lines linked back to the opportunity.
FieldFX
Asset
Odoo CRM
stock.lot or maintenance.equipment
1:1FieldFX Asset records track equipment under service contracts. They map to Odoo's stock.lot (serial-number tracked inventory) or maintenance.equipment depending on whether the team uses Odoo's Maintenance app. A custom equipment_id field on the opportunity or task preserves the FieldFX asset link. If neither Odoo app is active, assets migrate as a custom res.partner field.
FieldFX
FX_E_Ticketing__c (custom object)
Odoo CRM
Custom fields on crm.opportunity
1:1FieldFX E-Ticketing module records (electronic ticket headers) are not a native Odoo object. The ticket number, service address, customer signature capture status, and e-ticket status fields migrate as custom fields on the crm.opportunity record. Signature image binary data (if stored in Salesforce) exports to Odoo as an attachment on the opportunity.
FieldFX
DataGuide Form Response (custom object)
Odoo CRM
Custom fields on crm.opportunity or project.task
1:1FieldFX DataGuide form responses capture structured inspection, safety, and compliance data per ticket. Each form-response field becomes a custom field on the Odoo record the form was attached to (opportunity or task). Form metadata (form version, submission timestamp) is preserved as custom datetime and text fields. Odoo has no native DataGuide equivalent — custom field creation is required.
FieldFX
User / Owner
Odoo CRM
res.users
1:1FieldFX owner IDs (Salesforce User records) are matched to Odoo res.users by email address. The owner's name, role, and active status map to Odoo's name, groups, and active fields. Unmatched owners are flagged before migration — either the Odoo user is created first or records are assigned to a fallback admin user.
FieldFX
Task / Activity (Email, Call, Meeting)
Odoo CRM
mail.activity or crm.phone.call
1:1FieldFX task and activity records (logged calls, emails, meetings with timestamps and owners) map to Odoo mail.activity records. Activity type, subject, date, and body text map to Odoo's activity_type_id, summary, date_deadline, and note fields. Attachments on activities link to the corresponding Odoo attachment record.
FieldFX
Attachment / File
Odoo CRM
ir.attachment
1:1FieldFX file attachments (Salesforce Files / ContentDocument) are downloaded and re-uploaded to Odoo's ir.attachment table linked to the target record (opportunity, partner, or task). Files stored in FieldFX Back Office's document management are extracted via Salesforce API and re-hosted in Odoo's filestore. File size limits on the Odoo instance apply.
FieldFX
FX_Timecard__c (custom object)
Odoo CRM
account.analytic.line (timesheet)
1:1FieldFX timecard records (hours logged per technician per ticket) map to Odoo account.analytic.line if the Timesheets app is active. Each timecard line becomes an analytic line linked to the project/task derived from the parent Job. Hours, date, and technician assignment map to unit_amount, date, and user_id. If Odoo Timesheets is not active, timecards are stored as custom fields on the opportunity.
| FieldFX | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account | res.partner (company_type = 'company')1:1 | Fully supported | |
| Contact | res.partner (company_type = 'person')1:1 | Fully supported | |
| Ticket | crm.opportunity1:1 | Fully supported | |
| Job | project.project + project.task1:1 | Fully supported | |
| Ticket Item | sale.order.line1:1 | Fully supported | |
| Asset | stock.lot or maintenance.equipment1:1 | Fully supported | |
| FX_E_Ticketing__c (custom object) | Custom fields on crm.opportunity1:1 | Fully supported | |
| DataGuide Form Response (custom object) | Custom fields on crm.opportunity or project.task1:1 | Fully supported | |
| User / Owner | res.users1:1 | Fully supported | |
| Task / Activity (Email, Call, Meeting) | mail.activity or crm.phone.call1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| FX_Timecard__c (custom object) | account.analytic.line (timesheet)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.
FieldFX gotchas
API rate limits vary by Salesforce edition and request type
Deprecated Attachments feature requires Files API migration
Workflow Rules retirement leaves automations without a migration path
Travel time calculations require appointment rescheduling post-migration
Custom field API name length causes browser errors on mobile
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 FieldFX data model and Odoo destination schema
FlitStack AI reads the FieldFX source org's object list via Salesforce API — identifying all custom objects (Ticket__c, Job__c, Ticket_Item__c, Asset__c, FX_E_Ticketing__c, FX_Timecard__c, DataGuide objects), their field schemas, record-type configurations, and relationship fields. We simultaneously read the destination Odoo database schema via XML-RPC to confirm which Odoo apps are installed (CRM, Project, Timesheets, Maintenance, Inventory). We then produce a Field-to-Field Mapping Plan that lists every source field, its Odoo destination model, field name, and mapping type, plus a pre-migration checklist of Odoo custom fields and stage values to create.
Create Odoo schema: custom fields, stages, and user mapping
Before data moves, your Odoo admin (or FlitStack) creates the custom fields on res.partner, crm.lead, project.project, and project.task that the mapping plan requires. We deliver a schema setup script that creates Odoo custom fields via XML-RPC (if Custom plan API is available) or CSV import. Simultaneously, Odoo CRM pipeline stages are created to match FieldFX Ticket and Job status values. Salesforce User records are matched by email to Odoo res.users — unmatched users are flagged so the team can create Odoo accounts before migration or designate a fallback owner.
Migrate partners and contacts first, then field-service objects
We sequence the migration to respect Odoo's foreign-key constraints: res.partner records (Accounts and Contacts) migrate first so that AccountId and ContactId lookups can resolve on Ticket, Job, and Asset records. FieldFX Tickets then migrate to crm.lead opportunities with stage_id value-mapping and owner assignment. Job records migrate to project.project, with individual Job Tasks derived from related Ticket records or from Job Task child records in FieldFX. Ticket Items migrate as sale.order.line on a quotation derived from the opportunity. Attachments are downloaded from Salesforce ContentDocument and re-uploaded to Odoo ir.attachment records linked to the target model.
Run sample migration with field-level diff
A representative sample (typically 100–500 records spanning Accounts, Contacts, Tickets, Jobs, and a few Ticket Items with attachments) migrates first. We generate a field-level diff comparing source FieldFX values against the Odoo record values — verifying that stage names mapped correctly, owner resolution found matches, custom field values populated, and attachment links resolved. The diff is reviewed with your team before the full migration run commits. Any mapping corrections are applied to the migration plan.
Cut over with delta-pickup and rollback available
The full migration runs against the Odoo instance. A delta-pickup window (24–48 hours) captures any FieldFX records modified or created during the cutover — the team continues working in FieldFX during this window. An audit log records every record created or updated in Odoo with the source system ID for traceability. If reconciliation reveals missing records or incorrect mappings, one-click rollback reverts the Odoo database to the pre-migration state so corrections can be applied and the migration re-run. After rollback window closes, we deliver a final migration report with record counts per object, unmatched owner list, and any unmapped fields for admin review.
Platform deep dives
FieldFX
Source
Strengths
Weaknesses
Odoo CRM
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 FieldFX and Odoo CRM.
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
FieldFX: Org-wide 24-hour rolling REST API limit varies by Salesforce edition; per-user per-app per-hour Batch API limit; 25 requests per minute for FX Reports API.
Data volume sensitivity
FieldFX 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 FieldFX to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your FieldFX 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 FieldFX
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.