CRM migration

Migrate from Spiro to Odoo CRM

Field-level mapping, validation, and rollback between Spiro and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

Spiro logo

Spiro

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

69%

9 of 13

objects map 1:1 between Spiro and Odoo CRM.

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Spiro to Odoo CRM is a platform switch that trades Spiro's AI-driven proactive relationship tracking for Odoo's all-in-one ERP ecosystem and open-source flexibility. Spiro's three core objects (Companies, Contacts, Opportunities) map directly to Odoo CRM's Partner, Contact, and crm.lead models, but the data export path requires coordination with Spiro's Customer Success team to enable the Data Collector and provision Dropbox access. We extract all custom field definitions from Spiro's UI during discovery, pre-create matching custom fields in Odoo, then import via Odoo's XML-RPC API using batch chunking and parent-record lookup resolution. Activity history (calls, emails, meetings, tasks) migrates as Odoo mail.message and mail.activity records linked to the correct Partner and Contact. Spiro's Workflows, email sequences, and automations do not migrate; we deliver a written inventory of every active automation for the customer's admin to rebuild in Odoo Studio or with a developer.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Spiro logo

Spiro

What's pushing teams away

  • Email integration disconnects without warning, causing missed activity logs
  • Integration issues with existing systems increase implementation time and friction
  • Users report the platform lacks depth for complex sales processes beyond basic tracking
  • Limited documentation makes self-service troubleshooting difficult
  • Small vendor size raises concerns about long-term viability and support continuity

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How Spiro objects map to Odoo CRM

Each row shows how a Spiro 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.

Spiro

Company

maps to

Odoo CRM

res.partner (company type)

1:1
Fully supported

Spiro Companies map to Odoo res.partner records with partner_type set to company. The company name, address fields, phone, website, and industry classification migrate directly. We use company name as the dedupe key during import and resolve any duplicate Spiro Companies representing the same legal entity into a single Odoo partner record with address fields merged. Spiro Company custom fields are pre-created as ir.model.fields on res.partner before import.

Spiro

Contact

maps to

Odoo CRM

res.partner (contact type)

1:1
Fully supported

Spiro Contacts map to Odoo res.partner records with partner_type set to individual and a parent_id linking to the mapped Company partner. Name, email, phone, mobile, job title, and department migrate directly. The parent partner must exist before contact import so the parent_id foreign key is satisfied. Spiro Contact custom fields migrate to custom ir.model.fields on res.partner.

Spiro

Opportunity

maps to

Odoo CRM

crm.lead

1:1
Fully supported

Spiro Opportunities map to Odoo crm.lead records. The Spiro Opportunity name becomes crm.lead.name; stage maps to Odoo stage_id via the stage name lookup within the target crm.team pipeline; expected_revenue and probability migrate to the Odoo fields of the same name. Close date maps to date_deadline. We flag any Spiro Opportunities with unrecognised stage names for manual Odoo stage creation before import.

Spiro

Pipeline Stage

maps to

Odoo CRM

crm.stage

lossy
Fully supported

Spiro Opportunity stage names are extracted during discovery and mapped to Odoo crm.stage records within the target crm.team. Each Spiro stage gets a corresponding Odoo stage with the same sequence order and a probability percentage matching Spiro's values. Odoo's default stages (New, Qualified, Proposal Sent, Won, Lost) are used as the base template if the Spiro pipeline stages do not map cleanly to a custom set.

Spiro

Pipeline

maps to

Odoo CRM

crm.team

lossy
Fully supported

Spiro's single workspace pipeline maps to one Odoo crm.team with the team's default stage set created in the previous step. If the customer uses Spiro's pipeline structure to separate lines of business, we create multiple crm.team records in Odoo and assign Opportunities to the correct team during import based on Spiro's pipeline assignment metadata.

Spiro

Owner / User

maps to

Odoo CRM

res.users

1:1
Fully supported

Spiro Users map to Odoo res.users records. We match by email address during import. Any Spiro User without a matching Odoo User is held in a reconciliation queue; the customer's Odoo admin provisions the missing User before record import resumes. Owner assignments on Opportunities and Activities resolve via the User mapping at migration time.

Spiro

Activity: Email

maps to

Odoo CRM

mail.message (subtype: email)

1:1
Fully supported

Spiro email engagements map to Odoo mail.message records with message_type=email, linked to the target res.partner via res_id and model=res.partner. Email subject, body, sender, and recipient migrate. If Spiro email sync was broken at any point (a known Spiro gotcha), those emails are absent from the export and cannot be backfilled post-migration.

Spiro

Activity: Call

maps to

Odoo CRM

mail.activity (activity_type: call)

1:1
Fully supported

