CRM migration

Migrate from SalezShark to Odoo CRM

Field-level mapping, validation, and rollback between SalezShark and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

SalezShark logo

SalezShark

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

50%

7 of 14

objects map 1:1 between SalezShark and Odoo CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

SalezShark logo

SalezShark

What's pushing teams away

  • SalezShark users report that contact and lead data quality degrades without constant enrichment, leading to bounced emails and poor deliverability that undermines outbound campaigns.
  • The minimum 10-user license requirement for monthly billing catches smaller teams unexpectedly — they pay for 10 licenses even when only 3-4 team members use the system.
  • The platform lacks a publicly documented API, making it impossible to automate data extraction or build integrations without manual CSV exports, which limits migration flexibility and ongoing data sync options.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How SalezShark objects map to Odoo CRM

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

maps to

Odoo CRM

crm.lead (type = lead)

1:1
Mapping required

SalezShark 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

maps to

Odoo CRM

res.partner

1:1
Fully supported

SalezShark 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

maps to

Odoo CRM

res.partner (company_type = company)

1:1
Fully supported

SalezShark 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

maps to

Odoo CRM

res.partner.parent_id

1:many
Fully supported

SalezShark 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

maps to

Odoo CRM

crm.lead (type = opportunity)

1:1
Fully supported

SalezShark 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

maps to

Odoo CRM

crm.stage (per pipeline)

lossy
Fully supported

SalezShark 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

maps to

Odoo CRM

crm.lead.activity (mail.activity)

1:1
Fully supported

SalezShark 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

maps to

Odoo CRM

ir.model.fields (custom)

lossy
Mapping required

SalezShark 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

maps to

Odoo CRM

ir.attachment

1:1
Mapping required

SalezShark 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

maps to

Odoo CRM

res.users

1:1
Mapping required

SalezShark 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

maps to

Odoo CRM

ir.actions.server (written spec)

lossy
Mapping required

SalezShark 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

maps to

Odoo CRM

ir.cron (written spec)

lossy
Mapping required

SalezShark 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

maps to

Odoo CRM

ir.ui.view (written spec)

lossy
Mapping required

SalezShark 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

maps to

Odoo CRM

crm.tag or utm.source

lossy
Mapping required

SalezShark 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.

Gotchas + challenges

What specifically takes care here

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 logo

SalezShark gotchas

High

No publicly documented API for automated extraction

Medium

Minimum 10-user billing regardless of actual headcount

Medium

Workflow Automations are not executable at migration time

Medium

Custom Field schema varies by tier and by org configuration

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • SalezShark has no API — all extraction is CSV from the UI

    SalezShark does not publish API documentation. All data extraction for this migration relies on CSV exports from the SalezShark UI, which constrains what we can extract automatically. Large orgs may need multiple export sessions filtered by record owner or date range. We work directly with the customer's export credentials during scoping and confirm that all required objects (Contacts, Leads, Accounts, Opportunities, Tasks, Custom Fields) are available in the export before migration begins. This is not an Odoo-specific issue — it is a SalezShark platform limitation that affects every migration away from the platform.

  • Odoo merges Leads and Opportunities into a single crm.lead model

    Odoo CRM does not have a separate Lead object and Opportunity object. Both concepts live in crm.lead, with the type field distinguishing between lead (unqualified prospect) and opportunity (qualified deal). SalezShark users accustomed to separate Lead and Opportunity records must understand that Odoo's Lead-to-Opportunity conversion action is a type change within the same record, not a record-to-record conversion. We map SalezShark Leads to crm.lead with type=lead and SalezShark Opportunities to crm.lead with type=opportunity, preserving the original SalezShark record type in a custom field for audit.

  • SalezShark Workflow Automations do not execute in Odoo

    SalezShark Workflow Automations (gated to Professional tier at $39/user/month) store trigger-and-action sequences in a proprietary format that has no direct Odoo equivalent. Odoo's Automated Actions use ir.actions.server and ir.cron, which have different trigger semantics and action types. We export the automation configuration as a written specification document — trigger conditions, filter logic, and downstream actions — and deliver it alongside the migrated records. We do not silently drop these; they are documented and handed off. The customer or an Odoo partner rebuilds them post-migration.

  • Odoo's res.partner replaces SalezShark's separate Accounts and Contacts

    SalezShark maintains separate Account and Contact objects. Odoo uses res.partner for both company records (company_type = company) and person contacts (company_type = person), with a parent-child hierarchy for contacts at a company. The migration requires splitting SalezShark Accounts into res.partner company records and mapping SalezShark Contacts to res.partner person records with parent_id pointing to the company partner. If SalezShark Contacts do not have an associated Account, they import as standalone person partners. We handle this split explicitly during the transform phase and validate that the parent-child hierarchy is correct before production import.

Migration approach

Six steps for a successful SalezShark to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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

Context on both ends of the pair

SalezShark logo

SalezShark

Source

Strengths

  • Lowest entry price among SMB CRMs at $8/user/month with full feature tiers.
  • Native lead enrichment and company database included at no extra cost.
  • Custom fields, custom layouts, and field-level security available on Basic tier and above.
  • Multi-currency support and conversion scoring included without enterprise gating.
  • Separate database per customer for data isolation and logical security boundaries.

Weaknesses

  • No publicly documented API — all data movement relies on manual CSV exports and imports, which is a hard blocker for automated migrations.
  • Contact data quality depends heavily on the platform's own enrichment engine; exported data may not retain verified status if the destination lacks equivalent enrichment.
  • Minimum 10-user license requirement inflates cost for teams below that threshold, and additional users are billed at a flat $120/user add-on rather than prorated.
  • Workflow Automations and Custom Event Triggers are gated to Professional tier, meaning mid-market teams must pay $39/user/month to access automation capabilities.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across SalezShark and Odoo CRM.

  • Object compatibility

    B

    2 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    SalezShark: Not publicly documented.

  • Data volume sensitivity

    B

    SalezShark doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your SalezShark to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about SalezShark to Odoo CRM data migrations

Answers to the questions buyers ask most during SalezShark to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for accounts under 15,000 Contacts, 3,000 Accounts, and 2,000 Opportunities with no complex custom field schema. Migrations with multiple SalezShark pipelines, large task histories (over 200,000 records), extensive custom field definitions, or workflows requiring written specification documents move to six to ten weeks because of CSV batch planning, staging reconciliation cycles, and the Odoo schema design phase.

Adjacent paths

Related migrations to explore

Ready when you are

Move from SalezShark.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day