CRM migration

Migrate from Unanet CRM by Cosential to Odoo CRM

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 logo

Unanet CRM by Cosential

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

10 of 10

objects map 1:1 between Unanet CRM by Cosential and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Unanet CRM by Cosential logo

Unanet CRM by Cosential

What's pushing teams away

  • Account Planning feature remains weak despite repeated user requests, leaving Business Development teams unsupported in long-term account strategy.
  • Navigation is widely criticized — convoluted search, hard-to-find dashboards, and a steep learning curve frustrate new users.
  • Double data entry is required in some workflows, particularly when integrating with financial systems or proposal tools outside the core CRM.
  • The interface is described as dated and clunky compared to modern CRM alternatives, affecting daily user experience.
  • Users report that the platform can be slow to load dashboards and reports, especially with large datasets accumulated over years.

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 Unanet CRM by Cosential objects map to Odoo CRM

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

maps to

Odoo CRM

res.partner

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

res.partner

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

res.partner

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

crm.lead

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

crm.stage

1:1
Fully supported

Unanet 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)

maps to

Odoo CRM

crm.activity / mail.message

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

ir.model.data / custom res.partner record

1:1
Fully supported

Unanet 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)

maps to

Odoo CRM

ir.model.fields (custom field)

1:1
Fully supported

Unanet 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

maps to

Odoo CRM

res.users

1:1
Fully supported

Unanet 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.

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.

Unanet CRM by Cosential logo

Unanet CRM by Cosential gotchas

High

Non-standard object names block naive field mapping

High

API requires Enterprise License agreement

Medium

Duplicate contact risk on bulk imports

Medium

Custom fields require manual schema enumeration

Low

Proposal templates carry template logic, not just data

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

  • Personnel records require a two-pass import to resolve company_id on contacts

    Unanet's Company → Personnel → Contact structure means a Contact in Unanet may belong to a Personnel record, which belongs to a Company. In Odoo, contacts have a direct company_id link — there is no Personnel intermediary. FlitStack resolves Personnel → Company first, writing the res.partner company record, then imports Personnel as contacts with company_id set, then imports Contacts that are not Personnel. If your Unanet data has contacts at both the Personnel level and the direct Company level, the import order matters: importing contacts before their parent company is written results in orphaned records with a null company_id. We flag any such dependency chains before committing the import order and surface them in the pre-migration plan.

  • Custom fields in Odoo Community require developer mode or a custom module manifest

    Unanet custom properties are schema-flexible and stored as key-value pairs per object. Odoo's custom field model requires a custom module (with an __manifest__.py) to persist field definitions in a way that survives version upgrades. FlitStack creates a lightweight custom module (flitstack_cosential_import) with ir.model.fields declarations for each custom property discovered in your Unanet export. If you are on Odoo Community without access to a developer, this module must be installed by a user with technical (developer) access. Enterprise edition users can create fields directly in Settings > Technical > Database Structure > Fields without a module, but the field definitions still require admin-level access. We document every custom field created so your Odoo admin can audit them post-migration.

  • Unanet's proposal automation has no Odoo equivalent and must be rebuilt

    Unanet's Publisher module is a core differentiator for AEC firms — it auto-populates Word and PDF proposals from CRM fields (project history, personnel qualifications, resumes, project profiles). Odoo has no native proposal-from-CRM-population feature. Quotations in Odoo (sale.order) pull from the product catalog, not from CRM relationship data. FlitStack migrates all proposal-attached data (contacts, companies, opportunity fields) to Odoo fields, but the Publisher template logic — including conditional field insertion, document layout, and digital signature routing — must be rebuilt using Odoo's template engine (mail.template) or a third-party document automation tool. We export your Unanet Publisher templates as a PDF reference package for your Odoo admin to rebuild.

  • Odoo pipeline stages are scoped by team; Unanet pipelines are global

    In Unanet, a pipeline's stages are global within the account — any user can assign any stage from any pipeline to an opportunity. In Odoo, crm.stage records are scoped to a crm.team. If you have multiple pipelines in Unanet that share a stage name (e.g., 'Qualification' exists in Pipeline A and Pipeline B), those become separate stage records in Odoo, each scoped to a different team. When a crm.lead is imported, its stage_id must correspond to the team_id set on the lead. Mismatched team/stage combinations cause the lead to appear in the wrong pipeline view in Odoo's Kanban. FlitStack builds a stage-mapping table per team before import and validates team_id + stage_id consistency for every opportunity row.

  • Compass API requires basic-auth credentials that must be sourced from Unanet support

    Unanet's Compass API uses basic access authentication (username/password) plus two required headers: x-compass-firm-id and x-compass-api-key. The API key is not visible in the Unanet UI — it must be requested from Unanet support or your account manager. The firm access code (x-compass-firm-id) likewise comes from account provisioning. If either credential is unavailable or the API agreement has lapsed, the migration must fall back to Unanet's CSV export feature (available per-module from the UI), which does not capture all fields or relationship data. We recommend requesting API credentials at the start of the project. If API access is not available, FlitStack documents which fields fall back to CSV export and which relationships require post-migration manual reconciliation.

Migration approach

Six steps for a successful Unanet CRM by Cosential to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Context on both ends of the pair

Unanet CRM by Cosential logo

Unanet CRM by Cosential

Source

Strengths

  • Deep AEC-native data model purpose-built for project-based relationship tracking and proposal generation
  • Proposal automation directly integrated with CRM data, eliminating manual re-entry for qualification packages
  • Strong company-association model handles multi-role contacts and firm hierarchy within a single object structure
  • Reputation and track record with 1,000+ AEC firms over 20+ years provides industry credibility
  • Comprehensive Microsoft Outlook integration and mobile app support field teams working on projects

Weaknesses

  • Non-standard field names and AEC-specific object names require significant field-level mapping work
  • Account Planning feature is consistently under-developed and a pain point for Business Development teams
  • Navigation and search are widely criticized as convoluted, suggesting a dated UX
  • Custom fields are not fully documented in the public API schema, making discovery a manual process
  • Pricing starts at $50/user/month with significant implementation costs, making it expensive for smaller AEC firms
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. 1 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 Unanet CRM by Cosential and Odoo CRM.

  • Object compatibility

    B

    1 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

    Unanet CRM by Cosential: Not publicly documented.

  • Data volume sensitivity

    B

    Unanet CRM by Cosential doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Unanet CRM by Cosential 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 Unanet CRM by Cosential to Odoo CRM data migrations

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

Can't find your answer?

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 consultation

A typical Unanet to Odoo migration for under 50,000 total records (contacts, companies, opportunities, activities) completes in 48–72 hours of migration clock time. The longest planning step is building the company-personnel-contact import sequence and configuring the custom-field module for your Odoo edition. For AEC firms with 500,000+ records or complex custom-object hierarchies, allow 5–10 days including the sample migration, stakeholder review, and delta-pickup window. Setup of the Odoo custom-field module by your admin can happen in parallel before the migration engine runs.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Unanet CRM by Cosential.
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