CRM migration

Migrate from ZeyOS to Odoo CRM

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

ZeyOS logo

ZeyOS

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

87%

13 of 15

objects map 1:1 between ZeyOS and Odoo CRM.

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from ZeyOS to Odoo CRM is a cross-platform data model migration, not a direct record copy. ZeyOS stores Accounts and Contacts with a PostgreSQL-backed schema accessible via REST at cloud.zeyos.com/{INSTANCE}/api/v1/, using Unix epoch int8 timestamps for all date fields and marking invoices as immutable post-booking. Odoo CRM follows a Lead-Opportunity pipeline model with XML-RPC as its primary API protocol and stores Partners (companies) and Contacts as separate but related records. We export from ZeyOS's REST API iteratively (no bulk endpoint exists), convert epoch timestamps to ISO 8601 datetime strings, sequence invoice imports in strict chronological order to avoid locked-record conflicts, and map ZeyOS Accounts and Contacts to Odoo Partners and Contacts with the correct partner_type flag. Projects, Tasks, Tickets, and Time Entries map to Odoo Project and Helpdesk modules if those apps are active in the destination Odoo instance. Workflows, iXML scripts, and custom automation rules do not migrate; we deliver a written inventory of these for the customer's Odoo admin to rebuild in Studio or through Python modules post-migration.

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

ZeyOS logo

ZeyOS

What's pushing teams away

  • Very limited public review presence (only 1 verified G2 review, sparse Capterra coverage) makes it hard for prospective customers to gauge long-term reliability.
  • Smaller vendor footprint compared to Odoo, NetSuite, or HubSpot raises concerns about long-term product support and roadmap stability.
  • Custom iXML scripting layer adds development overhead for teams that want standard integrations without writing custom code.

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 ZeyOS objects map to Odoo CRM

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

ZeyOS

Accounts

maps to

Odoo CRM

Partner (company type = company)

1:1
Fully supported

ZeyOS Accounts map directly to Odoo CRM Partners with partner_type = 'company'. The ZeyOS account name becomes Partner display_name, and we preserve any industry, annual revenue, or phone fields as custom fields on the Partner model. Account is imported before any Contact import so that the Contact's parent_id (partner_id) lookup is satisfied at insert time.

ZeyOS

Contacts

maps to

Odoo CRM

Contact (partner type = individual)

1:1
Fully supported

ZeyOS Contacts map to Odoo CRM Contacts with partner_type = 'individual'. The Contact's name, email, phone, and mobile fields migrate directly. The parent Account reference from ZeyOS becomes the Contact's parent_id pointing to the corresponding Partner record. extdata nickname and address sub-fields in ZeyOS map to Odoo street, street2, city, state_id, zip, and country_id fields using a field-level transform during import.

ZeyOS

Leads

maps to

Odoo CRM

Lead

1:1
Mapping required

ZeyOS Leads map to Odoo CRM Lead (crm.lead model). We preserve the ZeyOS lead-specific status field as a custom field on the Odoo Lead so that the customer's original lead lifecycle state is auditable post-migration. Lead conversion rules (Lead -> Opportunity + Partner + Contact) are documented for the customer's Odoo admin to configure in Studio post-migration.

ZeyOS

Items

maps to

Odoo CRM

Product

1:1
Fully supported

ZeyOS Items (inventory/product catalog) map to Odoo Product.product with type = 'product' for physical items or 'service' for service items. The barcode field maps to Odoo's barcode field; model number maps to the default_code field. We preserve any ZeyOS custom Item fields via Odoo's custom field mechanism and set the product's vendor (seller) from the ZeyOS item supplier data if present.

ZeyOS

Quotes, Orders, Deliveries

maps to

Odoo CRM

Sale Order

1:1
Fully supported

ZeyOS Quotes, Orders, and Deliveries are separate records in a billing pipeline. We consolidate them as Sale Order records in Odoo with state mapping: ZeyOS Quote -> Odoo Quotation (state = draft), ZeyOS Order -> Odoo Sale Order (state = sale), and ZeyOS Delivery -> Odoo Delivery Order (picking). If Odoo Inventory app is not active, Deliveries migrate as notes on the Sale Order. We preserve the line items, quantities, and unit prices from each ZeyOS record type.

ZeyOS

Invoices

maps to

Odoo CRM

Account Move (Invoice)

1:1
Fully supported

