CRM migration
Field-level mapping, validation, and rollback between Unim and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Unim
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Unim and Odoo CRM.
Complexity
CModerate
Timeline
4-6 weeks
Overview
Moving from Unim to Odoo CRM means exiting a platform where every deployment is hand-built with a unique field landscape, and entering Odoo CRM's module-based architecture where res.partner handles contacts and companies, crm.lead manages prospects, and crm.opportunity drives the sales pipeline. We begin every Unim migration by introspecting the live schema via the custom-fields API, resolving ModelID and DataType references, and cataloguing every custom field before writing a single record. Odoo CRM's standard objects accept these records in dependency order: country and state records first, then res.partner, then crm.lead, then crm.opportunity with stage and user lookups resolved. Unim workflows, automations, and bespoke application logic do not migrate; we deliver a written inventory of these for the customer's admin to rebuild in Odoo Studio or via custom module development.
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 Unim 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.
Unim
Contact
Odoo CRM
res.partner
1:1Unim Contact records map to Odoo CRM res.partner. The customer's name, email, phone, and address fields migrate directly. We resolve the country and state references via ir.model.data lookups so that partner addresses validate correctly. Owner assignment from Unim maps to res.partner.user_id via email-matched res.users. Custom fields on the Contact model migrate as custom fields on res.partner via Odoo Studio or a custom module created before the partner import phase begins.
Unim
Company
Odoo CRM
res.partner (company type)
1:1Unim Company records map to Odoo CRM res.partner with is_company=True. The company name becomes partner name, and the domain or website migrates to website. We create res.partner records for companies before the Contact import phase so that individual Contact records can reference a parent partner_id for the company association. This satisfies Odoo CRM's hierarchical partner model and enables the Contact-to-Company linkage that drives the pipeline view.
Unim
Activity
Odoo CRM
mail.message
1:1Unim Activity records—calls, emails, notes, meetings—map to Odoo CRM mail.message entries linked to the target res.partner record via res_id and model=res.partner. Activity type, body content, timestamp, and owner reference migrate directly. We set message_type appropriately (email, call, note) and preserve the original timestamp so that the Odoo CRM chatter timeline reflects the true engagement chronology. Odoo CRM's mail.message does not require a separate Activity model; all interactions flow through the chatter thread on res.partner.
Unim
Custom Field (Unim)
Odoo CRM
Custom Field (Odoo CRM)
lossyUnim exposes custom fields via a dedicated custom-fields API route. Each custom field has a Name, ModelID, DataType, and Nullable flag. DataTypes require a separate valuelists API call to resolve the reference ID before field creation. We introspect all custom fields during discovery, resolve their DataType IDs, and create matching fields in Odoo CRM via Studio (for simple types) or a custom module (for relational types). Field creation in Odoo must complete before the corresponding data import phase runs, so custom field definitions deploy first in every migration plan.
Unim
Custom Object
Odoo CRM
Custom Model (ir.model)
1:1Bespoke entity types beyond standard Contacts, Companies, and Activities are defined at the application level in Unim and vary per deployment. We discover these via schema introspection during the discovery phase and create matching custom models in Odoo CRM by adding records to ir.model and ir.model.fields via XML-RPC. Each custom model's API name uses the Odoo naming convention (x_customentity), and lookup relationships to res.partner or crm.lead are established as relational fields. Admin configuration of the custom model's menu and view access is outside migration scope and is documented for the customer's Odoo admin post-migration.
Unim
User/Owner
Odoo CRM
res.users
1:1Owner assignment on Unim records uses user-reference fields scoped to that specific Unim deployment. Owner IDs cannot be used directly in Odoo CRM. We extract every distinct owner ID referenced on contacts, companies, activities, and custom objects, then match by email address against the Odoo CRM res.users table. Any owner without a matching Odoo user goes into a reconciliation queue for the customer's admin to provision the corresponding user account before the record import phases run. Owner resolution must complete before any res.partner or crm.lead import because user_id is a required lookup on most CRM objects.
Unim
File/Attachment
Odoo CRM
ir.attachment
1:1Unim attachments are served via the Files dimension, not inline with the record. Each attachment requires a separate API call to fetch the binary blob. For large migrations with many attachments, we paginate file extraction and apply retry logic on 429 responses. In Odoo CRM, attachments migrate to ir.attachment records linked via res_model=res.partner and res_id pointing to the target partner. Original filenames and MIME types are preserved. This mapping requires the res.partner import phase to complete before file association, so attachments run as the final phase after the record graph is stable.
Unim
Tag/Label
Odoo CRM
res.partner.category
lossyUnim tag associations are stored as array fields or linked records depending on the specific deployment. We preserve tag-to-record linkages as a join table that maps to Odoo CRM res.partner.category records. The category.name migrates as the tag label. If the customer's Unim instance uses a large taxonomy of custom tags, we deduplicate and normalize before import to avoid Odoo CRM's tag explosion on the partner form. The customer chooses during scoping whether to migrate all historical tags or restrict to active-tagged records.
Unim
Pipeline/Deal Stage
Odoo CRM
crm.stage
lossyIf the Unim deployment includes deal or opportunity entities, their stage values map to Odoo CRM crm.stage records. We create stage records in sequence order, set is_won and sequence fields to match the Unim stage properties, and configure fold=False for active stages so they appear in the Odoo CRM pipeline kanban view. The crm.stage configuration deploys before any crm.lead or crm.opportunity import so that stage lookups resolve at insert time.
Unim
Lead/Prospect
Odoo CRM
crm.lead
1:1Unim entities serving as sales prospects (leads) map to Odoo CRM crm.lead. The lead's name, email, phone, source, and description migrate directly. The stage field maps to crm.stage via the stage configuration phase. Priority and tag_ids migrate to crm.lead priority and category_ids respectively. Owner assignment uses the resolved res.users lookup. In Odoo CRM, crm.lead serves as the initial pipeline entry; conversion to res.partner (for new contacts) and crm.opportunity (for pipeline tracking) happens post-migration in the Odoo CRM UI or via the crm.lead convert wizard.
Unim
Opportunity
Odoo CRM
crm.opportunity
1:1Unim opportunity records map to Odoo CRM crm.opportunity. The opportunity name, expected revenue, priority, probability, and partner_id (linked company) migrate directly. Stage maps to crm.stage via the stage configuration. Date_deadline migrates to crm.lead date_deadline. The user_id maps to res.users via the owner reconciliation phase. Odoo CRM's crm.opportunity kanban view and forecasting features become the primary pipeline management interface post-migration.
Unim
Webhook
Odoo CRM
Webhook (documented only)
1:1Webhook configurations in Unim are environment-level settings tied to that deployment's API and event model. They cannot be meaningfully exported and re-imported into Odoo CRM's webhook system, which uses different event types and payload schemas. We document active webhooks in the Unim instance as a written inventory for the customer's awareness and include Odoo CRM's webhooks documentation as a reference for the admin to rebuild post-migration.
| Unim | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Activity | mail.message1:1 | Fully supported | |
| Custom Field (Unim) | Custom Field (Odoo CRM)lossy | Fully supported | |
| Custom Object | Custom Model (ir.model)1:1 | Fully supported | |
| User/Owner | res.users1:1 | Fully supported | |
| File/Attachment | ir.attachment1:1 | Fully supported | |
| Tag/Label | res.partner.categorylossy | Fully supported | |
| Pipeline/Deal Stage | crm.stagelossy | Fully supported | |
| Lead/Prospect | crm.lead1:1 | Fully supported | |
| Opportunity | crm.opportunity1:1 | Fully supported | |
| Webhook | Webhook (documented only)1: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.
Unim gotchas
Every Unim instance has a unique custom field schema
Custom field datatypes require a separate lookup call
No public API documentation for the core business objects
File attachment extraction requires a separate Files API call
Owner/user IDs are instance-scoped and not portable
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
Schema discovery and datatype resolution
We introspect the live Unim deployment via the custom-fields API endpoint, enumerating every custom field, ModelID, DataType ID, and nullable flag. For each custom field, we call the valuelists endpoint to resolve the DataType reference. We also discover any bespoke entity types beyond the standard Contacts, Companies, and Activities triad. The discovery output is a written schema catalog and a migration map specifying which Unim custom fields map to Odoo CRM standard fields (name, email, phone, website) versus custom fields requiring Odoo Studio or custom module creation before data migration begins.
Object mapping and Odoo CRM schema preparation
We map Unim objects to Odoo CRM standard models: Contact and Company to res.partner (with is_company distinguished), Activities to mail.message, Prospects to crm.lead, and Opportunities to crm.opportunity. Custom fields discovered in Phase 1 are created in Odoo CRM via Studio or a custom module deployed to a staging instance first. We configure crm.stage pipeline values, res.partner.category tag taxonomy, and pre-load country and state data via ir.model.data records so that address fields validate at import time.
Sandbox migration and mapping validation
We run a full migration into an Odoo CRM staging environment using representative data volume. The customer's admin reviews the migrated records in the Odoo CRM UI, spot-checks field values against the Unim source, and validates that custom fields populated correctly on res.partner, crm.lead, and crm.opportunity records. Any mapping corrections (field type mismatches, missing DataType resolutions, stage name errors) are fixed in the migration tooling and re-validated before the production migration plan is finalized.
Owner reconciliation and user provisioning
We extract every distinct owner ID referenced across Unim contacts, companies, activities, and custom objects. We match each by email address against the destination Odoo CRM res.users table. Any Unim owner without a matching Odoo user is added to a reconciliation report with the owner's name, email, and record count for the customer's admin to provision the corresponding Odoo user. Migration cannot proceed to the res.partner or crm.lead import phases until owner resolution is complete because user_id is a required lookup on most CRM objects in Odoo CRM.
Production migration in dependency order
We run the production migration in record-dependency order: country and state data first, then res.partner (companies and contacts with parent_id resolved), then crm.lead (prospects), then crm.opportunity (opportunities with partner_id, stage_id, and user_id resolved). Activity history migrates via mail.message with res_model and res_id pointing to the target res.partner. File attachments run last after the res.partner graph is stable. Custom object entities run after standard objects because they may carry lookups to res.partner or crm.lead. Each phase emits a row-count reconciliation report; the next phase does not start until the previous phase's reconciliation passes.
Cutover, delta migration, and automation handoff
We freeze write access to the source Unim deployment at cutover, run a final delta migration to capture any records modified during the migration window, and enable Odoo CRM as the system of record. We deliver a written inventory of Unim webhooks and active application-level automations, documenting their trigger, conditions, and actions for the customer's Odoo admin to rebuild in Odoo Studio or via custom Python module. We support a one-week hypercare window to resolve reconciliation issues raised by the customer's team. Workflow rebuild, Studio customization, and admin training are outside standard migration scope and are documented as separate follow-on engagements.
Platform deep dives
Unim
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate CRM migration. 4 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Unim and Odoo CRM.
Object compatibility
4 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
Unim: Not publicly documented — confirmed during integration scoping..
Data volume sensitivity
Unim 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 Unim to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Unim 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 Unim
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.