CRM migration
Field-level mapping, validation, and rollback between Saleshiker and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Saleshiker
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between Saleshiker and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Saleshiker to Odoo CRM is a shift from a WhatsApp-native point solution to an integrated ERP with a CRM module. Saleshiker organizes data around Leads, Contacts, Organizations, Deals, and Pipelines, with WhatsApp Business API integration driving outbound messaging; Odoo CRM uses a lead/opp model with stages managed in crm_case_section kanban views and stores company data as Partner records with contact-type distinctions. We map Saleshiker's Organizations to Odoo Partner records with company=True, resolve the Contact-to-Organization linkage, and preserve pipeline stage labels in a custom stage-mapping table confirmed during scoping. WhatsApp-specific data—broadcast history, chatbot configurations, and Meta template approval states—does not migrate because Odoo CRM has no WhatsApp Business API module; we document the active WhatsApp business phone numbers and template inventory so the customer can plan re-approval or an alternative channel strategy post-migration. Workflow definitions and drip sequences do not migrate; we deliver a written automation inventory for Odoo Studio rebuild.
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 Saleshiker 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.
Saleshiker
Lead
Odoo CRM
crm.lead
1:1Saleshiker's Lead records map to Odoo crm.lead (the lead model). The lead's name, email, phone, source, and owner assignment migrate directly. Lifecycle stage from Saleshiker maps to a custom picklist field lead_original_stage__c on the Odoo lead for audit. We preserve the Saleshiker created_date as write_date in Odoo via the XMLRPC write call.
Saleshiker
Contact
Odoo CRM
res.partner
1:1Saleshiker Contact records map to Odoo res.partner with partner_type set to contact. We map email, phone, mobile, function (job title), and owner (user_id) to their Odoo equivalents. The Saleshiker lifecycle stage property becomes a custom Char or selection field contact_original_lifecycle__c on the partner record. The contact-to-Organization link is resolved before migration so that the partner's parent_id (company) points to the correct Organization-Partner record.
Saleshiker
Organization
Odoo CRM
res.partner (company)
1:1Saleshiker's Organization records map to Odoo res.partner with is_company=True and partner_type=company. We map the organization name to partner name, domain to website, and address fields to the partner's street, city, state, country, and zip fields. Organization is created before any Contact import so that parent_id lookups are satisfied on Contact insert.
Saleshiker
Deal
Odoo CRM
crm.lead
1:1Saleshiker Deals map to Odoo crm.lead records where type=pipeline. The deal value (amount) migrates to expected_revenue on the Odoo lead. Expected close date maps to date_deadline. Pipeline stage maps to a stage_id reference that we resolve via the Odoo stage lookup (crm_case_stage) using the stage name as the dedupe key. Owner assignment migrates to user_id on the lead.
Saleshiker
Pipeline
Odoo CRM
crm.team + crm_case_stage
lossyEach Saleshiker pipeline becomes an Odoo crm.team (sales team) with its own kanban stages. We create crm_case_stage records matching the Saleshiker's stage names and ordering, then assign the stage sequence to the team. The customer confirms the stage mapping table during scoping before migration begins.
Saleshiker
Quote
Odoo CRM
sale.order
1:1Saleshiker Quotes migrate to Odoo sale.order records with state=draft. Quote headers (customer, validity date, payment terms) map to sale.order fields. Quote line items map to sale.order.line with product_id resolved via SKU lookup against the migrated product catalog and price_unit mapped from the quote unit price.
Saleshiker
Invoice
Odoo CRM
account.move
1:1Saleshiker Invoice records migrate to Odoo account.move with move_type=out_invoice for customer invoices. Invoice headers and line items preserve; payment reconciliation history that depends on Saleshiker's internal AR/AP state does not carry over if Odoo's accounting module is not active, in which case we map invoice status to a custom Char field invoice_payment_status__c for the customer's admin to reconcile post-migration.
Saleshiker
Product
Odoo CRM
product.product
1:1Saleshiker Products map to Odoo product.product (variant model) or product.template. We map name, default_code (SKU), list_price, and description to their Odoo equivalents. If the destination Odoo instance uses product template variants, we create the template and attach the product variant under it.
Saleshiker
Task
Odoo CRM
project.task
1:1Saleshiker's Task records migrate to Odoo project.task. Title, description, due date (date_deadline), stage, priority, and user_id (assignee) map directly. Related-to linkage migrates to custom res_id and res_model fields pointing at the target Odoo record (res.partner or crm.lead) after parent-record resolution.
Saleshiker
Event
Odoo CRM
calendar.event
1:1Saleshiker Events migrate to Odoo calendar.event with name, start (start_datetime), stop (stop_datetime), duration, and location preserved. Recurrence patterns (if stored as RRULE strings) migrate as calendar.recurrence records linked to the parent event. Assignee migrates to user_id on the event.
Saleshiker
Organization Link
Odoo CRM
res.partner.parent_id
1:1The Saleshiker Contact-to-Organization association is a critical lookup. We build a cross-reference table during data extraction: for each Contact, we capture the linked Organization ID and look up the corresponding Odoo res.partner record (is_company=True) by organization name or domain before inserting the Contact. parent_id on the contact partner record is set at import time to satisfy Odoo's partner hierarchy.
Saleshiker
Attachment
Odoo CRM
ir.attachment
1:1Saleshiker file attachments stored per record (Lead, Contact, Organization, Deal) are downloaded from Saleshiker's storage during extraction, then uploaded to Odoo via XMLRPC as ir.attachment records with res_model set to the target model (crm.lead or res.partner) and res_id set to the migrated record ID.
| Saleshiker | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | crm.lead1:1 | Fully supported | |
| Contact | res.partner1:1 | Fully supported | |
| Organization | res.partner (company)1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Pipeline | crm.team + crm_case_stagelossy | Fully supported | |
| Quote | sale.order1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Product | product.product1:1 | Fully supported | |
| Task | project.task1:1 | Fully supported | |
| Event | calendar.event1:1 | Fully supported | |
| Organization Link | res.partner.parent_id1:1 | Fully supported | |
| Attachment | ir.attachment1: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.
Saleshiker gotchas
Meta conversation billing applies on top of subscription cost
WhatsApp template approval governed by Meta policy
Workflow and automation definitions are not portable
Limited API documentation with no publicly documented rate limits
Invoice and payment data may reference internal accounting state
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 scoping
We audit the Saleshiker portal for record counts across all object types (Leads, Contacts, Organizations, Deals, Quotes, Invoices, Products, Tasks, Events), active Workflows and Drip sequences, WhatsApp business phone numbers and recent conversation volume, and any custom properties or field extensions. We pair this with an Odoo readiness check: confirming the Odoo edition (Community or Enterprise), whether the account.accounting and crm modules are activated, and whether Odoo Studio is available for custom field creation. The output is a written scope document and a stage-mapping table for customer confirmation.
Data extraction and cross-reference build
We extract all records from Saleshiker's REST API in dependency order: Organizations first (no foreign-key dependencies), then Contacts (resolving Organization ID), then Leads and Deals, then Quotes and Invoices, then Tasks and Events, then Attachments. During extraction we build a cross-reference table mapping each Saleshiker's internal ID to the extracted field values and capturing the Contact-to-Organization link. We probe API responsiveness during extraction to establish safe throughput given Saleshiker's undocumented rate limits. Attachments are downloaded to local storage with filenames keyed to the source record ID.
Odoo schema preparation
We configure the destination Odoo database before import: activating crm, sale_management, and account modules; creating crm.team records for each Saleshiker pipeline; creating crm_case_stage records matching Saleshiker's stage names; creating any custom fields (contact_original_lifecycle__c, invoice_payment_status__c, lead_original_stage__c) via Odoo Studio or direct SQL if access is available; and confirming the product.product and product.template schema. We authenticate to Odoo XMLRPC and capture the uid, db, and password for use in the import script.
Staging migration and reconciliation
We run a full migration into the Odoo production environment (or a full-copy sandbox if one exists) using representative data volume. The customer's admin reconciles record counts per object type against the Saleshiker source, spot-checks 25-50 records for field-level accuracy (particularly phone numbers, email addresses, and deal values), and validates that Organization-Contact linkage appears correctly in the Odoo partner hierarchy view. Any mapping corrections are made to the import script and the staging migration is re-run until reconciliation passes before production cutover.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (Organizations, company=True), res.partner (Contacts with parent_id resolved to Organization), crm.lead (Leads), crm.lead (Deals with stage_id resolved via stage mapping), product.product, sale.order (Quotes), account.move (Invoices), project.task (Tasks), calendar.event (Events), ir.attachment (files re-uploaded with res_model and res_id pointing to the correct Odoo record). Each phase emits a row-count and checksum reconciliation report. We use xmlrpc.client with exponential backoff and batch sizes of 50-100 records per call to stay within Odoo's XMLRPC throughput limits.
Cutover, validation, and Workflow handoff
We freeze Saleshiker writes during the cutover window and run a final delta migration of any records modified during migration. We enable Odoo as the system of record and deliver the Workflow and Drip sequence inventory document to the customer's admin team with Odoo Studio rebuild recommendations. We support a five-day hypercare window for reconciliation issues raised by the sales team. We do not rebuild Saleshiker Workflows in Odoo Studio inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Saleshiker
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Saleshiker and Odoo CRM.
Object compatibility
1 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
Saleshiker: Not publicly documented.
Data volume sensitivity
Saleshiker 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 Saleshiker to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Saleshiker 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 Saleshiker
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.