ZeyOS Invoices map to Odoo Account Moves with type = 'out_invoice'. We import invoices in strict chronological order by ZeyOS creationdate epoch timestamp to respect the audit-locked state. Any ZeyOS invoice that returns a locked-record error (HTTP 403 or a business-rule error from ZeyOS API) is flagged for manual review before we attempt re-import. Customer must confirm the complete invoice chronology during scoping. Odoo journal_id is set from the customer's default sale journal configuration.

ZeyOS

Tickets

maps to

Odoo CRM

Helpdesk Ticket

1:1
Fully supported

ZeyOS Tickets map to Odoo Helpdesk Ticket (helpdesk.ticket model) if the Helpdesk app is active in the destination Odoo instance. Ticket subject, description, status, priority, and assigned user migrate. The ZeyOS email integration ticket-number association migrates as a custom field on the Odoo ticket. Conversation threads migrate as message records on the ticket using Odoo's mail.thread mechanism.

ZeyOS

Projects

maps to

Odoo CRM

Project

1:1
Fully supported

ZeyOS Projects map to Odoo Project.project as the top-level container. Project name, description, and status migrate. We resolve the ZeyOS project owner to an Odoo User record by email lookup. If Odoo Timesheet app is not active in the destination, time entries from ZeyOS Projects are preserved as notes on the Project record and documented as a separate timesheet migration scope.

ZeyOS

Tasks

maps to

Odoo CRM

Task

1:1
Fully supported

ZeyOS Tasks (belonging to Projects) map to Odoo Project Task (project.task). We preserve the parent-Project linkage by resolving the ZeyOS project FK to the Odoo project.id created during the Project import phase. Task assignees resolve by email to Odoo User records; any unresolved assignees are flagged for admin review. Task status from ZeyOS maps to Odoo stage_id within the project kanban.

ZeyOS

Time Entries

maps to

Odoo CRM

Timesheet

1:1
Fully supported

ZeyOS Time Entries linked to Projects or Tasks map to Odoo Account Analytic Line (if Timesheet app is active) or to Project Task time logs. We preserve the employee_id mapping from ZeyOS user to Odoo employee, the project_id and task_id lookups, and the duration in hours. The ZeyOS creationdate epoch timestamp converts to the Odoo date field and Odoo datetime for timesheet entry.

ZeyOS

Activities (calls, emails, meetings, notes)

maps to

Odoo CRM

Mail Message / Activity

1:1
Fully supported

ZeyOS Activities linked to Accounts or Contacts map to Odoo Mail Message records attached to the corresponding Partner or Contact via Odoo's mail.thread model. Call engagements with disposition and duration data migrate as message fields; meeting engagements migrate with location and attendee data preserved. Note body content migrates as mail.message with subtype = 'note'. We resolve the activity owner to an Odoo User by email lookup.

ZeyOS

Contracts

maps to

Odoo CRM

Sale Subscription (if Subscription app active) or Custom Field on Partner

lossy
Mapping required

ZeyOS Contracts represent subscription or service agreements tied to Accounts. If the destination Odoo instance has the Subscription app installed, Contracts map to sale.subscription with partner_id resolved to the mapped Partner. If no Subscription app is present, contract metadata (start date, end date, renewal terms) migrates as custom fields on the Partner record, and the customer documents renewal rules manually post-migration.

ZeyOS

Documents (file attachments)

maps to

Odoo CRM

Ir Attachment

1:1
Fully supported

ZeyOS files stored in the files table with binfile blobs are downloaded individually via REST API and re-uploaded to Odoo as ir_attachment records. Files with record FK attach to the corresponding Odoo record (Partner, Contact, Lead, Project Task, etc.) via the res_model and res_id fields. Files with comment FK attach to mail.message records. Files exceeding 25MB are flagged for customer review before upload; standard MIME types (PDF, images, Office formats) migrate without additional handling.

ZeyOS

Users

maps to

Odoo CRM

Res Users

1:1
Fully supported

ZeyOS Users who own records map to Odoo res.users records. We match by email address as the dedupe key. Inactive ZeyOS users are flagged for the customer's Odoo admin to deactivate in the destination before migration. The ZeyOS token-based auth credentials do not migrate; Odoo's session-based auth uses the customer's existing Odoo login credentials or new accounts provisioned during setup.

ZeyOS

Custom Fields (extdata)

maps to

Odoo CRM

Custom Fields on destination models

