CRM migration
Field-level mapping, validation, and rollback between SoulCRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
SoulCRM
Source
Odoo CRM
Destination
Compatibility
10 of 13
objects map 1:1 between SoulCRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from SoulCRM to Odoo CRM requires a CSV-based migration rather than an API pull because SoulCRM does not publish public API documentation. We request exports from each module, validate field headers against SoulCRM's standard schema, and import into Odoo CRM using the standard CSV import with parent-record lookup resolution. The critical sequencing is Companies first (to establish Account records), then Contacts (resolved to the Account parent), then Deals (resolved to the Contact or Account owner). SoulCRM custom fields for GST identifiers, regional segments, and industry-specific data require explicit mapping to Odoo custom fields, which we define in the destination Odoo database before any data loads. Activity history including call logs, email captures, and task records migrates against the resolved Contact and Account IDs. SoulCRM workflows and marketing campaign automations do not migrate; we deliver a written inventory for the customer's admin to rebuild in Odoo Studio or via the Odoo apps ecosystem.
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 SoulCRM 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.
SoulCRM
Company
Odoo CRM
Partner / Account
1:1SoulCRM Companies map to Odoo CRM Partners with company_type set to company. The Company Name maps to Partner name, registered address maps to street/city/state/zip fields, phone maps to phone, email maps to email, and website maps to website. SoulCRM custom fields capturing GST numbers map to custom Char fields on res.partner. SoulCRM regional segmentation fields map to Odoo custom country_group or region picklist fields. We import Companies first because every Contact in SoulCRM requires a parent Company link, and Odoo Partner records must exist before Contact import to satisfy the partner_id foreign key.
SoulCRM
Contact
Odoo CRM
Partner
1:1SoulCRM Contacts map to Odoo CRM Partners with company_type set to person. First name and last name split from SoulCRM full name field into Odoo partner name fields. Email, phone, mobile, and address fields map directly. The parent_id on Partner links to the imported Company (res.partner of type company) to preserve the SoulCRM Company-Contact relationship. We use email as the dedupe key during import to avoid creating duplicate Partner records for contacts that appear in multiple SoulCRM modules.
SoulCRM
Lead
Odoo CRM
Lead
1:1SoulCRM Leads map to Odoo CRM Lead (crm.lead model). Lead name, email, phone, source, and status migrate directly. SoulCRM lead scoring custom fields map to Odoo custom probability adjustment fields. SoulCRM assignment fields (owner) map to Odoo user_id. Unqualified leads stay as Odoo Lead until manually converted; qualified leads convert during migration based on the customer's criteria. The SoulCRM Marketing Module lead capture fields map to Odoo custom fields on crm.lead for campaign attribution.
SoulCRM
Deal
Odoo CRM
Opportunity
1:1SoulCRM Deals map to Odoo CRM Opportunities (crm.lead model with type = opportunity). Deal name maps to Opportunity name, amount maps to planned_revenue, probability maps to probability (as integer), and stage maps to stage_id via Odoo stage name matching. The deal owner (SoulCRM assignment) maps to user_id on Opportunity. Closed-Lost and Closed-Won statuses from SoulCRM map to Odoo stage_id values with probability set to 0 or 100 respectively. SoulCRM pipeline stage names require explicit mapping to Odoo CRM stage_ids via the customer's Odoo pipeline configuration.
SoulCRM
Deal Stage
Odoo CRM
Stage
lossySoulCRM deal pipeline stages map to Odoo CRM stage records. Each SoulCRM stage name becomes an Odoo stage_name, with probability percentages mapped to Odoo's stage probability field. If SoulCRM has a single pipeline, we create a single Odoo CRM team with that pipeline. If multiple pipelines exist in SoulCRM, we create multiple Odoo CRM teams (salesteam_id) with their respective stage sets. Stage order sequence numbers migrate from SoulCRM to Odoo's sequence field to preserve visual ordering in the pipeline kanban view.
SoulCRM
Activity: Call
Odoo CRM
Phonecall
1:1SoulCRM call logs map to Odoo CRM Phonecall records (crm.phonecall model in Odoo apps, or Task with activity_type phone if using the Odoo native activity system). Call duration, disposition, and timestamp migrate to the corresponding Odoo fields. The phonecall or activity is linked to the resolved Partner (Contact) record via the partner_id lookup. Call notes from SoulCRM become the Odoo activity notes field. We resolve the parent Partner record by email match before inserting the activity.
SoulCRM
Activity: Email
Odoo CRM
Message / Activity
1:1SoulCRM email logs map to Odoo CRM Message records on the Lead, Opportunity, or Partner (mail.message model). Email subject becomes message_subject, body migrates to message_body as HTML. The email-from and email-to addresses migrate to mail.message fields. If SoulCRM stores emails as activity records, they map to Odoo mail.activity records with activity_type email. Email body HTML formatting may require normalization (stripping embedded styles) to render correctly in Odoo's mail thread interface.
SoulCRM
Activity: Task
Odoo CRM
Task / Project Task
1:1SoulCRM tasks map to Odoo CRM tasks. Task subject, description, due date, and status migrate to Odoo task fields. If the customer uses Odoo Project app, tasks map to project.task; otherwise they map to CRM task records. Task assignment (SoulCRM owner) maps to user_id on the Odoo task. Completed status from SoulCRM maps to Odoo stage or kanban_state = done.
SoulCRM
Activity: Meeting
Odoo CRM
Calendar Event
1:1SoulCRM meeting records map to Odoo Calendar Event records (calendar.event model). Meeting title, start datetime, end datetime, location, and description migrate directly. Attendees linked to SoulCRM Contacts resolve to Odoo Partner records and appear as calendar.attendee records. We preserve meeting body or notes as the calendar event description. If SoulCRM stores meetings as activity records, they map to mail.activity with activity_type meeting.
SoulCRM
Marketing Campaign
Odoo CRM
UTM Campaign
lossySoulCRM Marketing Campaigns map to Odoo UTM Campaign records (utm.campaign model). Campaign name, type, start/end dates, and budget migrate to the corresponding Odoo fields. Campaign membership (Contacts and Leads linked to the campaign) maps to utm.mixin records on the Contact or Lead. Odoo UTM tags track campaign attribution on leads and opportunities. Note that SoulCRM campaign automation workflows do not migrate; we document the campaign names and membership counts for the customer's admin to recreate in Odoo marketing automation or a third-party email tool.
SoulCRM
Custom Field (GST)
Odoo CRM
Custom Field on Partner
lossySoulCRM custom fields for GST numbers (India Goods and Services Tax identifiers) map to Odoo custom Char fields on res.partner. We create the custom field in Odoo via Studio or Python inheritance before Partner import, set the field label to GST Number, and set the field type to Char. GST format validation rules are documented for the customer's admin to configure in Odoo as a Python constraint or Studio validation. SoulCRM regional segment fields similarly map to Odoo custom selection or Char fields on res.partner.
SoulCRM
Attachment
Odoo CRM
Attachment / Document
1:1SoulCRM file attachments linked to Companies, Contacts, or Deals migrate as Odoo IrAttachment records (ir.attachment model). We extract binary file data from SoulCRM CSV exports or separate file exports, create ir.attachment records with res_model pointing to res.partner or crm.lead, res_id set to the migrated record's ID, and store the file as base64 in the Odoo database. Folder hierarchy from SoulCRM flattens in Odoo; we document the original folder path in the attachment description field for reference.
SoulCRM
Owner / User
Odoo CRM
User
1:1SoulCRM Owner (assigned user on a record) maps to Odoo CRM User via email match. We extract distinct owner email addresses from all SoulCRM modules, match against the destination Odoo instance's res.users table, and resolve user_id on imported records. Any SoulCRM owner without a matching Odoo User is held in a reconciliation queue for the customer's admin to provision before record import resumes. Inactive owners can be set to Odoo User with active=false to preserve assignment history without granting login access.
| SoulCRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Company | Partner / Account1:1 | Fully supported | |
| Contact | Partner1:1 | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Deal Stage | Stagelossy | Fully supported | |
| Activity: Call | Phonecall1:1 | Fully supported | |
| Activity: Email | Message / Activity1:1 | Fully supported | |
| Activity: Task | Task / Project Task1:1 | Fully supported | |
| Activity: Meeting | Calendar Event1:1 | Fully supported | |
| Marketing Campaign | UTM Campaignlossy | Fully supported | |
| Custom Field (GST) | Custom Field on Partnerlossy | Fully supported | |
| Attachment | Attachment / Document1:1 | Fully supported | |
| Owner / User | User1: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.
SoulCRM gotchas
No public API documentation discovered in research
Minimum user requirements on paid tiers affect per-seat pricing
Absence from G2, Capterra, and TrustRadius review platforms
Limited documented integrations with third-party tools
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 export request
We audit the SoulCRM account across all active modules (Companies, Contacts, Leads, Deals, Activities, Marketing Campaigns) and request CSV exports from each module. We also request any file attachment archives and a list of all custom fields in use, including GST number fields, regional segment fields, and any industry-specific custom properties. We validate the CSV headers against SoulCRM's standard schema to identify non-standard fields. This discovery output is a written data map and a list of any SoulCRM features (such as integrations, telephony, or email capture) that will require separate configuration in Odoo.
Odoo instance setup and custom field creation
We assess the destination Odoo instance (Odoo Online, Odoo.sh cloud, or self-hosted) and configure the CRM app with the customer's pipeline stages, sales teams, and tag structure. We create all required custom fields in Odoo (via Studio or Python inheritance) before any data import begins, including GST number fields on res.partner, regional segmentation fields, and any SoulCRM custom properties that have no Odoo standard equivalent. We also configure the Odoo email integration (Outlook or Gmail sync per user) and document the steps for the customer's admin to complete during the migration window.
CSV transformation and test import to Odoo Sandbox
We transform SoulCRM CSV exports into Odoo CSV import format, splitting full names into first/last, mapping SoulCRM stage names to Odoo stage_ids via the customer's stage mapping table, and resolving SoulCRM owner emails to Odoo user_ids. We run a test import into a Odoo test database (Sandbox or clone of the production instance) to validate record counts, identify import errors, and spot-check 25-50 records against the SoulCRM source. Any mapping corrections happen in the test environment before production migration begins. Odoo's data import error messages are reviewed to catch validation rule failures early.
Parent-record dependency import
We run production import in strict dependency order: Companies first (res.partner records with company_type=company receive internal Odoo IDs), Contacts second (res.partner with company_type=person linked via partner_id to the resolved Company IDs), Leads third, Opportunities fourth (Deals mapped to crm.lead with type=opportunity, linked to partner_id and user_id), Activity history fifth (call logs, emails, meetings, tasks via Odoo's CSV import or direct database insert for bulk activity records), and Attachments last. Each phase emits a row-count reconciliation report before the next phase begins. Any SoulCRM Owner without a matching Odoo User is held in a reconciliation queue.
Cutover, delta migration, and validation
We freeze SoulCRM writes during cutover, run a final delta import of any records modified during the migration window (new Contacts, updated Deals, new Activities), then enable Odoo CRM as the system of record. We run a final reconciliation comparing record counts and spot-checking field values between SoulCRM and Odoo. We deliver the SoulCRM workflow inventory document, the Odoo integration setup checklist (email sync, VoIP), and the custom field schema reference to the customer's admin team. We support a one-week hypercare window for reconciliation issues raised by the sales team.
Workflow rebuild handoff
We deliver a written inventory of every active SoulCRM workflow and marketing automation, including trigger conditions, action steps, and recommended Odoo Studio equivalents. This document covers each SoulCRM workflow as a discrete item with Odoo configuration guidance. We do not rebuild workflows as Odoo automated actions inside the migration scope; that work is handled by the customer's Odoo administrator or an Odoo implementation partner. Marketing campaign sequences and email sequences similarly document separately for rebuild in Odoo email marketing or a third-party engagement platform.
Platform deep dives
SoulCRM
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 SoulCRM 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
SoulCRM: Not publicly documented.
Data volume sensitivity
SoulCRM 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 SoulCRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your SoulCRM 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 SoulCRM
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.