CRM migration
Field-level mapping, validation, and rollback between FieldEdge and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
FieldEdge
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between FieldEdge and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
FieldEdge models field-service operations around customers, work orders, dispatch, and service agreements with a flat CRM structure optimized for contracting industries. Odoo CRM models the same domain using crm.lead for opportunities, res.partner for contacts and companies, and account.move for invoices — plus optional Project and Field Service modules for job management. We map FieldEdge customers to Odoo res.partner (distinguishing company-type from individual contacts via the is_company flag), work orders to custom fields on crm.lead or to project.task if the Odoo Project module is deployed, invoices to account.move, and service agreements to custom fields on the opportunity record. FieldEdge custom properties become Odoo custom fields on ir.model.fields. Workflows, automations, and dispatch rules — which carry FieldEdge's operational logic — do not migrate and must be redesigned in Odoo's Studio or automation tools. We sequence the migration: partners first (for foreign-key resolution), then products, then work orders/opportunities, then invoices. API access uses Odoo's xmlrpc endpoint; FieldEdge data extraction is via their documented export paths. A delta-pickup window captures in-flight changes during the cutover so Odoo reflects FieldEdge's final state at go-live.
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 FieldEdge 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.
FieldEdge
Customer
Odoo CRM
res.partner
1:1FieldEdge customers map 1:1 to Odoo res.partner records. The is_company flag is set based on FieldEdge's customer type — businesses with multiple contacts use parent_id on the child partner records to establish the company hierarchy. Primary service address maps to partner address fields; billing address maps separately or as the same record depending on configuration.
FieldEdge
Work Order
Odoo CRM
crm.lead (custom fields) or project.task
1:1FieldEdge work orders are the core operational record with no direct Odoo CRM equivalent. We map job number, status, scheduled date, assigned technician, service address, labor hours, parts used, and job total to custom fields on crm.lead. If Odoo Project is deployed (Enterprise), work orders map to project.task linked to the partner record. This choice is validated during the sample migration phase.
FieldEdge
Invoice
Odoo CRM
account.move
1:1FieldEdge invoices map to Odoo account.move records with move_type='out_invoice'. Invoice line items map to account.move.line with product_id linked to the migrated product catalog. Payment_state in Odoo reflects the FieldEdge payment status — paid, outstanding, or overdue. Invoice date and due date are preserved from FieldEdge's create_date and due_date fields.
FieldEdge
Service Agreement
Odoo CRM
Custom fields on crm.lead (or sale.subscription if Sales app deployed)
1:1FieldEdge service agreements track plan name, coverage type, contract value, start date, renewal date, and coverage details. Since Odoo CRM has no native service-agreement object, we create custom fields on crm.lead: x_service_plan, x_coverage_type, x_contract_value, x_agreement_start, x_renewal_date, and x_coverage_notes. If sale.subscription is active, we map agreements there instead with a link to the partner record.
FieldEdge
User / Technician
Odoo CRM
res.users
1:1FieldEdge users and technicians map to Odoo res.users by email address match. Active status is preserved. FieldEdge role distinctions (office staff vs. field technician) are translated to Odoo access groups — the dispatcher and admin roles get full CRM access; technician roles get mobile and field-service access. Unmatched FieldEdge users are flagged before migration so Odoo accounts can be pre-created.
FieldEdge
Product / Part
Odoo CRM
product.template
1:1FieldEdge parts and materials catalog maps to product.template with type='product'. List_price and standard_price are populated from FieldEdge's unit price and cost fields. The product's description maps to product.template's description field. If FieldEdge tracks inventory quantities, these map to product.qty_on_hand via Odoo's stock quant model.
FieldEdge
Work Order Status
Odoo CRM
crm.stage (per team)
1:1FieldEdge work order status values (e.g., Scheduled, In Progress, On Hold, Completed, Invoiced) map to Odoo crm.stage names specific to the sales team. We create a dedicated pipeline stage set for the migrated work order data. Probability values are assigned per stage to support Odoo's revenue forecasting model. Stage timestamps are preserved as custom datetime fields on the opportunity.
FieldEdge
Invoice Payment Status
Odoo CRM
account.move payment_state
1:1FieldEdge payment status values (Paid, Outstanding, Overdue, Void) map to Odoo account.move payment_state values (paid, in_payment, outstanding, overdue, void). The mapping is direct value-by-value. Any partial payments recorded in FieldEdge are reflected as payment registers linked to the account.move in Odoo.
FieldEdge
Custom Property (Customer)
Odoo CRM
Custom field on res.partner
1:1FieldEdge custom properties on customers that have no Odoo standard field equivalent become ir.model.field records on res.partner. We create custom fields before migration and map source values during data load. Field type in Odoo is chosen based on the source data type — char, text, selection, or float. Custom field names in Odoo use the x_ prefix convention.
FieldEdge
Custom Property (Work Order)
Odoo CRM
Custom field on crm.lead or project.task
1:1FieldEdge work-order-level custom properties map to custom fields on whichever Odoo object holds the work order data. If work orders map to crm.lead custom fields, those fields are added there. If project.task is used, custom fields are added to project.task. Type-aware mapping applies — date fields become date fields, numeric fields become float or integer, etc.
FieldEdge
Estimate / Proposal
Odoo CRM
sale.order (draft quotation)
1:1FieldEdge estimates and proposals that are not yet converted to work orders map to Odoo sale.order in draft state. Line items map with product_id, product_uom_qty, and price_unit from the FieldEdge estimate. If the estimate has an accepted status in FieldEdge, we create the sale.order as confirmed. Rejected estimates are preserved as lost opportunities with a custom lost_reason field.
FieldEdge
FieldEdge System ID
Odoo CRM
Custom Char field on all migrated objects
1:1FieldEdge's internal record IDs are stored on every migrated object as a custom Char field (e.g., x_fieldedge_id) for traceability and delta-run deduplication. This field is indexed in Odoo and used in the WHERE clause during subsequent delta-pickup queries to avoid creating duplicate records on re-runs.
| FieldEdge | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer | res.partner1:1 | Fully supported | |
| Work Order | crm.lead (custom fields) or project.task1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Service Agreement | Custom fields on crm.lead (or sale.subscription if Sales app deployed)1:1 | Fully supported | |
| User / Technician | res.users1:1 | Fully supported | |
| Product / Part | product.template1:1 | Fully supported | |
| Work Order Status | crm.stage (per team)1:1 | Fully supported | |
| Invoice Payment Status | account.move payment_state1:1 | Fully supported | |
| Custom Property (Customer) | Custom field on res.partner1:1 | Fully supported | |
| Custom Property (Work Order) | Custom field on crm.lead or project.task1:1 | Fully supported | |
| Estimate / Proposal | sale.order (draft quotation)1:1 | Fully supported | |
| FieldEdge System ID | Custom Char field on all migrated objects1: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.
FieldEdge gotchas
NationBuilder Log Contact data has no export endpoint
QuickBooks sync flag does not prevent duplicate reconciliation
Multi-week implementation creates a data freeze risk
Proposal Pro and MarketingEdge are tier-gated add-ons
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 FieldEdge data model and schema
FlitStack AI connects to FieldEdge via read-only API access and exports a full schema inventory: all customer records, work orders, invoices, service agreements, products, users, and custom properties. We produce a data volume report and flag any records with missing required fields (e.g., customers with no email or phone). This audit also identifies which FieldEdge custom properties need corresponding Odoo custom fields and whether the Odoo Field Service module is in scope. The audit output becomes the migration specification before any data moves.
Create Odoo custom fields and stage mappings
Before data loads, FlitStack AI creates the Odoo custom fields identified during the audit on res.partner (service-agreement fields), crm.lead (work order fields, custom properties, priority), and account.move (invoice metadata). We also build the crm.stage mapping table translating each FieldEdge work order status to a named Odoo stage with probability values. If Odoo Enterprise with Field Service is deployed, we configure the project and task models to receive work order data. Your Odoo admin reviews and approves the schema before the migration run.
Map FieldEdge users and technicians to Odoo res.users
FlitStack AI resolves FieldEdge users and technicians against Odoo res.users by email address. Office staff and field technicians each get an Odoo user account with appropriate access groups — CRM user for sales, Field Service user for technicians if Enterprise is deployed. Unresolved FieldEdge users are flagged in a pre-migration report with the option to create Odoo accounts for them or assign their records to a fallback owner. No record migrates without a confirmed Odoo owner or a documented fallback rule.
Run sample migration with field-level diff
A representative slice of FieldEdge data — typically 200–500 records covering customers across multiple cities, a cross-section of work order statuses, a mix of invoiced and outstanding invoices, and all service agreement types — is migrated to Odoo first. FlitStack AI generates a field-level diff comparing source values against destination field values for every mapped field. You review the diff to confirm work order number mapping, stage assignment, custom field population, and user ownership. Only after sample approval does the full migration proceed.
Execute full migration with delta-pickup cutover
FlitStack AI runs the full migration in dependency order: res.partner records first (for foreign-key resolution), then product.template, then crm.lead records with work order and service agreement data, then account.move for invoices, and finally sale.order for estimates. During the cutover window, your team continues working in FieldEdge with read-only API access. A 24–48 hour delta-pickup captures records created or modified in FieldEdge after the initial migration run. An audit log records every migrated record with its FieldEdge source ID and Odoo destination ID for post-migration reconciliation.
Validate record counts and reconcile totals
After the delta-pickup window closes, FlitStack AI runs a reconciliation report comparing FieldEdge totals against Odoo totals for each object: customer count, work order count by status, invoice count by payment state, and service agreement count by plan type. Any discrepancies above the configured tolerance threshold are investigated and corrected before go-live. We deliver the final reconciliation report, the audit log of all migration operations, and a rollback plan that can be executed within 24 hours if a critical issue surfaces post-go-live.
Platform deep dives
FieldEdge
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 FieldEdge 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
FieldEdge: Not publicly documented; managed via Azure API Management.
Data volume sensitivity
FieldEdge 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 FieldEdge to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your FieldEdge 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 FieldEdge
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.