Spiro call engagements map to Odoo mail.activity records with activity_type_id referencing the built-in Call activity type. Call duration, disposition, and notes migrate to activity-specific custom fields we create on mail.activity. The activity_date_deadline is set to the original Spiro call timestamp, and the activity is linked to the res.partner Contact record.

Spiro

Activity: Meeting

maps to

Odoo CRM

mail.activity (activity_type: meeting) + calendar.event

1:1
Fully supported

Spiro meeting engagements map to Odoo mail.activity with activity_type_id referencing the built-in Meeting type. If the customer requires full calendar event detail, we also create calendar.event records linked to the activity. Meeting title, start datetime, end datetime, location, and attendee list migrate.

Spiro

Activity: Task / Note

maps to

Odoo CRM

mail.activity (activity_type: task) or mail.message

1:1
Fully supported

Spiro task engagements map to Odoo mail.activity with activity_type_id = Task. Spiro note engagements (free-text notes attached to a Contact or Company) map to mail.message records with subtype comment, linked to the parent res.partner. Note body migrates as plain text; any embedded file references are resolved separately.

Spiro

Attachment

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

Spiro stores attachments as linked URLs rather than embedded blobs. During migration we verify each attachment URL is reachable, download the file content, and create Odoo ir.attachment records linked to the target res.partner or crm.lead via res_id and model. If the Spiro workspace access is revoked post-migration, attachment links become orphaned. We recommend downloading critical files before the migration window closes.

Spiro

Custom Fields

maps to

Odoo CRM

ir.model.field (custom)

lossy
Mapping required

Spiro custom field definitions (on Companies, Contacts, and Opportunities) must be extracted from Spiro's UI during discovery or confirmed with a Spiro CSM since there is no documented public endpoint. We pre-create matching custom ir.model.field records in Odoo before data import begins, using field type mapping (Spiro text -> char, Spiro number -> float, Spiro date -> date, Spiro picklist -> selection). Custom field values migrate with the parent object.

Spiro

Spiro Data Collector Drop

maps to

Odoo CRM

Import batch via XML-RPC

lossy
Fully supported

Spiro's Data Collector produces CSV file drops in a Dropbox folder. We do not rely on Data Collector as the primary export path because it requires CSM enablement (adding 3-5 business days) and produces flat CSV files without relationship keys. We use Data Collector as a reference export for data validation, and we extract the primary record data directly via Spiro's internal export endpoints or UI-based extraction when available. The Odoo import runs via XML-RPC batch calls with 500-record chunks and exponential backoff on rate-limit responses.

Gotchas + challenges

What specifically takes care here

Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.

Spiro logo

Spiro gotchas

High

Email disconnection silently breaks activity logging

Medium

Data Collector requires CSM enablement and Dropbox access

Medium

Attachment URLs are references, not embedded files

Low

Custom field definitions not exposed via self-service API

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Spiro email integration breakage causes unrecoverable activity gaps

    Spiro's email integration disconnects without warning, and emails sent during the disconnection window are not logged to Contact or Company records. We cannot backfill this activity data post-migration if it was never recorded in Spiro. During discovery we ask customers to verify email sync status in Spiro's settings and export any activity logs they want to preserve before the cutover window. Odoo replaces Spiro's email sync with its own email gateway connector, which the customer's IT team configures post-migration.

  • Data Collector requires CSM enablement and adds 3-5 business days

    Spiro's Data Collector is not self-serve. A Customer Success Manager must enable it for the organization, and it relies on a Dropbox folder destination. We coordinate with Spiro's team to provision the folder and confirm CSM access before beginning any export-phase work. This delay extends the migration timeline by three to five business days. We mitigate by beginning schema setup in Odoo during this window so that Data Collector coordination does not block the overall timeline.

  • Spiro custom field definitions require manual extraction

    Spiro does not expose custom field schema through a documented public API. Custom field definitions must be extracted manually from the Spiro UI or confirmed with a CSM. If the customer has a large number of custom fields across Companies, Contacts, and Opportunities, this extraction step adds scope to discovery and can delay the Odoo schema design phase. We request a complete field inventory from Spiro's support team before mapping begins and build the Odoo custom field schema in parallel with Data Collector coordination.

  • Odoo Community vs Online/Enterprise affects import method

    Odoo Community (self-hosted) requires server access and allows direct SQL import alongside XML-RPC, which speeds up large-volume migrations but requires database credentials. Odoo Online and Odoo.sh (cloud) restrict SQL access and require XML-RPC for all data imports, which is slower for large datasets. We confirm the Odoo deployment type during scoping and adjust our import pipeline accordingly. Self-hosted Odoo migrations can be 20-30 percent faster for datasets over 50,000 records.

  • Odoo stage probability must sum to 100 across each pipeline

    Odoo CRM enforces that the probability percentages across all stages within a crm.team pipeline sum to 100. Spiro does not enforce this constraint. During stage mapping we normalise Spiro stage probabilities to Odoo's requirement and flag any Spiro Opportunities assigned to stages with zero probability that may have been inadvertently closed or lost. The customer's admin reviews and approves the stage probability map before we run the Opportunity import.

