CRM migration
Field-level mapping, validation, and rollback between Omni.us and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Omni.us
Source
Odoo CRM
Destination
Compatibility
6 of 12
objects map 1:1 between Omni.us and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Omni.us to Odoo CRM is a structural migration from a script-based sequence tool to a full-stack CRM and ERP platform. Omni.us has no native Contacts object—responses and script associations are the only proxy—so we must reconstruct the contact layer by tracing response-to-account relationships before any contact records can be written to Odoo. Scripts, which are the core object in Omni, have no direct Odoo equivalent; we migrate their content as description fields on crm.lead records and flag them for manual reassignment in Odoo's Activity and Workflow system. Automatic Pausing rules do not migrate as automation code; we document them as a written specification for the customer's Odoo admin to rebuild as mail.activity records or ir.actions.server rules. The migration uses Odoo's XML-RPC or JSON-RPC API with batch chunking and rate-limit handling to stay within the target instance's write limits, which vary by hosting provider and edition.
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 Omni.us 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.
Omni.us
Target Accounts
Odoo CRM
res.partner (company mode)
1:1Omni Target Accounts map to Odoo res.partner records in company mode. We preserve company name, domain (stored as website), and any custom workbook fields as ir.model.data fields on the partner. Odoo's res.partner model serves as both Contact and Account depending on the is_company flag, so Target Accounts set is_company=True. Address enrichment (street, city, country) is attempted from domain-based lookups where available; missing fields are flagged in the reconciliation report.
Omni.us
Contacts (reconstructed)
Odoo CRM
res.partner (contact mode)
1:manyOmni has no native Contacts object, so we reconstruct the contact layer by extracting respondent email addresses and names from Response records and associating them with the parent Target Account partner. Multiple responses from the same email address deduplicate to a single res.partner contact record. The original Omni Script association is preserved in a custom field script_reference__c for audit. Contacts without an associated Target Account are created as standalone partner records flagged as orphan=True in a custom field.
Omni.us
Scripts
Odoo CRM
crm.lead.description (template content)
1:1Omni Scripts are outreach templates with placeholders and branching logic that has no direct Odoo equivalent. We extract the full script text, placeholders, and step sequence and write them as a custom Text field script_template__c on crm.lead. The customer's Odoo admin assigns script content to new leads or uses it as a manual reference in follow-up activities. Script step sequencing and branching are not converted to automation; we document the structure in a written script inventory so the admin can rebuild it as a mail.activity plan or stage-based template if needed.
Omni.us
Case Studies
Odoo CRM
ir.attachment
1:1Omni Case Studies are content attachments linked to accounts or scripts. We export the text content, title, and metadata and write them as Odoo ir.attachment records linked to the corresponding res.partner via res_model='res.partner' and res_id pointing to the Target Account partner. Odoo does not have a native Case Study object, so the generic attachment model is the correct equivalent. PDF or document attachments are stored as binary attachments with the original filename preserved.
Omni.us
Responses
Odoo CRM
mail.message
1:1Omni Responses represent reply data tied to scripts and accounts. We map each Response to an Odoo mail.message record attached to the parent crm.lead (if the respondent was linked to a lead) or to the res.partner contact record. Response text, timestamp, and disposition status migrate. If the destination Odoo instance includes the Discuss (mail) module, messages appear in the chatter on the partner or lead record. Response records without a resolvable parent contact are attached to the corresponding Target Account partner and flagged as unmatched_response=True.
Omni.us
Automatic Pausing Rules
Odoo CRM
mail.activity.plan
lossyOmni Automatic Pausing rules govern when outreach sequences pause based on prospect actions (reply, bounce, opt-out). These are not automation code and do not migrate as Odoo server actions. We audit every active Automatic Pausing rule, document its trigger condition, action type, and target script, and deliver a written specification recommending equivalent Odoo mail.activity.plan entries and ir.actions.server rules. The customer's Odoo admin implements the recommended rules post-migration; we do not write automation code as part of the standard migration scope.
Omni.us
Custom Workbook Fields
Odoo CRM
ir.model.field
lossyOmni's workbook-layer custom fields require schema discovery via the model IDE before migration. We enumerate all active custom field definitions (name, type, workbook scope) and create equivalent ir.model.field records in Odoo on the target model (res.partner or crm.lead). Duration fields, calculated fields, and nested custom properties are mapped to Odoo field types (Float, Integer, Char, Text, Selection) based on type analysis. Fields that cannot map directly (e.g., Omni Duration with branching logic) are documented in the field mapping appendix with a manual resolution recommendation.
Omni.us
Users
Odoo CRM
res.users
1:1Omni user records map to Odoo res.users. We resolve by email match against the destination Odoo instance. Any Omni user without a matching Odoo res.users record is placed in a reconciliation queue for the customer's admin to provision before record import resumes. Role and permission structures in Omni are limited, so we create baseline User records without granular access control preservation and flag this gap in the handoff documentation.
Omni.us
Pipeline / Deal Stages
Odoo CRM
crm.stage
lossyOmni has no native pipeline or deal stages. We create a default Odoo CRM pipeline with stages New, Qualified, Proposition, Won, and Lost, which are the Odoo CRM default stages. If the customer used Omni script status as a de facto pipeline proxy (e.g., Active, Paused, Completed, Cancelled), we map those statuses to crm.stage entries with matching sequence order and name. Lost reason configuration (lost_reason_id) is enabled on the stage form for post-migration rep entry.
Omni.us
Engagement Timestamps
Odoo CRM
mail.tracking.value
1:1Omni records timestamps for script sends, response receipts, and pausing events. We migrate these as mail.message records with a tracking field timestamp referencing the original Omni UTC timestamp. This preserves the activity timeline ordering in Odoo's chatter even though the engagement type is not a native Odoo activity. Historical timestamps are preserved to the second where available from the Omni API response payload.
Omni.us
Tags
Odoo CRM
res.partner.category
lossyOmni Target Account tags (e.g., Industry, Tier, Segment labels) map to Odoo res.partner.category records (the Tags model on partners). We extract distinct tag values from the source workbook, create matching res.partner.category entries, and assign them to the corresponding res.partner records during import. Tag rename or consolidation (e.g., two tags meaning the same thing) happens during the pre-migration data-cleanse phase.
Omni.us
Sequence Step Metadata
Odoo CRM
crm.lead.optional
lossyOmni script steps carry metadata such as step order, delay between steps, channel (email/LinkedIn), and conditional branches. We extract this as a JSON blob stored in a custom Text field script_steps__c on crm.lead, preserving the full step metadata as a reference document. This is not rendered as Odoo activities or automation; it is a data-preservation pass so that the customer has the original sequencing information available for manual workflow reconstruction.
| Omni.us | Odoo CRM | Compatibility | |
|---|---|---|---|
| Target Accounts | res.partner (company mode)1:1 | Fully supported | |
| Contacts (reconstructed) | res.partner (contact mode)1:many | Fully supported | |
| Scripts | crm.lead.description (template content)1:1 | Fully supported | |
| Case Studies | ir.attachment1:1 | Mapping required | |
| Responses | mail.message1:1 | Mapping required | |
| Automatic Pausing Rules | mail.activity.planlossy | Mapping required | |
| Custom Workbook Fields | ir.model.fieldlossy | Mapping required | |
| Users | res.users1:1 | Fully supported | |
| Pipeline / Deal Stages | crm.stagelossy | Fully supported | |
| Engagement Timestamps | mail.tracking.value1:1 | Fully supported | |
| Tags | res.partner.categorylossy | Fully supported | |
| Sequence Step Metadata | crm.lead.optionallossy | 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.
Omni.us gotchas
60 req/min API rate limit slows bulk migration
No dedicated Contacts object means contact layer must be reconstructed
Custom workbook field types require manual mapping configuration
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 schema design
We audit the Omni.us workspace across Scripts, Target Accounts, Case Studies, Responses, Automatic Pausing rules, custom workbook fields, and user records. We pair this with a destination Odoo instance review to confirm the installed apps (CRM, Discuss, Project), Odoo edition (Online,.sh, or Community), and any existing custom fields or modules. The discovery output is a written migration scope, an Odoo schema design (partner categories, custom fields, crm.stage configuration), and a contact-reconstruction strategy based on the Response-to-Account linkage ratio.
Pre-migration data audit and contact reconstruction planning
We run a pre-migration data audit to identify orphaned responses (responses without a resolvable Target Account), duplicate respondent emails across scripts, and custom workbook field definitions at each abstraction level. We build a contact reconstruction plan: each distinct respondent email becomes a res.partner contact record linked to the nearest Target Account, with a script_reference__c field tracking the source Script. Any respondents that cannot be associated with a Target Account are flagged as standalone contacts. Data deduplication rules (email match, name normalization) are agreed upon before extraction begins.
Sandbox migration and reconciliation
We run a full migration into an Odoo Sandbox environment using production-equivalent data volumes. The customer's Odoo administrator reviews record counts (partners, contacts, crm.lead, attachments, mail.messages), spot-checks 25-50 records against the Omni source, and validates the custom field mapping for workbook-layer fields. Any schema corrections or mapping changes happen in the sandbox before production migration begins. This step prevents rework in the live environment and ensures the customer signs off on the contact reconstruction logic.
User provisioning and owner reconciliation
We extract every distinct Omni user referenced on Scripts, Target Accounts, and Responses and match by email against the destination Odoo res.users table. Users without a matching Odoo account go to a reconciliation queue for the customer's admin to provision. Migration cannot complete owner resolution until all referenced users have an Odoo res.users record, because the create_uid and write_uid fields on mail.message and crm.lead require valid User IDs.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (company mode, from Target Accounts), res.partner (contact mode, reconstructed contacts), crm.lead (from Scripts and account associations), ir.attachment (Case Studies), mail.message (Responses), ir.model.field (custom workbook field schema), res.partner.category (tags), and mail.tracking.value (engagement timestamps). Each phase emits a row-count reconciliation report before the next phase begins. Script content is written to crm.lead as script_template__c after lead creation.
Cutover, validation, and automation rebuild handoff
We freeze Omni 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 the Script inventory document (with content and step metadata) and the Automatic Pausing Rules specification to the customer's Odoo admin. We support a one-week hypercare window for reconciliation issues raised by the sales team. Workflow and automation rebuilds are outside the standard migration scope; the documentation we deliver enables the admin or an Odoo partner to implement them.
Platform deep dives
Omni.us
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Omni.us and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Omni.us and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Omni.us and Odoo CRM.
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
Omni.us: 60 requests per minute per API key; can be increased to 500 req/min on request.
Data volume sensitivity
Omni.us 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 Omni.us to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Omni.us 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 Omni.us
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.