lossy
Fully supported

ZeyOS custom fields exposed via the fields table and extdata JSON in the REST API map to Odoo custom fields created under Settings > Technical > Custom Fields before migration begins. We inspect the ZeyOS field definitions (field type, required flag, picklist values) and create the equivalent Odoo field with matching type (char, text, selection, float, integer, date, datetime). extdata nested JSON values are flattened into separate Odoo fields or stored as a serialized field if the structure is too complex for a flat mapping.

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.

ZeyOS logo

ZeyOS gotchas

High

Audit-locked invoices block post-import edits

High

No documented bulk API forces iterative record-by-record migration

Medium

Unix epoch timestamps require explicit conversion

Medium

File attachments require binary blob download from REST API

Low

Token auth without OAuth limits automation scope

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

  • Audit-locked ZeyOS invoices require chronological sequencing

    ZeyOS marks invoices as immutable once booked via the API. We cannot update or delete them post-booking, and importing them out of chronological order can cause API rejection or data inconsistency. During scoping, we require the customer to provide the complete invoice chronology including creationdate timestamps. We sort the invoice export by epoch timestamp ascending and import in that sequence. Any invoice that the ZeyOS API returns as locked (HTTP 403 or business-rule error) is flagged for manual review and held in a reconciliation queue until the customer confirms the correct resolution.

  • No ZeyOS bulk API forces iterative record-by-record migration

    ZeyOS exposes only a REST API at cloud.zeyos.com/{INSTANCE}/api/v1/ without any batch import or bulk endpoint. We paginate through results using limit and offset parameters and insert records individually into Odoo via XML-RPC or JSON-RPC. For large datasets (over 50,000 records), this extends migration timelines significantly. We implement request-level exponential backoff on rate-limit responses and parallelize across safe concurrent windows where the ZeyOS API permits. Customers with very large ZeyOS instances should expect longer migration timelines than comparable moves from platforms with bulk export endpoints.

  • Unix epoch timestamps must convert to ISO 8601 datetime for Odoo

    ZeyOS stores creationdate and all date columns as int8 Unix timestamps (seconds since 1970-01-01). Odoo expects ISO 8601 datetime strings with timezone metadata. We run an explicit conversion step on every timestamped field before Odoo import, validating that the converted datetime falls within the supported date range for Odoo datetime fields (years 1900-3000). Any timestamp outside this range is flagged with the customer for data quality review.

  • Odoo CRM requires XML-RPC or JSON-RPC not REST

    Odoo uses XML-RPC (v12 and earlier) or JSON-RPC (v13+) as its primary API protocol, not REST. This means the migration pipeline must translate from ZeyOS's REST response format to Odoo's RPC call structure for every object type. We handle the protocol translation in the migration layer, using the appropriate Odoo RPC endpoint (xmlrpc/2/common or jsonrpc) and Odoo's session-based authentication model. Any Odoo instance using two-factor authentication requires the migration user to disable 2FA during the migration window or use an API key if the Odoo version supports it.

  • Odoo Project and Helpdesk apps may not be active in the destination

    ZeyOS includes Projects, Tasks, Tickets, and Time Entries as standard modules. Odoo separates these into optional apps (Project, Timesheet, Helpdesk) that may not be installed in the destination Odoo instance. We confirm which Odoo apps are active during scoping and map ZeyOS objects to the installed equivalents. If an app is not active, we map the data to custom fields on the closest installed object (e.g., Ticket data to a custom field on CRM Lead) and flag the need for the customer to install the relevant Odoo app before migration of that object type begins.

Migration approach

