CRM migration
Field-level mapping, validation, and rollback between SalesPro CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
SalesPro CRM
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between SalesPro CRM and Odoo CRM.
Complexity
BStandard
Timeline
5-7 weeks
Overview
Migrating from SalesPro CRM to Odoo CRM is a structural shift from a purpose-built hospitality CRM to a modular ERP platform. SalesPro organizes data around Contacts, Companies, Events, and BEO (Banquet Event Order) records generated from its event workflow, with BEOs depending on Event linkage at the record level. Odoo CRM has no native BEO object, so we reconstruct BEO data as a custom Odoo record and preserve the event relationship via a reference field. The most significant migration constraint is SalesPro's webhook-only API, which fires only on calendar view opens and provides no bulk export endpoint. We resolve this by issuing a formal data export request to SalesPro on the customer's behalf before migration begins. Workflows, automations, and the BEO auto-generation logic do not migrate; we deliver a written inventory of these for the customer's Odoo admin to rebuild as Odoo Server Actions or Studio automations.
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 SalesPro CRM 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.
SalesPro CRM
Contact
Odoo CRM
Contact
1:1SalesPro Contact records map directly to Odoo crm.lead (in Lead/Opportunity mode) or res.partner depending on Odoo CRM configuration. We preserve the contact's name, email, phone, company association, and address fields. SalesPro permission-based sharing settings have no direct Odoo equivalent; we recommend Odoo's Record Rules configuration in the Access Control menu post-migration.
SalesPro CRM
Company
Odoo CRM
Company / Partner with company type
1:1SalesPro Company records map to Odoo res.partner with is_company = True. The SalesPro company-contact foreign key relationship maps to Odoo's child_ids on the parent Company partner record. Company Website and Industry fields from SalesPro map to Odoo's website and industry_id (industry_id requires a pre-loaded industry list that we configure during schema setup).
SalesPro CRM
Event
Odoo CRM
Calendar.Event or crm.lead (Opportunity)
1:1SalesPro Events with date ranges, group details, and BEO references map to Odoo calendar.event (for scheduling and resource tracking) and optionally to crm.lead records if the customer wants to track the event commercial outcome as a sales Opportunity. We capture event start/end dates, attendee lists, location, and description. The BEO reference is preserved separately as a lookup field.
SalesPro CRM
BEO (Banquet Event Order)
Odoo CRM
Custom BEO Model (ir.model, ir.model.fields)
lossyBEO records are derived outputs from SalesPro Events and contain cost calculations, timeline details, and event specifications. Odoo has no native BEO object, so we create a custom Odoo model (x_beo_event_order) via the Settings > Technical > Models menu or via XML data migration, with fields for event_id (Many2one to calendar.event), cost_breakdown (HTML or Text), timeline_specs (Text), and signing_status (Selection). The event-to-BEO linkage is preserved as an explicit relational field rather than a derived computation.
SalesPro CRM
Task
Odoo CRM
Note or project.task
1:1SalesPro Task records with assignees, due dates, email reminders, and completion status map to Odoo note.note (for standalone tasks) or project.task (if Odoo Project is installed). We preserve assignee assignment via email-to-user lookup and set the task deadline to the original SalesPro due date. Reminder flags from SalesPro require Odoo mail.activity configuration post-migration.
SalesPro CRM
Milestone
Odoo CRM
crm.stage or project.milestone
1:1SalesPro custom Milestones tied to the pipeline or individual deals map to Odoo crm.stage (if using CRM pipeline) or project.milestone (if using Project). We preserve milestone names, relative ordering, and the deal or project association. SalesPro's goal-based milestone definitions require translation into Odoo's stage logic, which we document as a configuration step.
SalesPro CRM
Pipeline Stage
Odoo CRM
crm.stage + crm.team
lossySalesPro pipeline and stage configuration maps to Odoo crm.stage records within a crm.team (Sales Team). Stage names and their relative ordering migrate from SalesPro to Odoo in sequence. SalesPro's tier-dependent pipeline count (which is tier-limited in SalesPro) has no equivalent constraint in Odoo; Odoo supports unlimited pipelines per team. Custom stage names require field mapping documentation.
SalesPro CRM
User / Team Member
Odoo CRM
res.users
1:1SalesPro users assigned to contacts, tasks, and events map to Odoo res.users by email address match. Owner reassignment during migration requires explicit user provisioning in Odoo before record import. Permission-based sharing flags from SalesPro map to Odoo Record Rules and Access Control Lists per object, which we configure as part of the schema setup. Inactive SalesPro users map to Odoo inactive users if historical assignment must be preserved.
SalesPro CRM
Calendar / Appointment
Odoo CRM
calendar.event
1:1SalesPro calendar entries map to Odoo calendar.event with start datetime, end datetime, and resource assignments preserved. SalesPro's resource booking fields map to Odoo's calendar.resource. We note that the SalesPro webhook-only API fires on calendar view opens, which means we cannot programmatically extract calendar data in real-time; the full calendar export relies on the formal vendor data request issued during the discovery phase.
SalesPro CRM
People Tracker Activity
Odoo CRM
mail.message or crm.activity
1:1SalesPro's live People Tracker dashboard generates time-stamped activity records that track task completion and deal milestone progress. These do not map to a standard Odoo object. We map People Tracker entries to Odoo mail.message records on the related crm.lead or project.task, preserving the timestamp, actor (user), and activity description as a message body. This preserves the live-activity visibility without replicating the dashboard itself.
SalesPro CRM
Attachment
Odoo CRM
ir.attachment
1:1SalesPro does not expose a bulk attachment export endpoint via its webhook API. Attachments associated with Events or BEOs require manual extraction from SalesPro or a direct vendor request. We notify the customer during scoping that attachments must be manually exported from SalesPro and provided as a file package, which we then import into Odoo ir.attachment records linked to the corresponding calendar.event or custom BEO record. Files without a matching parent record are stored in a temporary ir.attachment container for manual association.
SalesPro CRM
Signature / Spouse Signing Field
Odoo CRM
Custom signing fields on BEO or Event
lossySalesPro's event signing workflow includes a known bug that sometimes inserts spurious spouse signing fields even when no spouse data exists. We strip null-value spouse fields during the transformation step and map the remaining valid signing data (signer name, date, signature status) to custom fields on the Odoo BEO record (x_signing_party, x_signing_date, x_signing_status). Customers using the signing workflow receive a signed-field configuration guide for Odoo Studio.
| SalesPro CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Company | Company / Partner with company type1:1 | Fully supported | |
| Event | Calendar.Event or crm.lead (Opportunity)1:1 | Fully supported | |
| BEO (Banquet Event Order) | Custom BEO Model (ir.model, ir.model.fields)lossy | Fully supported | |
| Task | Note or project.task1:1 | Fully supported | |
| Milestone | crm.stage or project.milestone1:1 | Fully supported | |
| Pipeline Stage | crm.stage + crm.teamlossy | Fully supported | |
| User / Team Member | res.users1:1 | Fully supported | |
| Calendar / Appointment | calendar.event1:1 | Fully supported | |
| People Tracker Activity | mail.message or crm.activity1:1 | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Signature / Spouse Signing Field | Custom signing fields on BEO or Eventlossy | 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.
SalesPro CRM gotchas
Webhook-only API limits bulk export capability
BEO records depend on Event linkage
Signature field displays spouse field incorrectly
Flat-rate tier caps user count
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 source SalesPro account across tier (1-user, 2-user, or 5-user flat-rate), active record counts (Contacts, Companies, Events, BEOs, Tasks, Milestones), user count including any overages, and the presence of BEO-generated events with cost calculations. We also identify all attachment usage. On the destination side, we confirm the Odoo edition (Community or Enterprise), installed apps (CRM, Project, Calendar), and whether the customer has access to Odoo Studio or requires developer support for custom model creation. We immediately issue the formal data export request to SalesPro on the customer's behalf because this step introduces a 3-5 business day vendor dependency that affects the timeline.
Schema design and custom BEO model creation
We design the destination Odoo schema before any data import. This includes confirming the CRM pipeline stages in Odoo (crm.stage), creating the custom BEO model (x_beo_event_order) with fields for event_id, cost_breakdown, timeline_specs, and signing fields, and configuring the calendar.event model for event records. We create Odoo Studio fields or use Settings > Technical > Models for custom fields. We map SalesPro pipeline stages to Odoo crm.stage with preserved ordering. We set up Record Rules for access control if the customer's SalesPro permissions model requires granular sharing. All schema work is validated in an Odoo staging environment before production.
Data extraction, transformation, and staging import
Upon receiving the SalesPro data export (CSV or structured export from the vendor), we transform records to match Odoo's schema. Contacts and Companies map to res.partner. Events map to calendar.event. BEO records are reconstructed as x_beo_event_order entries with a Many2one link to the corresponding calendar.event. Tasks and Milestones map to note.note or project.task and crm.stage respectively. We strip spurious spouse signing fields during transformation. We run a first-pass staging import into the customer's Odoo staging environment and generate a reconciliation report showing record counts per object, any records rejected due to required-field violations, and sample record spot-checks for the customer to verify.
Owner and user reconciliation
We extract every distinct SalesPro user assigned as an owner to Contacts, Events, Tasks, and BEO records and match by email against Odoo's res.users table. Users without a matching Odoo account go to a reconciliation queue. The customer's Odoo admin provisions any missing users (active or inactive depending on whether the original SalesPro user is still a team member). Owner reassignment is completed before record import to ensure all OwnerId references resolve correctly during the production migration. This step also captures any SalesPro users who are not in Odoo so that access can be provisioned post-migration if needed.
Production migration in dependency order
We execute the production migration in record-dependency order: res.partner (Companies first, then Contacts as children), calendar.event (Events), x_beo_event_order (BEOs with event_id Many2one resolved), note.note or project.task (Tasks), crm.stage (Milestone stages), and mail.message (People Tracker activity entries). Each phase emits a row-count reconciliation report before the next phase begins. Attachments are imported last, after parent records are confirmed, via Odoo's ir.attachment model. We freeze writes to SalesPro during the production cutover window and run a final delta migration of any records modified during the window.
Cutover, validation, and workflow rebuild handoff
We validate critical records post-cutover against the pre-migration reconciliation baseline. We deliver a written inventory document covering all SalesPro Workflow equivalents (BEO auto-generation logic, milestone triggers, event reminder rules) with Odoo Studio or Server Action configuration recommendations. We do not rebuild SalesPro automations as Odoo automations inside the migration scope. We support a one-week hypercare window for reconciliation issues raised by the customer's team during the first week of live use. We document the custom BEO model's field reference for the customer's admin to finalize the signing workflow configuration in Odoo Studio.
Platform deep dives
SalesPro CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between SalesPro CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across SalesPro CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between SalesPro CRM and Odoo CRM.
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
SalesPro CRM: Not publicly documented.
Data volume sensitivity
SalesPro CRM 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 SalesPro CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your SalesPro CRM 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 SalesPro CRM
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.