CRM migration
Field-level mapping, validation, and rollback between Spark CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Spark CRM
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Spark CRM and Odoo CRM.
Complexity
BStandard
Timeline
3–5 business days
Overview
Spark CRM stores contacts, companies, and deals as separate objects with an owner field and activity log. Odoo CRM combines leads and opportunities into a single crm.lead model, uses res.partner for both contacts and companies, and stages are scoped per sales team. The migration maps Spark contacts to res.partner, deals and leads to crm.lead with stage-based routing, and custom fields to Odoo's x_ prefixed custom fields. Pipeline stages map value-by-value to Odoo's crm.stage per team. Activity history (calls, emails, meetings, notes) transfers to Odoo's mail.message model with original timestamps and owner links. Owner records create res.users stubs with original IDs preserved in x_spark_user_id for reconciliation. Spark workflows and automations have no Odoo equivalent and must be rebuilt using Odoo's Automated Actions and Server Actions after migration. We sequence the migration using Odoo's XML-RPC API with batched upserts to maintain relational integrity across the crm.lead and res.partner models. During migration, Odoo's XML-RPC API is invoked in deterministic batch sizes to stay within API rate limits. Each batch upserts records with a unique external ID derived from Spark's record identifier, enabling idempotent re-runs. Custom fields are provisioned beforehand via Settings > Technical > Custom Fields, ensuring that x_ prefixed columns exist before data load. Historical create dates are stored in a dedicated custom datetime field to keep reporting continuity.
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 Spark 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.
Spark CRM
Contact
Odoo CRM
res.partner
1:1Spark contacts map to Odoo res.partner records of type 'contact'. The email field serves as the unique key for upsert operations. Spark contact owner_id is stored as x_spark_owner_id and matched to res.users by email after the user load step completes.
Spark CRM
Company
Odoo CRM
res.partner
1:1Spark companies map to Odoo res.partner records of type 'company'. Company contacts in Spark (contacts with a company association) are linked via the contact's partner_id Many2one pointing to the company res.partner. Multi-company contact patterns collapse to the primary company link with additional companies surfaced via partner relations.
Spark CRM
Deal
Odoo CRM
crm.lead
1:1Spark deals map to Odoo crm.lead records where type='opportunity'. The deal's pipeline determines the target crm.team, and the deal stage maps to a crm.stage within that team. Deal amount, close date, and probability transfer as is. Owner maps via x_spark_owner_id.
Spark CRM
Lead
Odoo CRM
crm.lead
1:1Spark leads map to Odoo crm.lead records where type='lead'. Lead status in Spark maps to Odoo's crm.lead stage sequence. Leads without a deal value or close date remain as leads in Odoo until manually converted to opportunity by a sales rep.
Spark CRM
Pipeline
Odoo CRM
crm.team + crm.stage
1:1Spark pipelines map to Odoo crm.team records. Each Spark pipeline becomes one crm.team. Stages within the pipeline map to crm.stage records scoped to that team. Stage order and probability percentages transfer value-by-value to maintain forecast accuracy. If a pipeline contains custom stage properties such as temperature or rating, those are preserved as custom fields on the corresponding crm.stage record for reporting continuity.
Spark CRM
Pipeline Stage
Odoo CRM
crm.stage
1:1Spark pipeline stages map to Odoo crm.stage records by pipeline. Stage names map value-by-value, preserving sequence order and probability weights. Stage-entered timestamps in Spark are stored as custom datetime fields on crm.lead for historical stage-transition reporting in Odoo. If a stage includes specific action items or checklists, those details are captured in a custom char field linked to the stage record for future reference.
Spark CRM
Custom Field
Odoo CRM
Custom Field (x_ prefix)
1:1Spark custom fields on any object require Odoo custom fields created via Settings > Technical > Custom Fields. All custom fields use the x_ field name prefix in Odoo. Field type mapping: text to char, number to float or integer, pick-list to selection, date to date, and multi-select to char with comma separation or relational record.
Spark CRM
Activity (Call, Email, Meeting, Note)
Odoo CRM
mail.message / mail.activity
1:1Spark activity history maps to Odoo mail.message records linked to crm.lead via res_model='crm.lead' and res_id pointing to the lead ID. Activity type (call, email, meeting) sets mail.message.message_type and mail.activity.activity_type_id. Original timestamps and author IDs preserved. Scheduled follow-up tasks create mail.activity records.
Spark CRM
Owner
Odoo CRM
res.users + x_spark_owner_id
1:1Spark owner records map to Odoo res.users. Owners are loaded first in the migration sequence so user IDs are available for foreign-key assignment. Unmatched owners (no Odoo user with matching email) are flagged and assigned to a fallback user specified by the customer before the full migration runs.
Spark CRM
Attachment / File
Odoo CRM
ir.attachment
1:1Spark file attachments on contacts, companies, and deals are downloaded and re-uploaded to Odoo ir.attachment records. Each attachment is linked to the target crm.lead or res.partner via res_model and res_id. Odoo's file storage path preserves the original filename and content type. Inline images in notes are extracted and stored as separate attachments.
Spark CRM
Workflow / Automation
Odoo CRM
Not migratable
1:1Spark CRM workflows, action rules, and field-change triggers have no Odoo equivalent. They do not transfer. FlitStack AI exports workflow definitions as a text reference document so your Odoo administrator can rebuild equivalent logic using Odoo's Automated Actions, Server Actions, or base.automation modules.
Spark CRM
Tag / Label
Odoo CRM
crm.tag
1:1Spark tags on leads and deals map to Odoo crm.tag records linked to crm.lead via the many2many tag_ids field. Tags with the same name are deduplicated during migration so duplicate tags do not proliferate in Odoo. If a tag includes a color or description attribute, we store those as separate custom char fields on the crm.tag record for UI display and filtering.
| Spark CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Pipeline | crm.team + crm.stage1:1 | Fully supported | |
| Pipeline Stage | crm.stage1:1 | Fully supported | |
| Custom Field | Custom Field (x_ prefix)1:1 | Fully supported | |
| Activity (Call, Email, Meeting, Note) | mail.message / mail.activity1:1 | Fully supported | |
| Owner | res.users + x_spark_owner_id1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| Workflow / Automation | Not migratable1:1 | Fully supported | |
| Tag / Label | crm.tag1: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.
Spark CRM gotchas
Multiple unrelated 'Spark CRM' products exist
Platform fee on top of monthly subscription affects long-term TCO
Payment-orchestration data is tightly coupled to Spark's runtime
Limited public review footprint for due diligence
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
Audit Spark data and design Odoo schema
FlitStack AI inventories all Spark CRM objects — contacts, companies, leads, deals, activities, custom fields, and owner records. We compare the Spark schema against Odoo's data model and identify custom field requirements, pipeline-to-team mappings, and owner resolution rules. We deliver a schema setup checklist for your Odoo administrator, including which crm.team records to pre-create, which crm.stage sequences to configure, and which x_ custom fields to add before data lands.
Load Odoo users and resolve owners
Spark owner records are loaded into Odoo as res.users stubs before any CRM data moves. Email addresses serve as the matching key. FlitStack AI runs an email-match lookup against existing Odoo users; unmatched owners are flagged for your team to either create Odoo accounts or designate a fallback owner. No CRM record migrates without a resolved user assignment. If an owner’s email matches an existing Odoo user, the user record is linked directly; otherwise, the owner remains as a stub until an account is provisioned.
Migrate res.partner records first (companies then contacts)
Odoo requires company records to exist before contact records can link via parent_id. We sequence the migration: Spark companies become res.partner records of type='company' first, then Spark contacts become res.partner of type='contact' with parent_id pointing to the primary company. The company contact count and any secondary company associations are preserved in custom fields for post-migration reconciliation. If a Spark contact references multiple companies, we capture all associated company IDs in a dedicated custom field and flag the primary relationship for manual review after migration.
Migrate crm.lead records (leads then deals) with stage mapping
Spark leads and deals both load into Odoo crm.lead. Leads map to crm.lead with type='lead'; deals map with type='opportunity'. Each record is assigned to a crm.team based on its Spark pipeline, and stage_id is set via the value-mapped pipeline stage. Custom fields on crm.lead are populated using the pre-created x_ fields. Owner assignments populate x_spark_owner_id and resolve to res.users from the user load step.
Run sample migration with field-level diff
A representative slice — typically 100–500 records spanning contacts, companies, leads, deals, and activities — migrates first. FlitStack AI generates a field-level diff comparing source values against destination field values, covering custom field mapping, stage assignment, owner resolution, and parent-child relationships. You verify the diff and approve before the full run commits. Any mapping adjustments are applied before the final migration executes.
Full migration with delta pickup and rollback plan
The full migration runs with records upserted via Odoo's XML-RPC API in batched transactions. A delta-pickup window of 24–48 hours captures any Spark records modified during the cutover. All operations are logged to an audit table. If reconciliation fails, a one-click rollback reverts Odoo to the pre-migration state using the stored audit log. Post-migration, we provide a data integrity report confirming record counts, relationship integrity, and field population rates.
Platform deep dives
Spark CRM
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 Spark CRM 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
Spark CRM: Not publicly documented on sparkcrm.io.
Data volume sensitivity
Spark 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 Spark CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Spark 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 Spark 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.