CRM migration
Field-level mapping, validation, and rollback between Spin CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Spin CRM
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Spin CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Spin CRM to Odoo CRM is a structural migration driven by Spin CRM's absence of a documented REST API and its narrow ecosystem. Spin CRM exposes data only through per-object CSV exports from its settings menu, meaning we extract Companies first (to establish relationship anchors), then Contacts, Deals, and Activities in sequence, with a recommended 24-48 hour freeze window to prevent export drift. Odoo CRM uses the crm.lead model where Leads qualify into Opportunities; we map Spin CRM's deal stages directly to Odoo stage names and configure the sales team structure before import. Spin CRM custom fields may require re-export with explicit column selection, and we flag any missing columns before the import finalizes. Odoo's automated actions and server actions do not receive migrated workflow logic; we deliver a written inventory of any Spin CRM task reminders and calendar events requiring manual rebuild in Odoo's automation framework.
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 Spin 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.
Spin CRM
Company
Odoo CRM
res.partner (company type)
1:1Spin CRM Companies map to Odoo res.partner records with partner_type set to 'company'. The company name maps to name, address fields map to street, city, state, country, and any industry custom field maps to a custom res.partner field. We export Companies first to establish the relationship anchor used by Contacts during the second export pass. Odoo's res.partner record serves as both company and person depending on the is_company flag, which we set to True for all migrated Companies.
Spin CRM
Contact
Odoo CRM
res.partner (individual type)
1:1Spin CRM Contacts map to Odoo res.partner with partner_type set to 'person' and parent_id pointing to the corresponding Company res.partner via name-based lookup after the Company pass. Email, phone, job title, and any custom contact fields migrate directly. The contact-to-company link is preserved by resolving the Spin CRM company association to the Odoo res.partner parent record.
Spin CRM
Lead
Odoo CRM
crm.lead
1:1Spin CRM Leads map to Odoo crm.lead records directly. Standard lead fields (name, email, phone, company_name, description) migrate as crm.lead name, email_from, phone, partner_name, and description. The Spin CRM lead status maps to Odoo's crm.lead stage_id (New, Qualified, Proposal, Negotiation, Won, Lost). Any Spin CRM custom fields on Leads map to custom fields on crm.lead.
Spin CRM
Deal
Odoo CRM
crm.opportunity
1:1Spin CRM Deals map to Odoo crm.lead records with type='opportunity' after the Lead pass. Deal name becomes crm.lead name, deal value becomes planned_revenue, owner becomes user_id via email match, expected close date becomes date_deadline, and the Spin CRM pipeline stage becomes crm.lead stage_id. Spin CRM's custom deal fields migrate to custom fields on crm.lead.
Spin CRM
Pipeline Stages
Odoo CRM
crm.stage
lossySpin CRM's fully customizable pipeline stages are extracted during scoping as a named list with stage order and probability values. Each stage becomes a crm.stage record within the Odoo sales team's pipeline. Stage names are preserved verbatim. Probability values map to Odoo stage probability percentages. If Spin CRM uses multiple pipelines, each becomes a separate Odoo sales team with its own stage sequence.
Spin CRM
Activities (Tasks and Reminders)
Odoo CRM
mail.activity
1:1Spin CRM task management and calendar/reminder records map to Odoo mail.activity. Activity type, subject, due date, and assigned owner migrate. Odoo's mail.activity model includes an activity_type_id that maps from Spin CRM's task category. Owner resolution uses email match against Odoo res.users. We attempt this mapping based on the CSV column headers available in the exported file.
Spin CRM
Activities (Notes and Meetings)
Odoo CRM
calendar.event and mail.message
1:1Spin CRM notes and meeting records map to Odoo mail.message (body content linked to crm.lead) for notes and calendar.event for meetings. Meeting records carry start, end, location, and attendee data. Spin CRM notes without a date/time component become mail.message records with a note subtype. The parent crm.lead is resolved via the Spin CRM record ID cross-referenced during the Deal/Lead import pass.
Spin CRM
Owner
Odoo CRM
res.users
1:1Spin CRM owner assignments (on Leads, Contacts, Deals, Activities) map to Odoo res.users records via email address matching. We extract the distinct owner list from all exported objects before migration and match against the Odoo destination's user list. Any Spin CRM owner without a corresponding Odoo user is placed in a reconciliation queue; the customer provisions the missing users before the production migration begins.
Spin CRM
Custom Fields (Leads, Contacts, Deals)
Odoo CRM
Custom ir.model.fields
lossySpin CRM custom fields on Leads, Contacts, and Deals require pre-creation in Odoo before import. We identify custom field names and types from the Spin CRM export column headers during scoping, create matching Odoo custom fields (via Settings > Technical > Custom Fields for Enterprise or direct database/model work for Community), then reference them during import. Custom field types (text, date, integer, selection, boolean) are type-matched to Odoo field definitions. If Spin CRM exports omit a custom column, we flag and request a re-export with all columns selected before proceeding.
Spin CRM
Documents and Attachments
Odoo CRM
None
1:1Spin CRM document storage is not migratable through any documented export mechanism. We do not attempt to migrate document blobs from Spin CRM. We flag document existence and suggest the customer download critical files manually before the freeze window. In Odoo, documents attach via ir.attachment linked to the migrated crm.lead or res.partner record. This step is outside standard migration scope and requires customer-side action.
Spin CRM
Sales Forecasting
Odoo CRM
crm.lead (planned_revenue and probability)
lossySpin CRM forecast data is derived from deal values and stage probabilities. We extract deal values from the Deal export pass and apply the mapped stage probability percentages from the Odoo stage configuration to produce forecast projections. The Odoo Forecast reporting view recalculates these automatically from migrated crm.lead records, so no separate forecast object migration is required.
Spin CRM
Products (if managed in Spin CRM)
Odoo CRM
product.product
1:1If Spin CRM manages a product catalog visible in the Deal export (line items, SKUs, prices), those records map to Odoo product.product. Product name, SKU (product.default_code), and list_price migrate directly. Price list and vendor associations in Spin CRM become Odoo seller_ids on product.product.
| Spin CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Company | res.partner (company type)1:1 | Fully supported | |
| Contact | res.partner (individual type)1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Deal | crm.opportunity1:1 | Fully supported | |
| Pipeline Stages | crm.stagelossy | Fully supported | |
| Activities (Tasks and Reminders) | mail.activity1:1 | Fully supported | |
| Activities (Notes and Meetings) | calendar.event and mail.message1:1 | Fully supported | |
| Owner | res.users1:1 | Fully supported | |
| Custom Fields (Leads, Contacts, Deals) | Custom ir.model.fieldslossy | Fully supported | |
| Documents and Attachments | None1:1 | Fully supported | |
| Sales Forecasting | crm.lead (planned_revenue and probability)lossy | Mapping required | |
| Products (if managed in Spin CRM) | product.product1: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.
Spin CRM gotchas
No documented public REST API
CSV export is object-by-object, not bulk
Custom field visibility at export time
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 Spin CRM export audit
We review the Spin CRM export capabilities available in the customer's account. We access each object type (Leads, Contacts, Companies, Deals, Activities) via the settings-menu export function and capture the column headers for each export. We extract the full pipeline stage configuration including stage names, order, and probability values. We identify all custom fields by requesting the customer confirm which columns appear in each export and request a re-export if any custom fields are absent. We confirm the data freeze window with the customer and schedule the sequential exports in dependency order starting with Companies.
Odoo schema and stage configuration
We create the Odoo destination schema before any import. This includes creating any custom fields on crm.lead and res.partner to match Spin CRM custom field names and types, configuring crm.stage records matching the Spin CRM pipeline stage names in the correct order, setting stage probability values, creating sales teams if Spin CRM uses multiple pipelines, and configuring res.partner address fields to match the Spin CRM contact and company field set. All schema work occurs in an Odoo staging environment before production.
CSV normalization and data cleansing
We normalize the exported CSV files before Odoo import. This includes standardizing date formats to ISO 8601, phone number formatting, email case normalization, and duplicate detection across Contacts and Companies. We cross-reference the Contact export against the Company export to confirm the company association field is populated in each record. We flag any records with missing required fields (name, email) and present a cleansing report to the customer for resolution before the import run.
Owner reconciliation and user provisioning
We extract every distinct owner email from Spin CRM Leads, Contacts, Deals, and Activities. We match against the Odoo destination's res.users table by email. Owners without a matching Odoo user enter a reconciliation queue. The customer provisions missing Odoo users and activates them (or marks them inactive for archived owners) before the production migration begins. Owner resolution is required because OwnerId is a required reference on crm.lead and a recommended one on res.partner.
Staged import in dependency order
We run production import in Odoo in record-dependency order. Companies first (res.partner records with is_company=True). Contacts second (res.partner with is_company=False and parent_id resolved to the Company record). Leads third (crm.lead records with type='lead', user_id and team_id resolved). Deals fourth (crm.lead records with type='opportunity', stage_id resolved from the Odoo stage configuration, and planned_revenue set). Activities last (mail.activity and calendar.event records linked to the migrated crm.lead by external ID cross-reference). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation rebuild handoff
We freeze Spin CRM write access during cutover and run a final delta migration of any records created or modified during the migration window. We validate record counts, spot-check 20-30 records against the source export, and confirm that Odoo's pipeline Kanban view reflects the correct stage distribution. We deliver the automation inventory document covering any Spin CRM reminder patterns and task triggers that require rebuilding in Odoo's automated action framework. We support a one-week hypercare window where we resolve import discrepancies. Odoo automated actions, server actions, and workflow rules are not migrated as code; that is a separate rebuild task for the customer's Odoo admin or partner.
Platform deep dives
Spin CRM
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 Spin CRM 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
Spin CRM: Not publicly documented — confirmed during scoping..
Data volume sensitivity
Spin 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 Spin CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Spin 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 Spin 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.