CRM migration
Field-level mapping, validation, and rollback between Field Service Trakker and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Field Service Trakker
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between Field Service Trakker and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Field Service Trakker stores service operations across customers, work orders, technicians, and inventory — an object model optimized for dispatch and field execution. Odoo CRM consolidates contacts and companies into res.partner, routes leads through crm.lead with configurable stage pipelines, and links activities through mail.message and crm.activity records. We map Field Service Trakker customers to res.partner, work orders to crm.lead with a service-history tag, technicians to res.users, and service-line items to sale.order lines when the Odoo Sales app is active. Scheduling events migrate as crm.activity records with original start times and assigned user links. Custom fields on work orders translate to x_studio_* custom fields on crm.lead via Odoo's ir.model.fields API. We do not migrate automations, dispatch rules, or route-optimization logic — those require Odoo Studio configuration post-migration. The migration runs against Odoo's XML-RPC API with batched writes and transactional rollback on field-level validation failure. During the migration, each batch of records is validated against the Odoo schema before committing; any field that fails type checks or required constraints triggers a rollback, preserving data integrity. The migration script leverages Odoo's execute_kw method to perform bulk writes, reducing round‑trip latency. All timestamps from the source system are preserved in custom datetime fields such as x_studio_original_create_date, allowing historical reporting without altering Odoo's native audit fields. If the Odoo Inventory or Accounting apps are present, the migration also creates linked stock.move or account.move records, respectively, using the origin field to maintain traceability back to the original crm.lead.
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 Field Service Trakker 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.
Field Service Trakker
Customer
Odoo CRM
res.partner
1:1Field Service Trakker customer records map to Odoo res.partner with partner_type='contact' for individual customers and partner_type='company' for organizations. Primary contact email and phone migrate to email and phone fields on res.partner. Multi-location customers create child-partner records linked via parent_id. Additional address fields such as street, city, state, zip, and country map to res.partner, and parent_id links each location-specific child to the organization partner.
Field Service Trakker
Contact
Odoo CRM
res.partner (child)
many:1Field Service Trakker contact records attached to a customer merge into res.partner as child-partner records under the company partner. Email, phone, mobile, and title fields map directly. FST contact roles (Billing Contact, Site Contact) preserved as a custom selection field on the child partner.
Field Service Trakker
Work Order
Odoo CRM
crm.lead
1:1Work orders become Odoo crm.lead records with type='opportunity'. The work order number maps to x_studio_work_order_number, service type to x_studio_service_type, and priority to crm.lead priority selection. Original create date preserved in x_studio_original_create_date for historical reporting. The work order description maps to crm.lead description, and FST status values map to Odoo stage records with Completed setting pipeline_won=True. Work-order fields become x_studio_* fields on crm.lead via ir.model.fields, and values are written during migration.
Field Service Trakker
Work Order Line Item
Odoo CRM
sale.order.line (linked)
1:1When Odoo Sales app is active, work order line items migrate as sale.order.line records with origin pointing to the crm.lead. Product/service description, quantity, and unit price map to sale.order.line name, product_uom_qty, and price_unit. If Sales app is inactive, line items store as a serialized text field on the crm.lead.
Field Service Trakker
Technician
Odoo CRM
res.users + hr.employee
1:1Field Service Trakker technician profiles map to hr.employee records linked to res.users. The user record provides login credentials for Odoo mobile app access. FST skill certifications migrate as many2many tags on hr.employee using Odoo's Skills app or a custom x_studio_skills field.
Field Service Trakker
Schedule / Dispatch Event
Odoo CRM
crm.activity + calendar.event
1:1Scheduled appointments from Field Service Trakker become Odoo crm.activity records with activity_type_id, user_id (assigned technician), and date_deadline matching the original start datetime. If the Odoo Calendar app is active, calendar.event records generate with res_model='crm.lead' linking back to the work-order lead.
Field Service Trakker
Invoice
Odoo CRM
account.move
1:1When Odoo Accounting is active, Field Service Trakker invoices map to account.move with move_type='out_invoice'. Line items from the invoice migrate to invoice_line_ids matching product, quantity, and price_unit. Payment state (paid, outstanding) translates to Odoo's payment_state field on account.move. The activity type defaults to 'Call' unless a specific type is indicated in the source data.
Field Service Trakker
Inventory / Parts Used
Odoo CRM
stock.move (linked)
1:1Parts consumed on work orders migrate to a custom x_studio_parts_used field on crm.lead as serialized JSON (part name, quantity, cost). When Odoo Inventory app is active, stock.move records generate with stock_picking_id linking to the work-order opportunity via origin reference. The JSON stores each part as an object with 'name', 'qty', and 'cost', allowing usage reports per lead. If Inventory is absent, the field stays available for later integration.
Field Service Trakker
Site / Location
Odoo CRM
res.partner (address)
1:1Field Service Trakker site records map to partner addresses on the customer res.partner. Street, city, state, zip, and country map to Odoo's address fields (street, street2, city, state_id, zip, country_id). Multiple sites per customer create additional contact records with address_type='other'.
Field Service Trakker
Custom Work Order Field
Odoo CRM
x_studio_* custom field on crm.lead
1:1Field Service Trakker custom fields on work orders (e.g., txt_equipment_model, num_hourly_rate) create Odoo custom fields via ir.model.fields with field_type matching the source type (char, float, datetime). Selection fields map to Odoo selection fields with identical option values. Required field constraints are set based on FST field settings.
Field Service Trakker
Service History Note
Odoo CRM
mail.message
1:1Service history notes and technician comments from Field Service Trakker migrate as mail.message records on the crm.lead with message_type='comment'. Author field set to the mapped technician's res.users record. Create_date preserves the original note timestamp for audit continuity. The mail.message records are attached to the crm.lead's mail.thread, and file attachments are linked via ir.attachment with res_model='crm.lead' and res_id pointing to the lead, preserving the full audit trail.
Field Service Trakker
Attachment / Photo
Odoo CRM
ir.attachment
1:1Work order photos and file attachments download from FST and re-upload to Odoo's ir.attachment with res_model='crm.lead' and res_id pointing to the migrated lead. Inline images in service notes become mail.message attachments with the same res_model reference. The migration script downloads a file, checks its MIME type, and stores it in ir.attachment with db_datas. For images in notes, it extracts base64 data and attaches it as mail.message linked to the lead.
| Field Service Trakker | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer | res.partner1:1 | Fully supported | |
| Contact | res.partner (child)many:1 | Fully supported | |
| Work Order | crm.lead1:1 | Fully supported | |
| Work Order Line Item | sale.order.line (linked)1:1 | Fully supported | |
| Technician | res.users + hr.employee1:1 | Fully supported | |
| Schedule / Dispatch Event | crm.activity + calendar.event1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Inventory / Parts Used | stock.move (linked)1:1 | Fully supported | |
| Site / Location | res.partner (address)1:1 | Fully supported | |
| Custom Work Order Field | x_studio_* custom field on crm.lead1:1 | Fully supported | |
| Service History Note | mail.message1:1 | Fully supported | |
| Attachment / Photo | ir.attachment1: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.
Field Service Trakker gotchas
No publicly documented public API endpoint reference
Work Order to Invoice linkage may not survive export
Custom field schema varies by account configuration
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 Field Service Trakker data model and export schema
FlitStack AI connects to Field Service Trakker via API using scoped read access to enumerate all objects: customers, contacts, work orders, line items, technicians, invoices, sites, and custom fields. We generate a data dictionary showing field names, types, sample values, and null rates for every object. Custom work-order fields are flagged for Odoo custom field creation. Customer-contact cardinality is analyzed to determine how many multi-contact accounts require res.partner parent-child restructuring in Odoo.
Configure Odoo CRM schema before data lands
We deliver an Odoo Studio configuration plan specifying which crm.lead custom fields to create (x_studio_work_order_number, x_studio_service_type, x_studio_original_create_date, etc.), which crm_stage records to create matching FST work-order statuses, and how hr.employee records map to res.users for technicians. Your Odoo admin creates the custom fields and stages in Odoo Settings before the migration run. We provide the exact field definitions (name, type, selection options) in both Odoo Studio format and Python ir.model.fields XML for programmatic creation.
Resolve technician-to-user mapping by email match
Field Service Trakker technician records are matched to Odoo res.users by email address. For each technician with an email present in FST, we check for a matching Odoo user record. Unmatched technicians are flagged before migration — your team either creates Odoo user accounts first or assigns their work orders to a fallback user (e.g., the service manager). No crm.activity record lands without a valid user_id, ensuring scheduled activities appear in the correct technician's Odoo activity queue at go-live.
Migrate partners, leads, activities, and attachments in dependency order
Odoo enforces referential integrity — res.partner records must exist before crm.lead records can reference partner_id. We sequence the migration: (1) customers → res.partner (parent), (2) contacts → res.partner (child with parent_id), (3) technicians → hr.employee + res.users, (4) work orders → crm.lead with stage mapping and custom field values, (5) line items → sale.order.line when Sales app active, (6) activities → crm.activity linked to leads, (7) attachments → ir.attachment with res_model='crm.lead'. Each phase runs against Odoo's XML-RPC API with transactional rollback on validation errors. Phase 4 (lead migration) is the longest step — custom field values are validated against ir.model.fields definitions before batch write.
Run sample migration with field-level diff and delta-pickup cutover
A representative slice (typically 200–500 records spanning customers, work orders, and activities) migrates first. We generate a field-level diff comparing source Field Service Trakker values against destination Odoo field values for every mapped field — admin verifies stage mapping, custom field content, partner hierarchy, and activity assignment before committing the full run. After the full migration completes, a 24–48 hour delta-pickup window captures any Field Service Trakker records modified during cutover (new work orders, status changes, updated customer info). Audit log records every API write operation. One-click rollback reverts Odoo to pre-migration state if reconciliation finds unexpected discrepancies.
Platform deep dives
Field Service Trakker
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 Field Service Trakker 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
Field Service Trakker: Not applicable.
Data volume sensitivity
Field Service Trakker 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 Field Service Trakker to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Field Service Trakker 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 Field Service Trakker
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.