CRM migration
Field-level mapping, validation, and rollback between RSoft CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
RSoft CRM
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between RSoft CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from RSoft CRM to Odoo CRM is a schema-translation migration between an India-market sales CRM and an open-source all-in-one ERP with a modular CRM. RSoft organizes data around Leads, Contacts, Companies, Deals, Activities, and Tickets; Odoo CRM uses Partners (both organizations and individuals in one model), Leads, Opportunities, and Project tasks. We resolve the structural difference first: RSoft's separate Company and Contact objects map to Odoo's single res.partner record, which can represent both an organization and a person depending on a type flag. Contacts attach to the Partner record via the child_ids relationship. Deals migrate as crm.lead (opportunity), and RSoft pipeline stages map explicitly to Odoo stage sequences. The most significant data loss risk is WhatsApp conversation history and IVR call logs, which RSoft's CSV export does not include; we flag these gaps during scoping and transfer attachments via file transfer where possible. Workflows, IVR flows, and autodialer configurations do not migrate because they are RSoft-specific and have no Odoo equivalent; we deliver a written inventory for the customer's admin to rebuild in Odoo Studio or via the workflow engine.
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 RSoft CRM 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.
RSoft CRM
Company
Odoo CRM
res.partner
1:1RSoft Company records map to Odoo res.partner with type = 'company'. The company name maps to name, industry to industry_id, address fields to street, street2, city, state_id, zip, and country_id, and owner to user_id on the contact side. We create the company Partner first, then use its id as parent_id when creating the contact Partner records so that child contacts are properly linked to the organization.
RSoft CRM
Contact
Odoo CRM
res.partner (type = 'contact')
1:manyRSoft Contact records map to Odoo res.partner with type = 'contact' and parent_id set to the Partner id from the mapped Company. Fields mapped include name, phone, email, address components, lifecycle stage (preserved as a tag or custom stage field), and owner (mapped to Odoo user_id). The parent_id linkage is critical for Odoo's contact hierarchy to function correctly. If a Contact has no Company in RSoft, it is created as a standalone Partner with type = 'contact' and no parent_id.
RSoft CRM
Lead
Odoo CRM
crm.lead
1:1RSoft Lead records map to Odoo crm.lead in the Lead stage. Fields mapped include name (contact or company name), contact_name, email_from, phone, street, website (from company domain if available), lead_source (mapped to tag or source_id if Odoo has source tracking enabled), stage_id, and user_id (owner). RSoft lead score migrates to a custom integer field if configured in Odoo. The lead_type field in Odoo defaults to 'lead'; if the customer wants all records treated as opportunities, we set type = 'opportunity' during import.
RSoft CRM
Deal
Odoo CRM
crm.lead (opportunity)
1:1RSoft Deal records map to Odoo crm.lead with type = 'opportunity'. The deal amount maps to planned_revenue, probability maps to probability (with Odoo's stage-based probability adjusted to match RSoft's custom percentages), expected close date maps to date_deadline, and owner maps to user_id. The RSoft pipeline assignment and stage name map to Odoo's stage_id within the CRM pipeline. We preserve the original deal name as the opportunity name in Odoo. If RSoft deals reference a Company and Contact, those ids are resolved to Odoo partner_id and contact_id before import.
RSoft CRM
Pipeline Stages
Odoo CRM
crm.stage
lossyRSoft pipeline stage names, positions, and probability values are extracted from the deal export and mapped to Odoo crm.stage records within the CRM pipeline. We create each stage with the correct sequence number to match the kanban column order in RSoft. Probability percentages are set on the stage if the customer uses stage-driven probability; if the customer uses custom probability per deal, those values migrate as override values on each opportunity record. Stage automation triggers from RSoft (such as automatic actions on stage entry) are documented in the automation handoff as Odoo Automated Actions equivalents.
RSoft CRM
Activity
Odoo CRM
mail.activity
1:1RSoft Activities (calls, emails, SMS, notes) attached to Contacts, Leads, or Deals migrate to Odoo mail.activity records. Activity type maps to activity_type_id (call, email, meeting, sms, note), subject to activity_decoration, and date_deadline to the activity date. The user_id (owner) maps to the Odoo responsible user. Note body migrates as a mail.message record on the thread rather than as an activity. We flag that IVR call logs and autodialer call records are stored in RSoft-specific telephony modules that do not appear in the standard CSV export and cannot be migrated via standard Odoo import.
RSoft CRM
Ticket
Odoo CRM
helpdesk.ticket
lossyRSoft Ticket records map to Odoo helpdesk.ticket if the customer licenses the Odoo Helpdesk app. Subject, status, priority, and assignee map to name, stage_id, priority, and user_id. Ticket conversations from email, phone, chat, and social media migrate as mail.message thread entries. If the customer does not license the Helpdesk app, Tickets migrate as crm.lead records tagged as 'ticket' and the customer documents this as a post-migration decision. Custom ticket fields above the plan limit require Odoo Studio configuration before import.
RSoft CRM
Tag
Odoo CRM
crm.tag
1:1Tags from RSoft Contacts, Leads, and Deals are extracted as a flat list, deduplicated, and created as crm.tag records in Odoo before any record import. Each migrated record's tag list is then linked via crm.lead.tag_ids (or res.partner.category_id for contact tags). The tag vocabulary is preserved exactly; Odoo does not impose a tag limit at any tier.
RSoft CRM
User
Odoo CRM
res.users
1:1RSoft user accounts referenced as owners on Contact, Company, Deal, and Ticket records are mapped to Odoo res.users by email match. We extract the full user roster from RSoft during discovery, match against the destination Odoo instance's users, and flag any RSoft owner without a corresponding Odoo user. The customer's Odoo admin provisions missing users before record migration begins. Owner resolution is a prerequisite for all object imports because user_id is a required or strongly recommended field in Odoo's CRM model.
RSoft CRM
Custom Fields
Odoo CRM
ir.model.fields (custom)
lossyRSoft custom fields (those beyond the standard set) on Contacts, Leads, Deals, and Tickets are mapped to custom fields in Odoo. We pre-create the custom field schema in Odoo via Studio or direct model extension before data import. Field types are mapped: text to char or text, number to float or integer, date to date, dropdown to selection, multi-select to many2many or tags. Fields that exceed the destination plan's limit (if the customer is on a lower Odoo tier) are flagged during scoping for review. The original field names and values are preserved; we do not rename or retype custom fields without explicit customer approval.
RSoft CRM
Attachments
Odoo CRM
ir.attachment
1:1RSoft does not expose document attachments via CSV export, so inline record migration does not include files. We identify any file attachments referenced in RSoft (documents linked to Contacts, Deals, or Tickets) during discovery and transfer them separately via file transfer into Odoo's ir.attachment table. The attachment is linked to the migrated record via res_model and res_id. We note the file size and count during scoping so the customer can allocate appropriate storage in the Odoo instance.
RSoft CRM
Workflow
Odoo CRM
(documented only, not migrated)
1:1RSoft workflow definitions do not export from the platform and cannot be migrated as code. We document every active RSoft workflow during discovery: trigger event, conditions, sequence of actions (WhatsApp, email, call, SMS, field update), and delay configuration. This inventory is delivered as a written handoff document so the customer's Odoo admin can rebuild equivalent Automated Actions in Odoo Studio. We do not rebuild workflows as part of the migration scope.
| RSoft CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Company | res.partner1:1 | Fully supported | |
| Contact | res.partner (type = 'contact')1:many | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Deal | crm.lead (opportunity)1:1 | Fully supported | |
| Pipeline Stages | crm.stagelossy | Mapping required | |
| Activity | mail.activity1:1 | Fully supported | |
| Ticket | helpdesk.ticketlossy | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| User | res.users1:1 | Fully supported | |
| Custom Fields | ir.model.fields (custom)lossy | Mapping required | |
| Attachments | ir.attachment1:1 | Not supported | |
| Workflow | (documented only, not migrated)1: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.
RSoft CRM gotchas
Add-on cost stacking inflates the headline price
Custom fields and workflows are tier-gated
IVR call logs and WhatsApp conversations do not export via CSV
No publicly documented API rate limits or bulk endpoints
Record limits vary by plan tier
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 module selection
We audit the source RSoft account across plan tier (Standard, Advanced, Enterprise, Customised), total record counts per object, custom field inventory, pipeline and stage definitions, active workflow count, and add-on usage (IVR, WhatsApp, autodialer). We pair this with an Odoo edition and app selection discussion: CRM only, CRM plus Helpdesk, or full ERP (Sales, Inventory, Accounting, Project). The discovery output is a written migration scope, an Odoo app recommendation, and a data gap report listing WhatsApp history, IVR call logs, and any attachments that cannot migrate via standard export.
Schema design and Partner-Contact hierarchy
We design the destination Odoo schema before any data moves. This includes creating crm.stage records matching RSoft pipeline stage names and probabilities, configuring crm.tag records from the RSoft tag vocabulary, and designing the custom fields for any RSoft custom properties. The most critical design decision is the Partner-Contact hierarchy: we create all RSoft Company records as res.partner with type='company' first, then create each Contact as res.partner with type='contact' and parent_id pointing to the Company Partner. Schema is deployed into an Odoo staging database first for validation.
Sandbox migration and reconciliation
We run a full migration into an Odoo staging database using production-like data volume. The customer's RevOps lead reconciles record counts (Partners in, Contacts in, Leads in, Opportunities in, Activities in), spot-checks 25-50 random records against the RSoft source, and signs off the schema and mapping before production migration begins. Any field mapping corrections, tag vocabulary additions, or stage probability adjustments happen in staging, not production.
User reconciliation and owner provisioning
We extract every distinct RSoft user referenced as an owner on Contact, Company, Deal, Lead, Activity, and Ticket record and match by email against the destination Odoo instance's res.users table. Any RSoft owner without a matching Odoo user is placed in a reconciliation queue. The customer's Odoo admin provisions missing users (active or inactive depending on whether the original RSoft user is still employed). Migration cannot proceed past this step because user_id is a required field on most CRM records in Odoo.
Production migration in dependency order
We run production migration in record-dependency order: res.partner records for Companies (type='company'), res.partner records for Contacts (type='contact' with parent_id resolved), crm.lead records for Leads, crm.lead records for Deals/Opportunities (with partner_id and contact_id resolved), crm.tag linkage on all records, mail.activity records for activity history, helpdesk.ticket records (if the Helpdesk app is licensed), and custom field values. Each phase emits a row-count reconciliation report before the next phase begins. Attachments are transferred separately via file transfer with ir.attachment linkage to the migrated record.
Cutover, validation, and automation rebuild handoff
We freeze RSoft writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver the workflow and automation inventory document to the customer's admin team. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild RSoft workflows as Odoo Automated Actions inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
RSoft CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 RSoft CRM and Odoo CRM.
Object compatibility
3 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
RSoft CRM: Not publicly documented.
Data volume sensitivity
RSoft CRM 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 RSoft CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your RSoft CRM 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 RSoft CRM
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.