CRM migration
Field-level mapping, validation, and rollback between SalesCaptain and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
SalesCaptain
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between SalesCaptain and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
SalesCaptain uses a narrow unified model where Contacts and Companies share a simplified schema, while Odoo CRM separates the res.partner model into individual and company types and uses crm.lead for both new leads and live opportunities. We resolve the contact-company relationship during scoping by asking whether the customer prefers merged partner records or separate linked records in Odoo. Leads and converted Contacts both migrate to crm.lead with the original SalesCaptain lead status preserved in a custom field. Deal data maps to Odoo Opportunities attached to the resolved partner. Activity history (calls, emails, messages) migrates to Odoo's crm.phonecall and mail.message models. Workflows, automations, and SalesCaptain's built-in voice agent routing rules do not migrate via API; we document the active rules during discovery so the customer can rebuild them in Odoo's Automations or Studio. Custom field schemas require pre-creation in Odoo as ir.model.fields definitions before any data is loaded.
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 SalesCaptain 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.
SalesCaptain
Contact
Odoo CRM
res.partner
1:1SalesCaptain Contact records map to Odoo res.partner with type = 'contact'. Each Contact linked to a SalesCaptain Company becomes a res.partner with parent_id pointing to the corresponding company-type partner. We resolve parent_id at migration time by matching the Contact's company reference to the SalesCaptain Company records migrated in the preceding phase. The original SalesCaptain contact status and any lead-score property migrate as custom fields on the partner record so the customer retains behavioral data in Odoo.
SalesCaptain
Company
Odoo CRM
res.partner (type = 'company')
1:1SalesCaptain Company records map to Odoo res.partner with partner_type set to 'company'. The company flag is set to true on the partner so Odoo treats it as an organization rather than an individual contact. Address fields from SalesCaptain (street, city, state, postal_code, country) map to the corresponding Odoo partner address fields. If the SalesCaptain Company has no associated Contact records, it migrates as a standalone organization partner. If multiple SalesCaptain contacts reference the same Company, they become multiple child partner records under a single company-type parent.
SalesCaptain
Lead
Odoo CRM
crm.lead
1:1SalesCaptain Lead records map to Odoo crm.lead with type = 'lead'. We preserve the SalesCaptain lead status and lead source as custom fields on the Odoo lead record since Odoo uses stage and priority to drive the pipeline rather than a separate status property. The original lead creation date migrates as create_date on the crm.lead. Any lead score value from SalesCaptain maps to a custom float field on the lead for reporting purposes. If the customer used SalesCaptain's distinction between Lead and Contact to represent qualification level, we document the mapping rule during discovery.
SalesCaptain
Deal
Odoo CRM
crm.lead (type = 'opportunity')
1:1SalesCaptain Deal records map to Odoo crm.lead with type = 'opportunity'. The deal name becomes the crm.lead name field, deal amount becomes planned_revenue, and expected close date maps to date_deadline. We resolve partner_id by matching the Deal's associated Company to the migrated res.partner record. SalesCaptain deal stage maps to Odoo stage_id, which we configure during schema design as a pipeline with stages corresponding to the customer's existing deal lifecycle. The original deal creation date migrates as create_date on the opportunity.
SalesCaptain
Conversation (Call)
Odoo CRM
crm.phonecall
1:1SalesCaptain conversation records of type 'call' map to Odoo crm.phonecall. We extract call duration, disposition, and timestamp from the SalesCaptain conversation payload and write them to the corresponding crm.phonecall fields. The phonecall record is linked to the resolved partner (WhoID) and the associated opportunity (WhatID) if the conversation was related to an active deal. Call recordings stored as file URLs in SalesCaptain are preserved as notes or attachments on the crm.phonecall record since Odoo's standard phonecall model does not natively store a recording URL field.
SalesCaptain
Conversation (Email/Message)
Odoo CRM
mail.message
1:1SalesCaptain email and SMS conversation threads map to Odoo mail.message records. Each message in a thread becomes a separate mail.message with mail_message_subtype = 'comment', linked to the partner via model = 'res.partner' and res_id pointing to the migrated partner ID. Message body and timestamp migrate directly. We preserve the full conversation thread ordering by setting message_date to the original SalesCaptain timestamp. If the customer used conversation tags or labels, those migrate as mail.message tags where the Odoo instance has the mail.activity.mixin tags extension enabled.
SalesCaptain
Custom Field
Odoo CRM
ir.model.fields (custom)
lossySalesCaptain custom field schemas require pre-creation in Odoo before any data is loaded. We extract the custom field definitions from SalesCaptain during discovery, map SalesCaptain field types to Odoo field types (Char, Integer, Float, Selection, Many2one, Text), and deploy them as ir.model.fields XML records into the Odoo database before migration begins. This is a prerequisite phase that must complete successfully before any record import starts. Field labels, help text, and mandatory flags are carried over from SalesCaptain's field configuration.
SalesCaptain
Communication Channel Profile
Odoo CRM
res.partner (custom fields)
1:1SalesCaptain channel profile data (phone numbers, SMS accounts, messaging endpoint URLs) has no native equivalent in Odoo CRM as a first-class object. We extract channel profile data during extraction and store it as custom fields on the res.partner record, naming them channel_phone, channel_sms, and channel_messaging_url to preserve the customer's ability to identify which communication endpoints belong to each contact. Any routing rules attached to channel profiles do not migrate; we document them in the Workflow Inventory for the customer's admin to reconfigure in Odoo.
SalesCaptain
User / Team Member
Odoo CRM
res.users
1:1SalesCaptain owner records map to Odoo res.users by email match. We extract all distinct owner IDs referenced on Contacts, Companies, Deals, and Conversations during extraction and attempt to resolve each to an existing Odoo User. Owners without a matching Odoo User enter a reconciliation queue where the customer's Odoo admin provisions the missing User before record import resumes. Active versus inactive status on the Odoo User is set based on whether the original SalesCaptain user is active in the source platform.
SalesCaptain
Product
Odoo CRM
product.product
1:1If the customer used SalesCaptain Products or line items associated with Deals, those migrate to Odoo product.product records. Product name, SKU (if populated), and list price map to name, default_code, and lst_price respectively. We create the product.template record and link the product.product variant at migration time. If SalesCaptain Deals do not have associated product records, this mapping step is skipped.
SalesCaptain
Workflow / Automation Rule
Odoo CRM
None (no migration)
1:1SalesCaptain workflow automation rules do not export via API and cannot be migrated programmatically. We document all active workflow rules during discovery using a Workflow Inventory worksheet that captures the trigger condition, filter logic, and actions for each rule. This inventory is delivered to the customer at the end of migration so their Odoo admin or implementation partner can rebuild the automations in Odoo Studio or using server actions. Workflows are a common source of post-migration friction when teams expect them to function on day one; the inventory prevents this gap from being a surprise.
SalesCaptain
Engagement: Task
Odoo CRM
mail.activity
1:1SalesCaptain task engagements (manual to-dos, reminders, follow-up items) map to Odoo mail.activity records linked to the res.partner or crm.lead. Task title, due date, and completion status map to activity_summary, date_deadline, and automated activity_type completion respectively. Owner assignment migrates by resolving the SalesCaptain owner to the Odoo res.users record via the User mapping step. Open tasks migrate with their original creation timestamp preserved for activity date ordering.
| SalesCaptain | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (type = 'company')1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Deal | crm.lead (type = 'opportunity')1:1 | Fully supported | |
| Conversation (Call) | crm.phonecall1:1 | Fully supported | |
| Conversation (Email/Message) | mail.message1:1 | Fully supported | |
| Custom Field | ir.model.fields (custom)lossy | Fully supported | |
| Communication Channel Profile | res.partner (custom fields)1:1 | Fully supported | |
| User / Team Member | res.users1:1 | Fully supported | |
| Product | product.product1:1 | Fully supported | |
| Workflow / Automation Rule | None (no migration)1:1 | Fully supported | |
| Engagement: Task | mail.activity1: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.
SalesCaptain gotchas
No public bulk export API for high-volume migrations
Workflow automation rules do not export via API
Bearer token rotation requires re-authentication during migration
Limited custom field type support on import
No public API rate limit documentation
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 Odoo module selection
We audit the SalesCaptain account for record counts across Contacts, Companies, Leads, Deals, Conversations, and Custom Fields. We identify active workflow rules and channel profiles requiring documentation. We assess the customer's target Odoo edition (Community self-hosted, Odoo.sh, or Odoo Online) and identify which Odoo modules are in scope for migration. The discovery output is a written migration scope document that includes the contact-company merge rule decision, a list of custom fields to create in Odoo, and the Odoo module recommendation based on the customer's operational footprint.
Schema pre-creation in Odoo
Before any data is extracted from SalesCaptain, we create all custom field definitions in the Odoo destination database. For each SalesCaptain custom field, we create the corresponding ir.model.fields record with the appropriate field type, label, and help text. We configure the CRM pipeline stages to match the customer's SalesCaptain deal stages. We create any required Odoo Sales Teams and assign them to the relevant pipeline. This step requires an Odoo test or staging environment that mirrors the production configuration so that schema changes can be validated before going live.
Test migration and reconciliation
We run a full migration into an Odoo test database using the customer's SalesCaptain data. The customer's team reconciles record counts (partners in, leads in, opportunities in, activity records in) and spot-checks 25-50 records against the SalesCaptain source for field-level accuracy. We validate that custom field values populated correctly and that partner lookups resolved as expected. Any mapping corrections are made at this stage. The customer signs off on the test migration before production migration is scheduled.
Owner and user reconciliation
We extract every distinct SalesCaptain owner ID referenced on Contacts, Companies, Deals, and activity records and match them by email against the Odoo destination's res.users table. Any owner without a matching Odoo User is added to a reconciliation queue. The customer's Odoo admin provisions the missing Users (active or inactive depending on the original SalesCaptain user's status) before the production migration begins. This step must complete before record import starts because OwnerID references are required on most Odoo CRM records.
Production migration in dependency order
We run production migration in the order that respects Odoo's foreign-key constraints: organization-type res.partner records (from SalesCaptain Companies) load first so that parent_id references are satisfied; individual-type res.partner records (from SalesCaptain Contacts) load second with parent_id resolved to the company partner; crm.lead records (Leads and Opportunities from SalesCaptain) load third with partner_id resolved to the corresponding partner; activity records (calls, emails, tasks) load fourth via Odoo XML-RPC or direct SQL import with WhoID and WhatID resolved to the migrated record IDs. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and workflow handoff
We freeze SalesCaptain writes during a defined cutover window and run a final delta migration of any records modified during the migration run. We then enable Odoo as the system of record. We deliver the Workflow Inventory document to the customer's admin team for manual rebuild in Odoo Studio. We conduct a one-week hypercare window to resolve any record discrepancies raised by the sales team. We do not rebuild SalesCaptain workflows as Odoo automations inside the migration scope; that is a separate engagement or an internal admin task. Reports and dashboards are not migrated as code; we provide a list of the key Odoo reporting views to configure based on the migrated data.
Platform deep dives
SalesCaptain
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 SalesCaptain 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
SalesCaptain: Not publicly documented.
Data volume sensitivity
SalesCaptain 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 SalesCaptain to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your SalesCaptain 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 SalesCaptain
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.