Six steps for a successful ZeyOS to Odoo CRM data migration

  1. Discovery and scoping

    We audit the source ZeyOS instance across all active modules (CRM, ERP, Groupware), collecting record counts per object type (Accounts, Contacts, Leads, Items, Projects, Tasks, Tickets, Contracts, Time Entries, Activities), identifying any custom fields in the fields table and extdata patterns, and assessing the volume of binary attachments. We confirm which Odoo apps are active in the destination (CRM, Project, Helpdesk, Inventory, Invoicing, Subscription) and identify any gaps. The discovery output is a written migration scope with record counts, a data model gap analysis, and a timeline estimate.

  2. Authentication and API validation

    We authenticate to ZeyOS using the customer's instance token from cloud.zeyos.com/{INSTANCE}/api/v1/ and validate pagination limits, rate-limit responses, and the availability of each object endpoint. We test authentication to the destination Odoo instance via XML-RPC or JSON-RPC using the migration user's credentials, confirm the installed apps and their API-accessible models, and validate that the Odoo migration user has write access to the target models. If Odoo 2FA is enabled, we coordinate with the customer's admin to temporarily disable it or provision an API key.

  3. Schema pre-creation and epoch conversion design

    We pre-create all required Odoo custom fields (matching ZeyOS extdata field types and picklists), configure Partner company/individual types, set up Odoo CRM Lead stages matching ZeyOS lead status values, and configure any Odoo Project stages or Helpdesk ticket stages needed. We design and validate the epoch-to-ISO datetime conversion function using the full range of ZeyOS timestamp values in the dataset. We run a sample of 50-100 records through the conversion and inspect the results before proceeding to full export.

  4. Sandbox migration and reconciliation

    We run a full migration into the customer's Odoo staging or sandbox environment using production-like data volume. The customer's Odoo admin reviews record counts across all object types, spot-checks 25-50 random records against the ZeyOS source, and validates that custom field values, date fields, and attachment links are intact. Any mapping corrections (field name mismatches, date format issues, lookup resolution failures) are fixed in the migration layer before production migration begins. This step also validates that the Odoo user provisioning plan is correct and all referenced owners have corresponding Odoo User records.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Odoo Users (validated against provisioning plan), Partners (from ZeyOS Accounts), Contacts (with parent_id resolved to Partner), Leads, Products (from ZeyOS Items), Sale Orders and Deliveries (in chronological order), Invoices (in strict epoch timestamp order respecting locked-record constraints), Projects, Tasks, Timesheets, Helpdesk Tickets, Activities, Attachments, and Custom Fields last (because they often reference the standard records they decorate). Each phase emits a row-count reconciliation report showing imported vs. skipped vs. errored records before the next phase begins.

  6. Cutover, validation, and automation inventory handoff

    We freeze ZeyOS writes during cutover, run a final delta migration of any records modified during the migration window, then set the customer live on Odoo CRM as the system of record. We deliver the iXML script inventory, ZeyOS workflow-equivalent document, and custom automation handoff to the customer's Odoo admin for Studio or Python module rebuild post-migration. We support a one-week hypercare window where we resolve any data quality issues raised by the customer's team. We do not rebuild ZeyOS iXML scripts or automations as Odoo Python modules within the migration scope; that is a separate engagement.

Platform deep dives

Context on both ends of the pair

ZeyOS logo

ZeyOS

Source

Strengths

  • Unified platform combining CRM, ERP, and Groupware under a single subscription reduces tooling sprawl.
  • Free tier for up to five users enables teams to onboard and evaluate the platform without upfront cost.
  • Open PostgreSQL schema and REST API provide direct database access for migrations and integrations.
  • Audit-proof financial transactions (quotes, orders, invoices) satisfy compliance requirements for locked records.
  • Integrated inventory management with automated stock transactions on every delivery.

Weaknesses

  • Very limited public review presence reduces ability to gauge real-world customer satisfaction and longevity.
  • Smaller market footprint compared to Odoo, NetSuite, or HubSpot raises vendor risk concerns.
  • Custom iXML scripting language creates a learning curve for teams accustomed to standard integration approaches.
  • No documented bulk API means large migrations require iterative record-by-record API calls.
  • Pricing model is primarily per-user, which can become expensive as teams scale beyond 20-30 users.
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. 2 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 ZeyOS and Odoo CRM.

  • Object compatibility

    B

    2 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

    ZeyOS: Not publicly documented — we apply exponential backoff on 429/5xx responses and confirm tenant-specific limits during scoping.

  • Data volume sensitivity

    B

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

Estimator

Estimate your ZeyOS 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 ZeyOS to Odoo CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most ZeyOS to Odoo CRM migrations complete in four to six weeks for accounts under 20,000 Accounts and 10,000 Contacts with no active financial record migration (Quotes, Orders, Invoices). Migrations with active Quotes, Orders, and Invoices requiring chronological locked-record sequencing, custom extdata field mappings, or large engagement histories (over 200,000 activity records) extend to eight to twelve weeks because ZeyOS lacks a bulk API endpoint and forces iterative record-by-record export and import.

Adjacent paths

Related migrations to explore

Ready when you are

Move from ZeyOS.
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