CRM migration
Field-level mapping, validation, and rollback between Results and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Results
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Results and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Results to Odoo CRM is a transition from a standalone CRM to an ERP-integrated sales platform. Results uses a unified Contact model with custom properties; Odoo CRM uses a crm.lead object that distinguishes between Leads and Opportunities with stage-based pipelines. We design the mapping between Results properties and Odoo fields during scoping, configure pipeline stages and sales teams in Odoo, and migrate records in dependency order. Because Results has limited public API documentation, we verify field compatibility and exportability through direct data sampling during the discovery phase. Workflows, automations, and reporting configurations do not migrate as code; we deliver a written inventory of these for your admin to rebuild in Odoo Studio or via custom modules.
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 Results 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.
Results
Contact
Odoo CRM
crm.lead
1:1Results Contacts map to Odoo crm.lead records. In Odoo, a crm.lead can represent either a Lead (unqualified) or an Opportunity (qualified). We use a lifecycle or status property from Results to set the type field and stage_id on the Odoo lead. The original Results contact name, email, phone, and company fields map directly to name, email_from, phone, and partner_name on crm.lead. If Results stores a separate Company record, we create a res.partner (Contact/Company) in Odoo and link it via partner_id on the lead.
Results
Company
Odoo CRM
res.partner
1:1Results Companies map to Odoo res.partner records with partner_type = 'company'. The company domain from Results becomes the website field on res.partner. Odoo automatically creates individual Contact records under the Company partner when needed. Company-level addresses, industry classifications, and employee counts map to street/city/country, industry_id, and employee_nbr fields on res.partner.
Results
Deal
Odoo CRM
crm.lead (Opportunity)
1:1Results Deals map to Odoo crm.lead records where type = 'opportunity'. The Results deal amount maps to planned_revenue, close date maps to date_deadline, and pipeline stage maps to stage_id within the configured sales team. If Results supports line items on deals, we migrate each line as an optional product_id link or store the amount as a plain currency value depending on Odoo configuration complexity.
Results
Pipeline
Odoo CRM
crm.team + stage
lossyResults pipelines map to Odoo sales teams (crm.team) and stage IDs within each team. We configure stage names and probabilities in Odoo Studio or via XML before migration so that the imported Deals land in the correct stage. If Results uses multiple pipelines with different stage sets, we create separate crm.team records in Odoo and assign the appropriate team_id to each imported opportunity.
Results
Activity / Note
Odoo CRM
mail.message
1:1Results activity records (calls, emails, meetings, notes) migrate to Odoo mail.message records linked to the parent crm.lead via res_id and model='crm.lead'. Activity type, timestamp, and body content map to message_type, date, and body on mail.message. Call duration and disposition store in custom fields on the message. Note attachments migrate as ir.attachment records linked via the relation field.
Results
Owner / User
Odoo CRM
res.users
1:1Results owners map to Odoo res.users by email match. We resolve each Results owner to a user_id on the crm.lead record during import. Any Results owner without a matching Odoo user goes to a reconciliation queue for your admin to provision before record import resumes.
Results
Custom Field
Odoo CRM
ir.model.fields
lossyResults custom properties on Contact, Company, or Deal migrate as custom fields on the corresponding Odoo model. We create the field definitions via Odoo Studio or direct XML before migration and map source values during import. Custom field types (text, date, integer, selection) must be matched to Odoo field types (char, text, date, integer, selection) during scoping.
Results
Attachment
Odoo CRM
ir.attachment
1:1Results attachments associated with Contacts, Companies, or Deals migrate as Odoo ir.attachment records. We map the original filename, mimetype, and binary content. Attachments link to the parent record via res_model='crm.lead' or 'res.partner' and res_id pointing to the migrated record ID.
Results
Historical Timestamps
Odoo CRM
create_date / write_date
1:1We preserve the original create_date and write_date from Results on migrated Odoo records. Where Results tracks a first_contact_date or last_activity_date, we store these in custom fields on the crm.lead record for historical accuracy. This preserves pipeline tenure and recency metrics without relying on Odoo's native activity logging timestamps.
Results
Tag / Label
Odoo CRM
crm.tag
1:1Results tags or labels on Contacts and Deals migrate to Odoo crm.tag records. We create the tag if it does not exist and link it via crm.lead.tag_ids (many2many relation). Multi-value tags from Results with comma-separated or multi-select storage map to multiple crm.tag records.
Results
Custom Object
Odoo CRM
Custom Model
lossyResults custom objects migrate to Odoo custom models defined in a custom module. We create the model definition (Python class inheriting from models.Model), add field definitions via _columns or _fields, and register the model in the module's __init__.py and __manifest__.py. Custom object data imports after the standard objects and after any lookup dependencies are resolved.
Results
Quote / Proposal
Odoo CRM
sale.order
1:1If Results stores quotes or proposals attached to Deals, we migrate these as Odoo sale.order records in draft state. The linked opportunity (Results Deal) maps to crm.lead via the opportunity_id field on sale.order. Line items from the quote map to sale.order.line. The customer admin decides whether to activate the Odoo sale module during migration configuration.
| Results | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | crm.lead1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Deal | crm.lead (Opportunity)1:1 | Fully supported | |
| Pipeline | crm.team + stagelossy | Fully supported | |
| Activity / Note | mail.message1:1 | Fully supported | |
| Owner / User | res.users1:1 | Fully supported | |
| Custom Field | ir.model.fieldslossy | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Historical Timestamps | create_date / write_date1:1 | Fully supported | |
| Tag / Label | crm.tag1:1 | Fully supported | |
| Custom Object | Custom Modellossy | Fully supported | |
| Quote / Proposal | sale.order1: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.
Results gotchas
QuickBooks-linked records have dual sources of truth
Suite is not architected to scale beyond ~15 users / 15K contacts
No documented public REST API
Field Service photos and signatures require separate binary extraction
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 data sampling
We request a full data export or read-only API access from Results CRM. We inspect the actual column headers, data types, sample values, and null rates for Contacts, Companies, Deals, Pipelines, Activities, and any custom objects. We compare what we find against the standard Results CRM model we have documented and flag any fields that require custom mapping logic. This step produces a written data audit and a confirmed field mapping table before we quote or schedule migration work.
Odoo environment inspection and cleanup
We inspect the target Odoo database for residual module artifacts, leftover custom fields from prior configurations, and any demo data that should not be overwritten. We identify the Odoo version (Community or Enterprise), installed apps, existing crm.team records, existing stage configurations, and installed custom modules. We document any database cleanup required and coordinate with your Odoo admin to run cleanup SQL or uninstall residual modules before we begin the migration.
Schema design and custom module creation
We design the Odoo destination schema based on the Results data audit. This includes configuring sales teams (crm.team) and stage IDs, creating custom fields on crm.lead and res.partner via a custom module, defining the Lead-versus-Opportunity split rule, and mapping Results tags to crm.tag records. The custom module is built and installed in a staging Odoo environment (Odoo.sh staging or a local dev environment) for validation before production.
Staging migration and reconciliation
We run a full migration into the staging Odoo environment using production-like data volume. Your team reviews 25-50 randomly sampled records for accuracy, checks that activity history appears in the CRM timeline, and confirms that pipeline stage assignments match the source. We emit row-count reconciliation reports for every object. Any mapping corrections happen here. We do not proceed to production until you sign off on the staging results.
User provisioning and owner mapping
We extract every distinct owner or user referenced in Results records and match by email against the destination Odoo res.users table. Any owner without a matching Odoo user goes to a reconciliation queue. Your admin provisions missing users before we begin production migration, because OwnerId (user_id) is required on crm.lead records and determines which sales team sees the opportunity.
Production migration and cutover
We migrate records in dependency order: res.partner (Companies) first, crm.lead (Contacts and Deals with the Lead-Opportunity split applied), mail.message (activity history), ir.attachment (files), crm.tag (tags), custom model records last. We freeze write access to Results during the cutover window, run a final delta migration of any records modified during the migration run, then hand off. We deliver the automation and workflow inventory document for your admin to rebuild in Odoo Studio or custom modules.
Platform deep dives
Results
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 Results 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
Results: Not publicly documented.
Data volume sensitivity
Results 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 Results to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Results 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 Results
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.