CRM migration
Field-level mapping, validation, and rollback between Field Pros and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Field Pros
Source
Odoo CRM
Destination
Compatibility
10 of 11
objects map 1:1 between Field Pros and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Field Pros structures recruiting data around candidates, job orders, and placements — a model that maps partially to Odoo CRM's unified lead/opportunity framework. We extract candidate profiles, employment history, availability flags, and sourcing notes from Field Pros, then route them into Odoo's crm.lead as leads or opportunities based on placement status. Job orders become res.partner records (Odoo consolidates contacts and companies into one model), with custom fields for job requirements and fee terms. Placements with confirmed start dates map to confirmed opportunities in Odoo, carrying forward fee amounts and commission structures. Odoo's PostgreSQL backend requires custom field creation through Odoo Studio or Python models — we handle the schema translation and validate against Odoo's field-type constraints. Workflows, automated sequences, and candidate-matching algorithms in Field Pros do not transfer and must be rebuilt using Odoo's CRM automation rules or Studio. The migration runs via Odoo's XML-RPC API with batched commits to respect rate limits, followed by a reconciliation diff against source totals.
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 Pros 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 Pros
Candidate
Odoo CRM
crm.lead
1:1Field Pros candidates map to Odoo crm.lead records. The lead_type field on crm.lead determines whether a record acts as a Lead or Opportunity. Candidates with confirmed placements become opportunities (lead_type='opportunity'); all others remain leads. Odoo's crm.lead model stores name, partner_id (linked res.partner), email, phone, and custom fields from the candidate profile.
Field Pros
Candidate
Odoo CRM
res.partner
many:1Field Pros candidates and client companies are separate objects. Odoo merges these into res.partner — a candidate's personal contact details (name, email, phone, address) become a partner record with partner_type='contact'. When the candidate represents a company, a separate partner record with partner_type='company' is created and the candidate is linked via the 'contact' many2one field on the company partner.
Field Pros
Job Order
Odoo CRM
res.partner
1:1Field Pros job orders (client companies posting roles) map to res.partner records with partner_type='company'. The job order's company name, industry, location, and contact information populate the partner record. Job order status (open, filled, closed) maps to the active field on the partner record, supplemented by a custom status field if granular tracking is required.
Field Pros
Placement
Odoo CRM
crm.lead (lead_type=opportunity)
1:1Confirmed placements in Field Pros become Odoo opportunities in crm.lead. The placement's start date, fee amount, and commission structure populate opportunity fields. Odoo's opportunity model carries expected_revenue (mapped from placement fee), date_closed (mapped from start date), and probability (set to 100 for confirmed placements, lower for pending starts).
Field Pros
Placement
Odoo CRM
sale.subscription
1:1For recurring placement arrangements or retained search contracts, Odoo's subscription model (sale.subscription) may be appropriate. This requires custom field creation to map Field Pros contract terms (retainer amount, renewal cycle, milestone triggers). We flag this mapping during discovery and create the subscription schema only if the source data contains recurring contract records.
Field Pros
Candidate-Application
Odoo CRM
crm.lead.relatives
1:1Field Pros links candidates to job orders through an application relationship. Odoo crm.lead lacks a native application link. We create a custom many2many relation (crm_lead_job_order_rel) to preserve which candidates applied to which job orders. The relation table stores candidate_id, job_order_id, application_date, and status from Field Pros.
Field Pros
Activity (Call/Email/Note)
Odoo CRM
crm.activity / mail.message
1:1Field Pros activity logs (calls, emails, interview notes) attach to crm.lead via crm.activity records. Odoo's crm.activity model stores activity_type_id, body (note content), date_deadline, and user_id. Communication history (emails) stored in mail.message linked to the crm.lead's partner_id. Original timestamps and recruiter owners preserved during migration.
Field Pros
Attachment (Resume/Contract)
Odoo CRM
ir.attachment
1:1Resumes attached to candidates and contracts attached to placements migrate to Odoo's ir.attachment table. Each attachment stores res_model='crm.lead', res_id (the opportunity or lead ID), name (original filename), datas (file content base64-encoded), and the original URL from Field Pros stored in description for reference. File size limits (default 25MB per file) are enforced during re-hosting.
Field Pros
Recruiter (User)
Odoo CRM
res.users
1:1Field Pros recruiters assigned as owners of candidates and placements are resolved by email match against Odoo res.users. Unmatched recruiters are flagged in the migration report. We create inactive user records for unmatched recruiters with login='to-provision@[domain]', allowing Odoo admins to activate and assign roles post-migration.
Field Pros
Custom Candidate Property
Odoo CRM
ir.model.fields (x_*)
1:1Field Pros stores custom properties on candidates (for example, sourcing_channel, availability_status, clearance_level) as key-value pairs. We translate each property to an Odoo custom field using x_ prefix convention. Field type mapping: text values become char or text depending on length; pick-list values become selection fields with value_mapping; boolean properties become boolean fields.
Field Pros
Custom Job Order Property
Odoo CRM
ir.model.fields (x_*)
1:1Custom properties on job orders (requirements, benefits, security clearance, travel requirements) map to custom fields on res.partner. Multi-select properties (for example, required_skills) become many2many fields pointing to a skill tags model. We create the skill tags model in Odoo and populate it from Field Pros property values during migration.
| Field Pros | Odoo CRM | Compatibility | |
|---|---|---|---|
| Candidate | crm.lead1:1 | Fully supported | |
| Candidate | res.partnermany:1 | Fully supported | |
| Job Order | res.partner1:1 | Fully supported | |
| Placement | crm.lead (lead_type=opportunity)1:1 | Fully supported | |
| Placement | sale.subscription1:1 | Fully supported | |
| Candidate-Application | crm.lead.relatives1:1 | Fully supported | |
| Activity (Call/Email/Note) | crm.activity / mail.message1:1 | Fully supported | |
| Attachment (Resume/Contract) | ir.attachment1:1 | Fully supported | |
| Recruiter (User) | res.users1:1 | Fully supported | |
| Custom Candidate Property | ir.model.fields (x_*)1:1 | Fully supported | |
| Custom Job Order Property | ir.model.fields (x_*)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.
Field Pros gotchas
Work Order status enums differ between FSM platforms
Asset parent-child hierarchies do not transfer cleanly
Offline writes require re-sync handling
Custom field picklist values have no cross-platform equivalent
Preventive maintenance schedule rules cannot be exported
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
Inventory Field Pros data model and export candidate, job order, and placement records
FlitStack AI authenticates to Field Pros via API using provided credentials. We enumerate all candidate, job order, placement, activity, and attachment records, capturing total counts per object type. Custom fields on candidates and job orders are listed with their data types and pick-list values. We export records in JSON format with all field names, values, timestamps, and owner assignments. A data quality report flags missing required fields, duplicate records, and orphaned relationships before mapping begins.
Create Odoo custom fields and junction models before data import
Based on the Field Pros custom field inventory, we create custom fields on crm.lead and res.partner using Odoo Studio (GUI export/import of field definitions) or Python write calls to ir.model.fields. For N:N candidate-job order relationships, we create the crm.lead.job.rel junction model with lead_id and job_order_id many2one fields plus application metadata fields. Custom field types are validated against Odoo's allowed field spec (char, text, selection, many2many, float, datetime, boolean). We confirm field creation by querying ir.model.fields via XML-RPC before proceeding.
Resolve recruiter owners by email against Odoo res.users
FlitStack AI queries Odoo res.users via XML-RPC and builds an email-to-user-id map. Each Field Pros recruiter email is matched against Odoo login (email). Matched recruiters are assigned as crm.lead user_id and activity user_id. Unmatched recruiters are flagged in the owner-resolution report with the recruiter's name and email. We create inactive Odoo user records for unmatched recruiters (login set to 'pending_[email]', active=False) so migration can proceed without orphaning records. Odoo admins activate and assign roles to these pending users post-migration.
Migrate res.partner records (companies from job orders) before crm.lead
Odoo requires partner records to exist before crm.lead can link to them via partner_id. We migrate job order companies first as res.partner records with partner_type='company'. Address fields (street, city, state_id, zip, country_id) are resolved using Odoo's country and state lookups. Industry is mapped via utm.source or custom industry tags. Active/inactive status is set from job order status. Partner creation returns the Odoo res.partner ID for each job order, which is stored for subsequent lead linking.
Migrate crm.lead records with placement routing and custom field population
Candidate records are created as crm.lead with lead_type='lead'. Each record receives the partner_id link to the candidate's personal res.partner record (created simultaneously or linked to an existing partner). Placement records are created as crm.lead with lead_type='opportunity', carrying fee amounts in x_fee_amount, start dates in date_closed, and commission rates in x_commission_rate. Custom fields (availability_status, clearance_level, sourcing_channel) are written to each lead record after initial creation. Stage assignment uses value_mapping from Field Pros placement status to Odoo crm.stage IDs. Activity logs are created as crm.activity records linked to the corresponding lead.
Run field-level reconciliation diff and delta-pickup before cutover
FlitStack AI generates a field-level diff comparing migrated record counts, custom field value distributions, and owner resolution rates against the original Field Pros export totals. Discrepancies exceeding a 0.5% threshold trigger manual review. After reconciliation passes, a delta-pickup window opens — during this window, any new or modified records in Field Pros are captured and migrated incrementally. The migration is marked complete when the delta pickup yields fewer than 10 changed records. Audit log records every XML-RPC operation; one-click rollback is available if post-migration validation fails.
Platform deep dives
Field Pros
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 Pros 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 Pros: Not publicly documented.
Data volume sensitivity
Field Pros 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 Pros to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Field Pros 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 Pros
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.