Migration approach

Six steps for a successful Spiro to Odoo CRM data migration

  1. Discovery and Data Collector coordination

    We audit the Spiro workspace across custom field definitions (extracted from UI or via CSM), pipeline stage names, record counts per object, and activity volume. We simultaneously coordinate with Spiro's CSM to enable Data Collector and provision Dropbox access. We confirm the Odoo deployment type (Community self-hosted, Online, or Odoo.sh) and document the import method (XML-RPC only for cloud; XML-RPC plus optional direct SQL for self-hosted). The discovery output is a written migration scope, custom field inventory, and stage probability map for customer approval.

  2. Odoo schema setup and custom field creation

    We create the Odoo custom field schema before any data import. This includes creating custom ir.model.field records on res.partner (for Contact fields), crm.lead (for Opportunity fields), and res.partner for company-level custom fields. We configure crm.team records for each pipeline, create crm.stage records with normalised probability percentages that sum to 100, and set up user access so that the migration user has write access to all target models. For self-hosted Odoo, we validate the schema in a staging database before applying to production.

  3. Owner reconciliation and user provisioning

    We extract every distinct Spiro User referenced on Contact, Company, Opportunity, and Activity records and match by email against the Odoo destination's res.users table. Any Spiro User without a matching Odoo User goes to a reconciliation queue. The customer's Odoo admin provisions missing Users (active or inactive depending on whether the original Spiro user is still active). Migration cannot proceed past record import because owner and responsible user fields are required on crm.lead and mail.activity records.

  4. Staging migration and reconciliation

    We run a full migration into the Odoo staging or sandbox environment using production-like data volume. The customer's RevOps lead reconciles record counts (Partners, Contacts, Leads/Opportunities, Activities), spot-checks 25-50 random records against the Spiro source, and validates custom field values. Any mapping corrections, stage name adjustments, or custom field type changes happen in staging before production migration begins. This step also validates that Odoo's XML-RPC rate limits (typically 1,000 requests per minute on cloud) do not cause import timeouts.

  5. Production migration in dependency order

    We run production migration in record-dependency order: res.users validation (manual provisioning confirmed), res.partner company records (from Spiro Companies), res.partner contact records (from Spiro Contacts with parent_id resolved to company), crm.team and crm.stage configuration (validated from staging), crm.lead records (from Spiro Opportunities with team_id, stage_id, and user_id resolved), mail.activity and mail.message records (batch via XML-RPC with 500-record chunks and exponential backoff), ir.attachment records (downloaded from Spiro URLs and uploaded to Odoo). Each phase emits a row-count reconciliation report before the next phase begins.

  6. Cutover, validation, and automation handoff

    We freeze Spiro writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver a written inventory of every Spiro Workflow and automation with its trigger, conditions, and recommended Odoo Studio or Python equivalent. We do not rebuild Spiro automations as Odoo actions inside the migration scope; that is a separate engagement. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. Odoo email gateway configuration (for inbound and outbound email sync) is completed by the customer's IT team during the hypercare week.

Platform deep dives

Context on both ends of the pair

Spiro logo

Spiro

Source

Strengths

  • Proactive AI surfaces relationship signals without manual CRM entry
  • Data Collector enables no-code batch imports from any external source
  • Custom fields extend the core data model for SMB use cases
  • Dropbox-based file transfer requires no engineering resources
  • Remote-first vendor with focused customer success engagement

Weaknesses

  • No publicly documented REST API limits migration tooling options
  • Email integration reliability issues reported in user reviews
  • Small vendor footprint raises long-term support concerns
  • Limited published documentation for advanced configuration
  • Activity attribution can break silently when email disconnects
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Standard CRM migration. 3 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Spiro and Odoo CRM.

  • Object compatibility

    B

    3 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Spiro: Not publicly documented.

  • Data volume sensitivity

    B

    Spiro doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Spiro to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Spiro to Odoo CRM data migrations

Answers to the questions buyers ask most during Spiro to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Spiro to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between four and six weeks for accounts under 15,000 Contacts and 3,000 Opportunities with a straightforward custom field set. Migrations with complex custom field schemas, multiple pipeline teams, large activity histories (over 200,000 activity records), or self-hosted Odoo Community destinations requiring database credentials move to eight to twelve weeks. The Data Collector CSM enablement step adds three to five business days that we overlap with schema setup to avoid extending the overall timeline.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Spiro.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day