CRM migration
Field-level mapping, validation, and rollback between ZeyOS and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
ZeyOS
Source
Odoo CRM
Destination
Compatibility
13 of 15
objects map 1:1 between ZeyOS and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
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.
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 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
Odoo CRM
Partner (company type = company)
1:1ZeyOS 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
Odoo CRM
Contact (partner type = individual)
1:1ZeyOS 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
Odoo CRM
Lead
1:1ZeyOS 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
Odoo CRM
Product
1:1ZeyOS 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
Odoo CRM
Sale Order
1:1ZeyOS 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
Odoo CRM
Account Move (Invoice)
1:1ZeyOS 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
Odoo CRM
Helpdesk Ticket
1:1ZeyOS 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
Odoo CRM
Project
1:1ZeyOS 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
Odoo CRM
Task
1:1ZeyOS 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
Odoo CRM
Timesheet
1:1ZeyOS 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)
Odoo CRM
Mail Message / Activity
1:1ZeyOS 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
Odoo CRM
Sale Subscription (if Subscription app active) or Custom Field on Partner
lossyZeyOS 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)
Odoo CRM
Ir Attachment
1:1ZeyOS 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
Odoo CRM
Res Users
1:1ZeyOS 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)
Odoo CRM
Custom Fields on destination models
lossyZeyOS 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.
| ZeyOS | Odoo CRM | Compatibility | |
|---|---|---|---|
| Accounts | Partner (company type = company)1:1 | Fully supported | |
| Contacts | Contact (partner type = individual)1:1 | Fully supported | |
| Leads | Lead1:1 | Mapping required | |
| Items | Product1:1 | Fully supported | |
| Quotes, Orders, Deliveries | Sale Order1:1 | Fully supported | |
| Invoices | Account Move (Invoice)1:1 | Fully supported | |
| Tickets | Helpdesk Ticket1:1 | Fully supported | |
| Projects | Project1:1 | Fully supported | |
| Tasks | Task1:1 | Fully supported | |
| Time Entries | Timesheet1:1 | Fully supported | |
| Activities (calls, emails, meetings, notes) | Mail Message / Activity1:1 | Fully supported | |
| Contracts | Sale Subscription (if Subscription app active) or Custom Field on Partnerlossy | Mapping required | |
| Documents (file attachments) | Ir Attachment1:1 | Fully supported | |
| Users | Res Users1:1 | Fully supported | |
| Custom Fields (extdata) | Custom Fields on destination modelslossy | 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.
ZeyOS gotchas
Audit-locked invoices block post-import edits
No documented bulk API forces iterative record-by-record migration
Unix epoch timestamps require explicit conversion
File attachments require binary blob download from REST API
Token auth without OAuth limits automation scope
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 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.
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.
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.
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.
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.
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
ZeyOS
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 ZeyOS 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
ZeyOS: Not publicly documented — we apply exponential backoff on 429/5xx responses and confirm tenant-specific limits during scoping.
Data volume sensitivity
ZeyOS 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 ZeyOS to Odoo CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave ZeyOS
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.