CRM migration
Field-level mapping, validation, and rollback between Factoreal and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Factoreal
Source
Odoo CRM
Destination
Compatibility
7 of 13
objects map 1:1 between Factoreal and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Factoreal to Odoo CRM is a structural migration, not a record copy. Factoreal organizes data around Contacts, Segments, Campaigns, and Automations with a marketing-first data model and built-in e-commerce tracking; Odoo CRM uses a res.partner model where individual contacts and company records are both stored as partners with a company_type flag, and pipeline opportunities live in crm.lead. The critical migration decision is how Factoreal Contacts relate to Companies and whether the customer needs Odoo Sales and Inventory apps for order history. We extract all Factoreal data via CSV export cycles (no REST API is documented publicly), resolve the partner-type classification for each record, map campaign structure to CRM pipeline stages and tags, and migrate e-commerce orders to sale.order if the Sales app is in scope. We do not migrate automation workflows as executable rules; we deliver a written workflow inventory with Odoo automated-action recommendations for your admin to rebuild.
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 Factoreal 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.
Factoreal
Contact
Odoo CRM
res.partner
1:1Factoreal contacts map to Odoo res.partner records. We determine partner_type (individual vs company) by checking Factoreal's contact type or company association field. If a contact is associated with a Factoreal Company record, we link it via parent_id to the corresponding partner. The Factoreal contact ID is stored in a custom field (x_factoreal_id) as a dedupe key. The original HubSpot lifecycle stage analog (if used) is preserved in a custom stage field on the partner for audit and segmentation continuity. Email, phone, address, and custom field values migrate per the field mapping defined during discovery.
Factoreal
Company
Odoo CRM
res.partner (company_type = company)
1:1Factoreal company records map to Odoo res.partner with company_type set to company. The domain name from Factoreal becomes the partner's website field and serves as a dedupe key. Companies are imported before contacts so that the parent_id lookup is satisfied at the moment of contact insert. If two Factoreal companies share the same domain, they are deduplicated and consolidated into one partner record with a note documenting the merge.
Factoreal
Deal
Odoo CRM
crm.lead
1:1Factoreal deals map to Odoo crm.lead records with type set to opportunity. The deal name becomes the lead name, the deal amount maps to expected_revenue, and dealstage maps to the nearest Odoo stage_id via a stage mapping table built during discovery. Owner assignment migrates by email-to-user resolution. Closed-won and closed-lost status from Factoreal maps to the equivalent Odoo stage in the target pipeline.
Factoreal
Campaign
Odoo CRM
crm.lead (UTM fields + tag)
1:manyFactoreal campaigns have no direct Odoo CRM equivalent; we reconstruct them as crm.lead records with utm_source, utm_medium, and utm_campaign fields set from the campaign name, and a tag (e.g., campaign-name) applied for grouping. Campaign send history and aggregate engagement metrics are stored as a custom field block on each lead so that individual open and click records can be referenced in reporting. This approach preserves campaign context but not the granular per-campaign engagement analytics that Factoreal's campaign dashboard provides.
Factoreal
Automation
Odoo CRM
Documentation (no executable migration)
lossyFactoreal automation workflows define trigger conditions and multi-step action sequences across email, SMS, and WhatsApp channels. Odoo automated actions are scoped to single-record triggers (on-create, on-write, on-delete) and do not support the branching, delays, and cross-channel orchestration that Factoreal workflows implement. We capture the full workflow graph — triggers, conditions, delays, and actions — in a written specification document with an Odoo automated-action and Studio rule recommendation per workflow. The customer's Odoo admin rebuilds the workflow logic post-migration; we do not write Odoo automated actions as part of the migration scope.
Factoreal
Email Template
Odoo CRM
mail.template
1:1Factoreal email templates with HTML content and merge field placeholders migrate to Odoo mail.template. We extract template HTML and convert Factoreal merge field syntax (e.g., {{contact.first_name}}) to Odoo's QWeb field interpolation format (object.partner_id.name or {{object.partner_id.name}} depending on the template engine version). Visual rendering differences between Factoreal's email builder and Odoo's QWeb renderer are documented as a post-migration review item. Static assets (logos, images) embedded in templates are exported as file attachments and re-uploaded to Odoo's document management system.
Factoreal
Tag
Odoo CRM
res.partner (x_factoreal_tags field)
lossyFactoreal contact tags are stored as comma-separated values in a custom Char field (x_factoreal_tags) on the res.partner record. A dedicated Odoo tags infrastructure (mail.followers or crm.tag) requires additional module installation and configuration and is not included in the base CRM migration scope unless scoped during discovery. The customer chooses between plain-text storage and a formal tag model before migration begins.
Factoreal
Custom Field
Odoo CRM
ir.model.fields (pre-create) + migration
lossyFactoreal custom fields on contact and company records require pre-creation in Odoo before their values can be imported. We identify all Factoreal custom field definitions during discovery, select the nearest Odoo field type (Char, Selection, Integer, Float, Date, etc.), create the field via Odoo Studio or XML during the schema design phase, then import values per record during the data import phase. Fields with a many-to-many relationship (e.g., a contact tagged with multiple categories) are stored as Char with comma-separated values unless the customer requests a dedicated Many2many field setup.
Factoreal
SMS / WhatsApp Message History
Odoo CRM
mail.message (sms / whatsapp subtype)
1:1Factoreal SMS and WhatsApp message logs — send timestamp, direction, content, and recipient — migrate to Odoo mail.message records with a custom subtype (sms or whatsapp) so that channel history is visually distinguishable in the Odoo Discuss timeline. Delivery status from Factoreal (sent, delivered, failed) is stored as a custom field on the message record because Odoo mail.message does not expose a standard delivery status field. Inbound and outbound direction is preserved. Message content is stored as body text in mail.message.
Factoreal
Social Marketing Data
Odoo CRM
crm.lead (UTM fields)
lossyFactoreal social campaign metrics (impressions, engagement, clicks per post) are mapped to Odoo crm.lead records with utm_source set to the social channel name and utm_medium set to social. Individual post performance is stored as a custom field block because Odoo CRM does not have a native social post performance object. The customer reviews post-level metrics in Odoo's CRM reporting by filtering on the UTM source and date range.
Factoreal
E-commerce Data (Orders, Products)
Odoo CRM
sale.order + product.template
1:1Factoreal order records and product SKUs migrate to Odoo sale.order and product.template only if the Odoo Sales and Inventory apps are in scope for this migration. The sale.order partner_id links to the corresponding res.partner contact; order lines map to sale.order.line with product_id, product_uom_qty, and price_unit preserved. Odoo CRM does not include order management by default, so the need for Sales app activation is confirmed during discovery scoping. If the Sales app is not activated, order and product records are excluded from migration scope with a written rationale delivered to the customer.
Factoreal
Segment
Odoo CRM
res.partner (filter criteria as x_segment_notes)
lossyFactoreal segments are defined by filter rules on contact attributes and behavioral events. We export the full segment definition — name, filter criteria, and contact count at migration time — and store it as a custom text field (x_segment_notes) on each contact record that belonged to the segment. A companion Segment Definitions document lists each segment name, its rule logic, and the Odoo CRM filter or segmentation tool the admin can use to reproduce the segment in Odoo. Segments are not migrated as live segmentation rules.
Factoreal
Website Visitor
Odoo CRM
Not migratable
1:1Factoreal website visitor session data — page views, visit frequency, browsing behavior — is cookie-based and tied to its own JavaScript embed. Session records cannot be exported as structured data and are not portable to Odoo or any external platform. We scope this as a known gap and recommend exporting aggregate metrics manually from Factoreal's reporting UI if historical web engagement data is needed in the destination. The customer documents the aggregate figures in Odoo's custom fields or a reporting spreadsheet post-migration.
| Factoreal | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company_type = company)1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Campaign | crm.lead (UTM fields + tag)1:many | Fully supported | |
| Automation | Documentation (no executable migration)lossy | Fully supported | |
| Email Template | mail.template1:1 | Fully supported | |
| Tag | res.partner (x_factoreal_tags field)lossy | Fully supported | |
| Custom Field | ir.model.fields (pre-create) + migrationlossy | Fully supported | |
| SMS / WhatsApp Message History | mail.message (sms / whatsapp subtype)1:1 | Mapping required | |
| Social Marketing Data | crm.lead (UTM fields)lossy | Mapping required | |
| E-commerce Data (Orders, Products) | sale.order + product.template1:1 | Mapping required | |
| Segment | res.partner (filter criteria as x_segment_notes)lossy | Fully supported | |
| Website Visitor | Not migratable1: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.
Factoreal gotchas
No public REST API for automated migration
Website visitor session data is not exportable
Contact migration required hands-on support in practice
Automation workflows do not migrate as executable rules
Limited third-party integration ecosystem
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
Discovery and Factoreal export coordination
We audit the Factoreal account across contacts, companies, deals, campaigns, automations, segments, and e-commerce data (orders and products). Because Factoreal has no REST API, the customer must generate CSV exports from the application UI for each data type. We provide a structured export checklist specifying which fields to include, which export order to follow (companies before contacts to satisfy parent_id lookups), and the file naming convention to use. We also collect a representative sample export to validate the data shape and identify missing required fields, duplicates, and encoding issues before the full export is requested. The discovery output is a written scope document confirming which data types are in scope, which are excluded, and which are documented as not migratable.
Odoo schema design and pipeline configuration
We configure the destination Odoo CRM instance before any data is imported. This includes activating the CRM app (and Sales app if order history is in scope), designing the pipeline stages to mirror Factoreal deal stages or campaign categories, creating custom fields on res.partner and crm.lead that correspond to Factoreal custom fields identified during discovery, and defining the contact-to-company parent_id relationship rules. If Odoo Sales is in scope, we also pre-create product.template records and set up the sale.order import template. All schema configuration is validated in an Odoo test database before the production import begins. We provide a schema design document for the customer's Odoo admin to review and approve before proceeding.
Data preprocessing and partner deduplication
We preprocess each Factoreal CSV export before Odoo import. Steps include encoding normalization (UTF-8 enforcement), duplicate detection on email as the primary key (merging duplicates with a completeness-based master-record rule), date format standardization, and phone number formatting. We apply the contact-to-company classification logic to assign company_type on res.partner and resolve parent_id links between contacts and their Factoreal company. Automations are parsed into a written specification document with trigger-condition-action steps enumerated per workflow. E-commerce orders are mapped to sale.order format with line items restructured to Odoo's order-line schema. Preprocessed files are validated against the Odoo import template format before staging import begins.
Staging migration and reconciliation
We run a full migration into an Odoo staging environment using production-like data volume. The customer reviews 25-50 randomly sampled records per object type against the source Factoreal exports, verifying field values, parent-child relationships, and activity timelines. We run row-count reconciliation after each import phase (partners, leads, orders, messages) and resolve any discrepancies before the production migration. Any field mapping corrections, deduplication rule adjustments, or data quality exceptions are documented and applied to the production import plan. The customer formally signs off the staging results before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: res.partner company records first (as parent references), res.partner individual contacts second (with parent_id resolved), crm.lead deals and campaign-leads third (with user_id resolved by email match), sale.order and product.template fourth (if Sales app is in scope), mail.message for SMS and WhatsApp history fifth, and custom field values last. Each phase emits a row-count reconciliation report and a sample record validation checklist. Any Factoreal records modified during the migration window are delta-migrated in a final pass before cutover. Owner reconciliation queues any Factoreal owner without a matching Odoo user for the customer's admin to provision before the final phase resumes.
Cutover, handoff, and automation rebuild support
We freeze Factoreal write access during cutover, execute the final delta migration, validate critical record counts in Odoo, and confirm that all automations and integrations are live. We deliver the Automation Specification document listing every Factoreal workflow with its trigger, conditions, actions, and a recommended Odoo automated-action or Studio rule equivalent. We deliver a Reconciliation Report showing record counts by object, duplicates resolved, and records excluded with rationale. We offer a one-week hypercare window to resolve any post-cutover data issues raised by the sales or operations team. We do not rebuild Factoreal automations as Odoo automated actions; that work is documented for the customer's admin to execute as a separate, scoped effort.
Platform deep dives
Factoreal
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Factoreal and Odoo CRM.
Object compatibility
2 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
Factoreal: Not publicly documented.
Data volume sensitivity
Factoreal 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 Factoreal to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Factoreal 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 Factoreal
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.