CRM migration

Migrate from Field Pros to Odoo CRM

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 logo

Field Pros

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

91%

10 of 11

objects map 1:1 between Field Pros and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Field Pros logo

Field Pros

What's pushing teams away

  • Per-work-order or per-technician billing becomes expensive at scale, pushing organizations toward flat-seat pricing models as the field team grows.
  • Frequent platform updates break custom workflows and integrations, creating migration pressure when the cost of maintaining customizations exceeds the switching cost.
  • Limited native accounting and inventory features force businesses to maintain separate financial systems, increasing operational complexity and data entry errors.
  • Consolidation of point solutions toward all-in-one platforms drives migration when organizations reduce their vendor stack complexity.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How Field Pros objects map to Odoo CRM

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

maps to

Odoo CRM

crm.lead

1:1
Fully supported

Field 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

maps to

Odoo CRM

res.partner

many:1
Fully supported

Field 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

maps to

Odoo CRM

res.partner

1:1
Fully supported

Field 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

maps to

Odoo CRM

crm.lead (lead_type=opportunity)

1:1
Fully supported

Confirmed 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

maps to

Odoo CRM

sale.subscription

1:1
Fully supported

For 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

maps to

Odoo CRM

crm.lead.relatives

1:1
Fully supported

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

maps to

Odoo CRM

crm.activity / mail.message

1:1
Fully supported

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

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

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

maps to

Odoo CRM

res.users

1:1
Fully supported

Field 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

maps to

Odoo CRM

ir.model.fields (x_*)

1:1
Fully supported

Field 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

maps to

Odoo CRM

ir.model.fields (x_*)

1:1
Fully supported

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

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.

Field Pros logo

Field Pros gotchas

High

Work Order status enums differ between FSM platforms

Medium

Asset parent-child hierarchies do not transfer cleanly

Medium

Offline writes require re-sync handling

Medium

Custom field picklist values have no cross-platform equivalent

High

Preventive maintenance schedule rules cannot be exported

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Odoo crm.lead unifies Lead and Opportunity — placement routing requires lead_type setting

    Odoo CRM does not separate Leads and Opportunities into distinct objects; instead, crm.lead uses a lead_type field to switch behavior. When Field Pros candidates become confirmed placements, the lead_type must be set to 'opportunity' to enable Odoo's opportunity-specific features (expected revenue, probability, forecast). If lead_type remains 'lead', the opportunity fields are hidden in Odoo's UI. We set lead_type='opportunity' for all Field Pros placements with confirmed start dates during migration. Teams using Odoo's unified pipeline view should configure stage visibility rules to show opportunity-only stages only when lead_type equals 'opportunity'.

  • Odoo custom fields require schema creation before data import — batch import sequencing matters

    Odoo custom fields on crm.lead (x_availability_status, x_clearance_level, x_fee_amount) must exist before records can be created with those field values. We sequence the migration as: (1) create custom fields via Odoo Studio export-import or Python write, (2) create partner records, (3) create lead records, (4) populate custom field values via XML-RPC write after field creation. Attempting to write custom field values to records before the field exists returns a validation error from Odoo's orm. This sequencing step is where most manual rework requests originate if not handled in the migration plan.

  • Odoo XML-RPC rate limits and batch commit size require throttling configuration

    Odoo's XML-RPC interface does not enforce strict per-request rate limits on self-hosted instances, but Odoo Online (cloud) enforces concurrency limits on external API calls. Large migrations exceeding 50,000 records should use Odoo's batch commit strategy with 500-record chunks and 2-second delays between batches. The ir.model.data migration script must run with sufficient transaction isolation to prevent lock contention on the crm_lead table. We configure batch throttling in our migration runner based on the target Odoo deployment type detected during the connection handshake.

  • Field Pros candidate-to-job-order N:N relationship requires custom junction model in Odoo

    Field Pros allows a candidate to apply to multiple job orders, and a job order to receive applications from multiple candidates — a classic N:N relationship. Odoo crm.lead has no native mechanism to link multiple leads to the same job order. We create a custom junction model crm.lead.job.rel with fields lead_id (many2one crm.lead) and job_order_id (many2one res.partner). The junction table preserves application status, submission date, and sourcing channel for each candidate-job order pair. Odoo admins can view related candidates for a job order partner via a one2many relation from res.partner to crm.lead.job.rel.

  • Odoo ir.attachment requires file content re-hosting — original URLs become dangling references

    Field Pros stores attachment URLs pointing to its own file storage. These URLs are not directly accessible after migration unless Field Pros continues hosting the files. We download each attachment from Field Pros (authenticated API call), re-upload to Odoo's filestore via XML-RPC binary write, and store the original URL in the attachment's description field. Files exceeding Odoo's size limit (default 25MB) are flagged for manual review. If Field Pros attachment URLs become inaccessible before migration completes, those files cannot be migrated and are listed in the attachment failure report.

Migration approach

Six steps for a successful Field Pros to Odoo CRM data migration

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

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

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

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

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

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

Context on both ends of the pair

Field Pros logo

Field Pros

Source

Strengths

  • Purpose-built mobile app for field technicians with offline capability and signature capture.
  • Native dispatch board with drag-and-drop scheduling and territory-based routing.
  • Integrated invoicing and payment collection with accounting platform syncs.
  • Scalable per-technician pricing model for predictable workforce costs.
  • Strong partner ecosystem including accounting, payment processing, and Parts Lookup integrations.

Weaknesses

  • Custom workflows and field-level configurations break on platform updates without warning.
  • Limited native accounting features require integration with separate financial tools.
  • Pricing becomes unpredictable at scale with per-work-order or per-transaction tiers.
  • Custom object and field support is less flexible than general-purpose CRM platforms.
  • Migration tooling and documented APIs are inconsistent across FSM vendors.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

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 Field Pros and Odoo CRM.

  • 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

    Field Pros: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Field Pros to Odoo CRM 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 Field Pros to Odoo CRM data migrations

Answers to the questions buyers ask most during Field Pros to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most Field Pros to Odoo CRM migrations complete in 48–72 hours of clock time for under 25,000 total records (candidates, job orders, placements combined). Larger datasets with 100,000+ records or more than 20 custom candidate properties extend to 5–8 business days. The custom field creation step — where we build x_availability_status, x_clearance_level, and junction models in Odoo Studio — is the longest planning step and drives timeline variability most directly. Odoo XML-RPC batch throttling for cloud instances adds 2–4 hours for every 50,000 records migrated.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Field Pros.
Land in Odoo CRM, 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