CRM migration
Field-level mapping, validation, and rollback between SalezShark and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
SalezShark
Source
Odoo CRM
Destination
Compatibility
7 of 14
objects map 1:1 between SalezShark and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from SalezShark to Odoo CRM is a structural migration for both platforms. SalezShark has no publicly documented API — all extraction relies on CSV exports from the UI, which constrains migration automation and requires careful batch planning. Odoo CRM uses crm.lead as the primary sales object for both unqualified prospects and qualified opportunities, with res.partner holding the contact and company record; there is no separate Account object as seen in Salesforce. We resolve this schema difference during scoping, export the SalezShark pipeline configuration, and re-create stages as Odoo crm.lead stage records. Workflow Automations and Custom Event Triggers from SalezShark do not migrate as executable code; we deliver a written inventory describing each automation's trigger, conditions, and downstream actions for the Odoo admin to rebuild using Odoo's Automated Actions (ir.actions.server) or Studio. Reports and dashboards similarly do not migrate; we deliver the filter and field selections so the Odoo admin can recreate them in Odoo's reporting engine. Historical timestamps on records are preserved during import via Odoo's write_date and create_date fields.
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 SalezShark 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.
SalezShark
Leads
Odoo CRM
crm.lead (type = lead)
1:1SalezShark Leads map to Odoo crm.lead records with type = lead (not opportunity). The Lead's auto-assignment rules and conversion scoring from SalezShark do not transfer as executable logic — we preserve them as custom field values (ss_assignment_rule__c, ss_conversion_score__c) on the migrated crm.lead so the Odoo admin can reference them when setting up Odoo's Sales Team assign or lead scoring rules.
SalezShark
Contacts
Odoo CRM
res.partner
1:1SalezShark Contacts map to Odoo res.partner records with company_type = person. Name, email, phone, mobile, and address fields map directly to their Odoo equivalents. The contact's parent_id is left null initially; it is populated after Account migration if the Contact belongs to a Company record in SalezShark.
SalezShark
Accounts
Odoo CRM
res.partner (company_type = company)
1:1SalezShark Accounts map to Odoo res.partner records with company_type = company. This is a critical schema difference: Odoo does not have a separate Account object. Company-level fields (industry, employee_count, annual_revenue) from SalezShark migrate to custom fields on the res.partner record. The Account's name becomes partner name, and the Account's domain is stored in the website field for deduplication reference.
SalezShark
Contact-to-Account association
Odoo CRM
res.partner.parent_id
1:manySalezShark Contacts linked to an Account get their parent_id set to the Account's res.partner record. We resolve this lookup after Account records are created and before Contact import begins. Contacts without a parent Account in SalezShark import with parent_id null as standalone person partners.
SalezShark
Opportunities
Odoo CRM
crm.lead (type = opportunity)
1:1SalezShark Opportunities map to Odoo crm.lead records with type = opportunity. The pipeline stage from SalezShark maps to Odoo's crm.stage via stage name matching; close date becomes date_deadline, and expected revenue maps to planned_revenue. Owner assignment resolves via email lookup against Odoo res.users.
SalezShark
Pipeline
Odoo CRM
crm.stage (per pipeline)
lossySalezShark Pipelines map to Odoo stage groups. Each SalezShark pipeline becomes a named set of crm.stage records within Odoo. We export the pipeline stage names and ordering, then create corresponding Odoo stages with is_won = True on the closing stage and sequence ordering preserved. If the customer has multiple pipelines in SalezShark, we create separate stage sequences in Odoo and use crm.lead.team_id to route opportunities to the correct pipeline view.
SalezShark
Tasks and Activities
Odoo CRM
crm.lead.activity (mail.activity)
1:1SalezShark Tasks map to Odoo mail.activity records linked to crm.lead. Activity type (call, email, meeting, note) maps to activity_type_id; due date maps to date_deadline; status maps to active (True for open, False for done). Task notes migrate as mail.message records on the lead. We preserve the original creation timestamp as create_date on the activity record.
SalezShark
Custom Fields
Odoo CRM
ir.model.fields (custom)
lossySalezShark Custom Fields available on Basic tier and above require Odoo custom field creation before data import. We export the custom field schema (name, data type, picklist values) from SalezShark's settings and create corresponding ir.model.fields on the appropriate Odoo model (crm.lead or res.partner) in Developer mode. Selection fields with picklist values migrate as selection fields; text fields migrate as char or text depending on length; numeric fields migrate as float or integer depending on precision.
SalezShark
Documents
Odoo CRM
ir.attachment
1:1SalezShark Document Management files attached to records migrate as Odoo ir.attachment records linked to the corresponding res.partner or crm.lead via res_model and res_id. We export document metadata (filename, file type, upload date) and re-associate files to the migrated record. The actual binary files are exported from SalezShark's file storage and re-uploaded to Odoo's attachment store.
SalezShark
Users
Odoo CRM
res.users
1:1SalezShark Owner records map to Odoo res.users by email address. The migration user runs as a system admin in Odoo, and OwnerId on Opportunities and Tasks is resolved to res.users id. Any SalezShark Owner without a matching res.users record is flagged in the reconciliation report for the Odoo admin to provision before the final import batch.
SalezShark
Workflow Automations
Odoo CRM
ir.actions.server (written spec)
lossySalezShark Workflow Automations (Professional tier) are exported as written configuration specifications describing trigger conditions, filter logic, and downstream actions. Odoo's equivalent is Automated Actions using ir.actions.server with server actions and cron triggers. We do not rebuild them as executable code in Odoo; we deliver the written spec and the customer or an Odoo partner rebuilds them post-migration.
SalezShark
Custom Event Triggers
Odoo CRM
ir.cron (written spec)
lossySalezShark Custom Event Triggers (Professional tier) are exported as written specifications. Odoo's equivalent is ir.cron for scheduled triggers and ir.model.notify for model-level notifications. We deliver the configuration spec (trigger criteria, frequency, actions) for the Odoo admin to rebuild using Odoo's Scheduler/Automated Actions framework. These are not migrated as live code.
SalezShark
Reports and Dashboards
Odoo CRM
ir.ui.view (written spec)
lossySalezShark Reports and Dashboards are exported as configuration metadata (report filters, field selections, grouping logic). We do not migrate report query results. The written spec includes report name, filter criteria, sort order, and chart type (if applicable) so the Odoo admin can recreate each report in Odoo's Reporting section or using Odoo Studio for custom reports.
SalezShark
Campaigns
Odoo CRM
crm.tag or utm.source
lossySalezShark Campaign membership records (Contacts and Leads enrolled) migrate as crm.tag records on the relevant crm.lead, with tag category set to campaign. Email campaign content and templates do not migrate; we deliver a written campaign spec for the Odoo admin to rebuild in Odoo's Email Marketing app or a connected email platform.
| SalezShark | Odoo CRM | Compatibility | |
|---|---|---|---|
| Leads | crm.lead (type = lead)1:1 | Mapping required | |
| Contacts | res.partner1:1 | Fully supported | |
| Accounts | res.partner (company_type = company)1:1 | Fully supported | |
| Contact-to-Account association | res.partner.parent_id1:many | Fully supported | |
| Opportunities | crm.lead (type = opportunity)1:1 | Fully supported | |
| Pipeline | crm.stage (per pipeline)lossy | Fully supported | |
| Tasks and Activities | crm.lead.activity (mail.activity)1:1 | Fully supported | |
| Custom Fields | ir.model.fields (custom)lossy | Mapping required | |
| Documents | ir.attachment1:1 | Mapping required | |
| Users | res.users1:1 | Mapping required | |
| Workflow Automations | ir.actions.server (written spec)lossy | Mapping required | |
| Custom Event Triggers | ir.cron (written spec)lossy | Mapping required | |
| Reports and Dashboards | ir.ui.view (written spec)lossy | Mapping required | |
| Campaigns | crm.tag or utm.sourcelossy | Mapping required |
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.
SalezShark gotchas
No publicly documented API for automated extraction
Minimum 10-user billing regardless of actual headcount
Workflow Automations are not executable at migration time
Custom Field schema varies by tier and by org configuration
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 CSV export scoping
We audit the SalezShark account across tier, active user count (against the 10-user minimum), object inventory (Leads, Contacts, Accounts, Opportunities, Pipelines, Tasks, Custom Fields, Documents), and Workflow Automation count. We confirm that all required objects are exportable via CSV from the UI and identify any that require multiple batched export sessions. We also confirm the Odoo edition and hosting approach (Community self-hosted, Odoo Online, or Odoo Enterprise on Odoo.sh) because API access and custom field handling differ slightly between Community and Enterprise. The discovery output is a written migration scope, CSV export checklist, and Odoo edition recommendation.
CSV extraction and data quality audit
We coordinate with the customer to run CSV exports from SalezShark for each object. We validate record counts against the discovery audit, check for encoding issues, identify duplicate records (particularly in Contacts and Accounts where the same entity may appear in both objects), and standardize field formats (phone number formatting, date formats, currency codes). We flag any enrichment-only fields (company email formats, employee headcount from SalezShark's built-in enrichment) that may not have reliable source values and document them for re-enrichment in Odoo using the customer's preferred enrichment provider.
Odoo schema design and stage configuration
We design the destination schema in Odoo. This includes creating custom fields on crm.lead and res.partner to capture SalezShark-specific data that does not map to a standard Odoo field, configuring crm.stage records to match SalezShark pipeline stage names and ordering, and setting up Sales Teams (crm.team) to correspond to SalezShark pipeline assignments. If the customer uses Odoo Community Edition, we create custom fields via Developer mode (Settings > Technical > Database Structure > Models). If Enterprise, we use Odoo Studio for a no-code field creation workflow. Schema is validated in a staging Odoo instance before production migration.
Staging migration and reconciliation
We run a full migration into a staging Odoo instance (a separate Odoo database or a cloned production snapshot) using production-equivalent data volume. The customer reconciles record counts (res.partner records, crm.lead records by type, activity counts), spot-checks 25-50 random records against the SalezShark source data, and reviews the pipeline stage assignments. Any field mapping corrections, stage name adjustments, or custom field type changes happen here. We do not proceed to production migration without a signed staging sign-off from the customer's administrator.
Owner and user reconciliation
We extract every distinct Owner referenced on SalezShark Opportunities, Tasks, and Leads and match by email against the Odoo destination's res.users table. Any Owner without a matching res.users record goes to a reconciliation queue for the customer's Odoo admin to provision before the final production import. Migration cannot complete with unresolved OwnerId references because Odoo's crm.lead requires a user_id (salesperson) assignment.
Production migration in dependency order
We run production migration in record-dependency order: res.partner company records (from SalezShark Accounts) first, then res.partner person records (from SalezShark Contacts with parent_id resolved to the company partner), then crm.lead records with type=lead, then crm.lead records with type=opportunity, then mail.activity records (Tasks) linked to the correct crm.lead, then ir.attachment records for Documents. Each phase emits a row-count reconciliation report before the next phase begins. CSV imports use Odoo's Data Import framework or direct SQL load via a controlled migration user with elevated write permissions.
Cutover, validation, and automation handoff
We freeze SalezShark write access during cutover and run a final delta migration of any records modified during the migration window. We validate record counts, parent-child relationships (partner hierarchy), opportunity stage assignments, and activity counts in Odoo. We deliver the Workflow Automation and Custom Event Trigger written specifications to the customer's Odoo admin. We support a one-week hypercare window for reconciliation issues raised by the sales team. We do not rebuild SalezShark automations as Odoo Automated Actions inside the migration scope; that work is documented for the admin or an Odoo partner to complete post-migration.
Platform deep dives
SalezShark
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 SalezShark 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
SalezShark: Not publicly documented.
Data volume sensitivity
SalezShark 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 SalezShark to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your SalezShark 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 SalezShark
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.