CRM migration
Field-level mapping, validation, and rollback between The Customer Factor and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
The Customer Factor
Source
Odoo CRM
Destination
Compatibility
9 of 10
objects map 1:1 between The Customer Factor and Odoo CRM.
Complexity
BStandard
Timeline
24–72 hours
Overview
The Customer Factor organizes service businesses around flat customer and prospect records with integrated estimating, job scheduling, and invoicing — storing custom fields directly on each record without a formal schema layer. Odoo CRM uses a relational model built on crm.lead for leads and opportunities and res.partner for contacts and companies, with custom fields added through Odoo module inheritance rather than per-record properties. The migration carries all Customer Factor customers, prospects, estimates, jobs, and invoices into Odoo res.partner and crm.lead records, applying custom field definitions as Odoo x_studio or __custom__ fields on the appropriate model. We map The Customer Factor's job statuses and estimate stages to Odoo crm.lead stage names per pipeline. Custom fields from The Customer Factor that have no native Odoo equivalent are created as custom fields on crm.lead or res.partner. Odoo does not have a native workflow engine for CRM automations — automation logic must be rebuilt using Odoo Studio or the Odoo Business Rules engine after migration. Attachments are re-uploaded to Odoo's ir_attachment table and linked to the correct res.partner or crm.lead record. FlitStack sequences the migration using Odoo's XML-RPC API with partner import first (for foreign-key resolution on crm.lead.partner_id), then crm.lead records with stage and user assignment, then attachments. A 24–48-hour delta window captures any records modified in The Customer Factor during cutover before the final Odoo state is locked.
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 The Customer Factor 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.
The Customer Factor
Customer
Odoo CRM
res.partner
1:1The Customer Factor customers map to Odoo res.partner records. Odoo res.partner serves as both company (commercial entity) and individual contact depending on the is_company flag. The Customer Factor company name maps to res.partner.name; individual contact fields (phone, email) map to res.partner.phone and res.partner.email respectively.
The Customer Factor
Prospect
Odoo CRM
crm.lead
1:1The Customer Factor prospects map to Odoo crm.lead records with type='lead'. Odoo's crm.lead model handles both raw leads and qualified opportunities — prospects with no active sale process land as crm.lead with stage set to the first pipeline stage. Prospect owner resolves to Odoo res.users by email match.
The Customer Factor
Estimate
Odoo CRM
sale.order
1:1The Customer Factor estimates (with line items, quantities, pricing) map to Odoo sale.order records in the Sales app, not the CRM pipeline. Odoo sale.order stores order lines (sale_order_line) with product_id, product_uom_qty, and price_unit. The Customer Factor estimate number becomes sale_order.name; the linked customer becomes sale_order.partner_id.
The Customer Factor
Job / Work Order
Odoo CRM
crm.lead + project.task
1:manyThe Customer Factor jobs have a dual nature — they carry pipeline stage (status) and operational detail (scheduling, assigned tech). The job header (customer link, status, description) migrates to crm.lead. Job line items and scheduling detail can migrate to Odoo project.task records linked via crm_lead_id if the Odoo Project app is active; otherwise they are stored as notes on the crm.lead.
The Customer Factor
Invoice
Odoo CRM
account.move
1:1The Customer Factor invoices map to Odoo account.move records with move_type='out_invoice'. Odoo account.move stores invoice lines as account_move_line records. The linked customer becomes account_move.partner_id; the source estimate becomes sale_order_id on the invoice if an Odoo sale.order was created. Original invoice number is preserved in account_move.ref.
The Customer Factor
Custom Field (per record)
Odoo CRM
x_studio / ir.model.fields
1:1The Customer Factor stores custom fields as key-value properties on each record with no formal schema declaration. Migrating these requires Odoo custom field definitions (x_studio fields or __custom__ fields in the database) on the appropriate model (crm.lead for prospect/job fields, res.partner for customer fields). Each unique custom field name in The Customer Factor becomes a custom field on the corresponding Odoo model.
The Customer Factor
Attachment / File
Odoo CRM
ir_attachment
1:1The Customer Factor file attachments migrate to Odoo's ir_attachment table. Each file is re-uploaded via Odoo's ir_attachment.create() through XML-RPC with the correct res_model (crm.lead or res.partner) and res_id pointing to the migrated record. Odoo stores files in its filestore directory; the original filename and mimetype are preserved.
The Customer Factor
Owner / User
Odoo CRM
res.users
1:1The Customer Factor user accounts (admins, technicians, sales reps) resolve to Odoo res.users records by email address match. Unmatched users are flagged before migration — either invited to Odoo first or assigned to a fallback user. The Customer Factor owner_id on jobs maps to crm.lead.user_id in Odoo.
The Customer Factor
Tag / Category
Odoo CRM
crm.tag
1:1The Customer Factor customer and job categories (e.g., service type, industry vertical) map to Odoo crm.tag records. Tags are stored as many2many relation on crm.lead in the crm_lead_res_partner_rel table. Each unique category label in The Customer Factor becomes a crm.tag.name; tags without a match are created during migration.
The Customer Factor
Activity / Note
Odoo CRM
mail.message
1:1The Customer Factor logged notes on customers or jobs map to Odoo mail.message records linked to the parent crm.lead or res.partner via res_model and res_id. Odoo's mail.thread model automatically threads messages by date and author. The original note body and create date are preserved; attachments on notes re-upload as ir_attachment records linked to the mail.message.
| The Customer Factor | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer | res.partner1:1 | Fully supported | |
| Prospect | crm.lead1:1 | Fully supported | |
| Estimate | sale.order1:1 | Fully supported | |
| Job / Work Order | crm.lead + project.task1:many | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Custom Field (per record) | x_studio / ir.model.fields1:1 | Fully supported | |
| Attachment / File | ir_attachment1:1 | Fully supported | |
| Owner / User | res.users1:1 | Fully supported | |
| Tag / Category | crm.tag1:1 | Fully supported | |
| Activity / Note | mail.message1: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.
The Customer Factor gotchas
Client cap applies to all tiers including paid plans
No public API — export is manual CSV only
Automated follow-up sequences do not migrate
Cancellation requires email to support with no self-service option
Texting requires third-party integration
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 The Customer Factor data export and enumerate custom field keys
FlitStack pulls the full CSV export from The Customer Factor covering customers, prospects, estimates, jobs, and invoices. We parse all rows and collect every unique custom field key across the dataset, deduplicating by normalized name. For each unique key we inspect the value type (text, numeric, date, pick-list) to assign the correct Odoo field type. We also capture the file attachment list per record, noting filename and storage location in The Customer Factor. The audit output is a migration scope document listing record counts per object, unique custom field definitions, and attachment volume — this feeds the pricing scope and Odoo custom field creation plan.
Create Odoo custom fields and configure crm.lead pipeline stages
Before any data lands in Odoo, FlitStack creates the custom field definitions on the crm.lead and res.partner models using Odoo's ir.model.fields via XML-RPC. Each custom field is assigned the appropriate field type (char, float, date, selection) and added to the default Odoo form view so it appears in the Odoo Studio layout. We also configure the crm.lead pipeline: each unique Customer Factor job status value gets a corresponding Odoo crm.stage record in the default pipeline. If The Customer Factor has multiple estimate statuses, we create corresponding sale.order states in the Sales app.
Resolve owners and map users by email match
The Customer Factor user accounts (sales reps, technicians, admins) are matched against Odoo res.users records by email address. Any owner in The Customer Factor that has no matching Odoo user is flagged before migration. Your team either creates the Odoo user first or decides on a fallback assignment. No crm.lead is written without a resolved user_id. For customers and prospects with no assigned owner, we assign them to the default Odoo salesman for the relevant team.
Run sample migration with field-level verification
A representative slice of records — typically 100–300 covering one customer, one prospect, one estimate, one job, and one invoice — migrates first against a staging Odoo database. We generate a field-level diff comparing each source field value against the destination Odoo record, flagging any field where the value did not land as expected (null where a value was expected, wrong format on a date, pick-list mismatch). The sample run validates custom field creation, stage mapping, owner resolution, and estimate line-item relinking before the full dataset commits.
Execute full migration and re-attach files
The full dataset loads into Odoo via XML-RPC in the correct dependency order: res.partner records first (so crm.lead.partner_id foreign keys resolve), then crm.lead records with stage_id and user_id assignment, then sale.order records with linked sale.order.line records, then account.move invoices. After all primary records are committed and Odoo IDs are assigned, a second pass creates ir_attachment records with the correct res_model and res_id pointing to the migrated crm.lead and res.partner records. A delta window of 24–48 hours captures any records modified in The Customer Factor during the cutover window. An audit log records every operation; one-click rollback reverts the Odoo database to the pre-migration snapshot if reconciliation fails.
Platform deep dives
The Customer Factor
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 The Customer Factor 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
The Customer Factor: Not publicly documented.
Data volume sensitivity
The Customer Factor 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 The Customer Factor to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your The Customer Factor 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 The Customer Factor
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.