CRM migration
Field-level mapping, validation, and rollback between Unanet CRM by Cosential and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Unanet CRM by Cosential
Source
Odoo CRM
Destination
Compatibility
10 of 10
objects map 1:1 between Unanet CRM by Cosential and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Unanet CRM by Cosential organizes AEC relationship data around a three-tier hierarchy: Company → Personnel → Contact, with Opportunities attached to Companies and Activities linked across all three. Its Compass v2 OpenAPI exposes contacts, companies, opportunities, activities, and custom objects, but the API requires basic-auth credentials plus an API key and firm access code per request. Odoo CRM models the same relationship graph using res.partner for both companies and contacts (with company_id on contacts for the hierarchy), crm.lead for opportunities, and crm.activity for logged tasks. The key translation challenge is flattening Unanet's Company-Personnel-Contact model into Odoo's flat res.partner structure — personnel records become contacts with a company_id reference, and Unanet's multiple-contact-per-company pattern maps directly to Odoo's N:1 partner hierarchy. Pipeline stages in Unanet migrate to crm.stage records scoped per team, with probability and sequence values re-applied manually in Odoo's Pipeline configuration. Custom fields in Unanet require Odoo developer-mode field creation and may need a custom module depending on your Odoo edition. FlitStack sequences the migration as: Companies → Contacts/Personnel → Opportunities → Activities, using XML-RPC calls against your Odoo instance with email-matched owner resolution. A 24–48 hour delta window captures in-flight changes during cutover so no opportunity stage-change is lost between the migration snapshot and go-live.
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 Unanet CRM by Cosential 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.
Unanet CRM by Cosential
Company
Odoo CRM
res.partner
1:1Unanet Company maps to Odoo res.partner with is_company=True. Unanet's parent/child company hierarchy maps to the parent_id field on res.partner. When a Unanet company has no parent, parent_id stays empty in Odoo. The company_name field maps to Odoo's name; display_name is derived automatically.
Unanet CRM by Cosential
Personnel
Odoo CRM
res.partner
1:1Unanet Personnel records are internal staff who may also be contacts. In Odoo, they become res.partner records with company_id set to their associated firm. If the Personnel record has a contact email, it also appears in Odoo as a contact under that company. Active/inactive status on the Personnel record maps to Odoo's active boolean.
Unanet CRM by Cosential
Contact
Odoo CRM
res.partner
1:1Unanet Contact maps directly to Odoo res.partner with is_company=False. The contact's email, phone, title, and address fields map to their Odoo equivalents. If the Unanet Contact has no associated company, the contact lands in Odoo as a standalone partner with company_id empty — your team assigns it to a company record post-migration if needed.
Unanet CRM by Cosential
Opportunity
Odoo CRM
crm.lead
1:1Unanet Opportunity maps to Odoo crm.lead. The opportunity name, expected revenue (amount), and close date map to name, planned_revenue, and date_deadline respectively. The pipeline stage in Unanet maps to stage_id in Odoo via a value-mapping table built from your Unanet stage labels. If the Opportunity is linked to a Company in Unanet, the resulting crm.lead gets partner_id set to that company partner record.
Unanet CRM by Cosential
Pipeline
Odoo CRM
crm.stage
1:1Unanet Pipelines are collections of stages. Each pipeline in Unanet becomes a separate crm.stage group in Odoo scoped by team_id. Stage sequence numbers map to the sequence field on crm.stage. Probability per stage is re-applied in Odoo's stage configuration. If your Odoo deployment has only one sales team, all stages land under that team; multiple teams require stage scoping during field mapping setup.
Unanet CRM by Cosential
Activity (calls, emails, tasks)
Odoo CRM
crm.activity / mail.message
1:1Unanet logged activities (calls, emails, meetings) map to Odoo crm.activity records linked to crm.lead. The activity type, subject, date, and user assignment carry over. Odoo's crm.activity model stores activity_type_id, note (body), date, and user_id. Original timestamps are preserved. Meeting activities from Unanet with start/end times map to Odoo's mail.activity with a duration field populated from the Unanet duration field.
Unanet CRM by Cosential
Attachment / File
Odoo CRM
ir.attachment
1:1Unanet file attachments on Companies, Contacts, and Opportunities re-upload to Odoo ir.attachment records linked to the corresponding res.partner or crm.lead via res_model and res_id. Files are stored in Odoo's filestore; original filenames and MIME types are preserved. Large files (over 25MB in Odoo Community on-premise) may require filestore size configuration before the migration run.
Unanet CRM by Cosential
Custom Object
Odoo CRM
ir.model.data / custom res.partner record
1:1Unanet custom objects — such as Project History, Certifications, or Qualifications — map to Odoo custom fields on res.partner or crm.lead if the schema is simple. For complex multi-field custom objects, we create a dedicated custom model in Odoo developer mode and build a junction table linking the custom object to the parent CRM record. Odoo Community supports custom models; the __manifest__.py module declaration is required.
Unanet CRM by Cosential
Custom Property (contact/company/opportunity)
Odoo CRM
ir.model.fields (custom field)
1:1Unanet stores custom properties as dynamic key-value pairs per object. These map to Odoo custom fields (ir.model.fields with module='__custom__') created in developer mode. Each custom property becomes a field with a type determined by the value datatype (char → char, number → float, pick-list → selection, date → date). Fields are added to the appropriate Odoo model before migration so the import pipeline knows where to write them.
Unanet CRM by Cosential
User / Owner
Odoo CRM
res.users
1:1Unanet owner assignments on records resolve by email match against Odoo res.users. FlitStack flags any Unanet owner whose email has no corresponding Odoo user before migration commits. Unmatched owners receive a fallback assignment to a designated admin user, with the original owner email preserved in a custom field (original_owner_email__c) for manual reassignment post-migration.
| Unanet CRM by Cosential | Odoo CRM | Compatibility | |
|---|---|---|---|
| Company | res.partner1:1 | Fully supported | |
| Personnel | res.partner1:1 | Fully supported | |
| Contact | res.partner1:1 | Fully supported | |
| Opportunity | crm.lead1:1 | Fully supported | |
| Pipeline | crm.stage1:1 | Fully supported | |
| Activity (calls, emails, tasks) | crm.activity / mail.message1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| Custom Object | ir.model.data / custom res.partner record1:1 | Fully supported | |
| Custom Property (contact/company/opportunity) | ir.model.fields (custom field)1:1 | Fully supported | |
| User / Owner | res.users1: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.
Unanet CRM by Cosential gotchas
Non-standard object names block naive field mapping
API requires Enterprise License agreement
Duplicate contact risk on bulk imports
Custom fields require manual schema enumeration
Proposal templates carry template logic, not just data
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
Ingest Unanet data via Compass API with schema audit
FlitStack authenticates against the Unanet Compass API using the firm access code and API key, then pulls all Companies, Personnel, Contacts, Opportunities, and Activities in a single schema-discovery pass. We also export any custom properties attached to each object. The ingestion step produces a data dictionary showing every field present in your Unanet instance — including fields that exist in the API but are empty for most records — so nothing is missed. If your Compass API credentials are not yet available, we use the CSV export as a fallback and note which relationship fields are unavailable in that export mode.
Build the Odoo custom-field module and resolve owner mappings
Before any data is written to Odoo, FlitStack creates a lightweight custom module (flitstack_cosential_import) that declares every Unanet custom property as an ir.model.fields record on the target Odoo model. This ensures Odoo accepts the incoming field values at import time. In parallel, we match every Unanet owner (user_id) to an Odoo res.users record by email. Owners with no Odoo match are flagged with a pre-migration report; your team either creates the Odoo user or designates a fallback owner before the migration run. No record lands without a valid user_id or an explicit fallback.
Sequence the import: Companies → Personnel → Contacts → Opportunities → Activities
Odoo requires parent records to exist before child records reference them via a many2one field. We sequence the migration as: Companies (res.partner with is_company=True), then Personnel (res.partner with company_id set), then Contacts that are not Personnel, then Opportunities (crm.lead with partner_id set), then Activities (crm.activity linked to the crm.lead). Unanet company hierarchies (parent/child) are resolved by processing parent companies before their children. The Personnel-to-company dependency chain is resolved in a dependency sort before any write. This ordering prevents orphaned records and ensures that crm.lead.partner_id points to a valid res.partner record.
Run a sample migration with field-level diff and stage-mapping validation
A representative slice of 100–500 records spanning all object types migrates first. FlitStack generates a field-level diff comparing the source Unanet values against the destination Odoo fields after transformation. Key checks include: custom field values landed in the correct Odoo field, stage_id corresponds to the correct crm.team scope, company_id links are valid on all contacts, owner resolution produced a user_id or fallback, and original timestamps are preserved in the custom audit fields. You review the diff report and approve before the full migration run commits.
Execute full migration with delta-pickup and rollback readiness
The full migration reads from Unanet Compass API and writes to Odoo via XML-RPC in batched transactions. A delta-pickup window opens at migration start and closes 24–48 hours after the final batch lands in Odoo, capturing any records modified or created in Unanet during cutover. All operations are logged to an audit table in Odoo. If reconciliation fails — e.g., record counts do not match or a custom field batch has a data-type conflict — one-click rollback reverts the Odoo database to its pre-migration snapshot. Rollback is available for 72 hours post-migration.
Platform deep dives
Unanet CRM by Cosential
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Unanet CRM by Cosential and Odoo CRM.
Object compatibility
1 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
Unanet CRM by Cosential: Not publicly documented.
Data volume sensitivity
Unanet CRM by Cosential 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 Unanet CRM by Cosential to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Unanet CRM by Cosential 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 Unanet CRM by Cosential
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.