CRM migration
Field-level mapping, validation, and rollback between UPNIFY CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
UPNIFY CRM
Source
Odoo CRM
Destination
Compatibility
11 of 14
objects map 1:1 between UPNIFY CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from UPNIFY CRM to Odoo CRM is a structural migration from a LATAM-focused sales-first CRM into an open-source ERP suite with a native CRM module. UPNIFY stores Contacts as Clients, Companies as a distinct B2B object, and Opportunities tied to pipeline stages with a separate Quotation sub-object carrying multi-currency metadata. Odoo consolidates Companies and Contacts into a single res.partner model with an is_company flag, and uses crm.lead for both Leads and Opportunities with a type field to distinguish them. We resolve that structural difference during scoping, flatten multi-currency Quotation exchange-rate metadata before import, and sequence data loads in dependency order (Users, then Companies, then Clients, then Opportunities, then Activity history) so that foreign-key lookups resolve at insert time. Workflows, WhatsApp Connect conversation bundles, and Flow prepaid task volumes do not migrate; we deliver a written map of every automation requiring rebuild in Odoo Studio and a WhatsApp integration plan for the Odoo WhatsApp gateway if conversation continuity is required.
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 UPNIFY CRM 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.
UPNIFY CRM
Client
Odoo CRM
Contact (res.partner)
1:1UPNIFY Client records map to Odoo res.partner with is_company=False. Standard fields (name, email, phone, mobile) migrate 1:1. Custom client fields map as ir.model.fields with the corresponding field type (char, integer, float, selection). We sequence the Client import after Company import so that the parent_id foreign key resolves to the correct res.partner record if the client is attached to a company. Spanish-first field names in UPNIFY API responses are normalized to English equivalents during the transform step.
UPNIFY CRM
Company
Odoo CRM
Account (res.partner with is_company=True)
1:1UPNIFY Company records map to Odoo res.partner with is_company=True. This is the first object we import in the dependency chain because both Clients and Opportunities reference Company records via parent_id. Company name, website, industry, and address fields migrate 1:1. The parent-child linkage between Company and Client is preserved by resolving Company IDs during the Client import phase.
UPNIFY CRM
Opportunity
Odoo CRM
Opportunity (crm.lead with type=opportunity)
1:1UPNIFY Opportunities map to Odoo crm.lead with type='opportunity'. Stage names from UPNIFY map to Odoo stage_id via a customer-supplied stage mapping document. The probability field migrates from UPNIFY's stage percentage to Odoo's probability on the stage record. Company linkage migrates as partner_id with parent_id pointing to the res.partner record created from the Company object. Owner assignment maps by email to the Odoo res.users record.
UPNIFY CRM
Prospect
Odoo CRM
Lead (crm.lead with type=lead)
1:1UPNIFY Prospects map to Odoo crm.lead with type='lead'. Lifecycle stage values that indicate pre-qualified status (such as nuevo, contactado) are preserved in a custom field for audit. Prospect records that represent the same entity as a migrated Opportunity are flagged for manual merge during UAT so that the customer decides which record to retain.
UPNIFY CRM
Quotation
Odoo CRM
Sale Order (sale.order)
1:1UPNIFY Quotations map to Odoo sale.order. The multi-currency metadata (embedded exchange rate, currency code) is flattened into a standard price field during the transform step by applying the recorded exchange rate to the quoted amount. We preserve the original currency and exchange rate in custom fields quotation_currency_id and quotation_exchange_rate for audit. sale.order is created before sale.order.line so that the order_id foreign key resolves correctly.
UPNIFY CRM
Quotation Line Item
Odoo CRM
Sale Order Line (sale.order.line)
1:manyEach line item on a UPNIFY Quotation (product, quantity, unit price, discount) maps to a separate sale.order.line record linked to the parent sale.order. Product resolution uses SKU matching against the product.product table; if no match is found, the line is created with product_id=False and a description-only fallback for the customer's admin to resolve post-migration.
UPNIFY CRM
Product (Catalog)
Odoo CRM
Product (product.product)
1:1UPNIFY Products from Catalogs map to Odoo product.product. Fields migrate include name, default_code (SKU), list_price, and description. Stock quantity data is not consistently populated in UPNIFY and is flagged as not migrated; the customer's inventory team populates stock levels post-migration through the Odoo Inventory module.
UPNIFY CRM
Goal
Odoo CRM
Custom Target (crm.target)
lossyUPNIFY Goals (team or user-level sales targets with period and target value) map to a custom crm.target model that we create during schema setup if it does not already exist in the destination Odoo database. Goal owner maps by email to res.users. The period field is preserved as a date range. Odoo does not have a native Goals object; this is a configuration-based mapping requiring custom model creation before import.
UPNIFY CRM
Calendar (Tasks and Reminders)
Odoo CRM
Event (calendar.event) and Task (project.task)
1:1UPNIFY Calendar entries (tasks, reminders, appointments) map to Odoo calendar.event for time-bound activities and project.task for action items. The decision between event and task is based on whether the UPNIFY entry has a start and end time (event) or a due date only (task). Task status (completed vs open) migrates as state on project.task. Owner assignment resolves by email to res.users.
UPNIFY CRM
Tag Segmentation
Odoo CRM
Tag (crm.tag)
1:1Tags applied across UPNIFY Clients, Companies, and Opportunities migrate to Odoo crm.tag records. The tag assignment per object is reconstructed using crm.lead.tag.rel for Opportunities and a custom ir.model.data reference for partner tags. We preserve the tag name and color if populated in UPNIFY.
UPNIFY CRM
Custom Field
Odoo CRM
Custom Field (ir.model.fields)
lossyUPNIFY custom fields on Clients, Companies, and Opportunities are pre-created in Odoo as ir.model.fields before any data import begins. Field types (char, integer, float, date, selection) map to equivalent Odoo field classes. Dropdown fields in UPNIFY become selection fields in Odoo with the same option values. Type mismatches are flagged during scoping for customer decision on normalization.
UPNIFY CRM
User
Odoo CRM
User (res.users)
1:1UPNIFY Users are mapped by email address to Odoo res.users. Active vs inactive status is preserved. Role and permission sets do not migrate because Odoo's access control groups (Sales / User: All Records, Sales / User: Own Records) differ from UPNIFY's role model. The customer's Odoo administrator reassigns group memberships post-migration. We hold any HubSpot Owner without a matching Odoo User in a reconciliation queue.
UPNIFY CRM
Engagement: Email, Call, Meeting, Note
Odoo CRM
Activity (mail.message, calendar.event, project.task)
1:1UPNIFY engagement history (email, call, meeting, note) maps to Odoo's mail.message and calendar.event objects. Emails and calls become mail.message records linked to the parent crm.lead or res.partner via model and res_id. Meetings become calendar.event with start_datetime and stop_datetime preserved. Notes become mail.message with subtype='comment'. Activity date ordering is preserved by setting create_date to the original UPNIFY timestamp. Task engagements map to project.task with Status and ActivityDate preserved.
UPNIFY CRM
WhatsApp Connect Conversation Bundle
Odoo CRM
Not migrated
1:1UPNIFY Connect (WhatsApp conversation bundles, priced separately at approximately $449 for Connect 5K as a one-time credit pack) stores conversation history in a separate data store from the CRM contact record. Most destination CRMs, including Odoo, cannot ingest the WhatsApp message thread format natively. We assess whether to export the conversation history as a structured archive for the customer's records or treat it as export-only with no import into Odoo. This is disclosed during scoping and the customer makes the call before migration begins.
| UPNIFY CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Client | Contact (res.partner)1:1 | Fully supported | |
| Company | Account (res.partner with is_company=True)1:1 | Fully supported | |
| Opportunity | Opportunity (crm.lead with type=opportunity)1:1 | Fully supported | |
| Prospect | Lead (crm.lead with type=lead)1:1 | Fully supported | |
| Quotation | Sale Order (sale.order)1:1 | Fully supported | |
| Quotation Line Item | Sale Order Line (sale.order.line)1:many | Fully supported | |
| Product (Catalog) | Product (product.product)1:1 | Fully supported | |
| Goal | Custom Target (crm.target)lossy | Fully supported | |
| Calendar (Tasks and Reminders) | Event (calendar.event) and Task (project.task)1:1 | Fully supported | |
| Tag Segmentation | Tag (crm.tag)1:1 | Fully supported | |
| Custom Field | Custom Field (ir.model.fields)lossy | Fully supported | |
| User | User (res.users)1:1 | Fully supported | |
| Engagement: Email, Call, Meeting, Note | Activity (mail.message, calendar.event, project.task)1:1 | Fully supported | |
| WhatsApp Connect Conversation Bundle | Not migrated1: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.
UPNIFY CRM gotchas
No month-to-month billing — annual or semi-annual commitment required upfront
WhatsApp conversation bundles are priced separately and use a credit model
MAX suite pricing bundles four products — CRM seat count affects total cost
Flow task automation uses a prepaid volume model distinct from seat-based billing
API documentation is not publicly exposed at a developer portal
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 contract alignment
We audit the source UPNIFY account across plan tier (Basic/Pro/MAX), active object counts (Clients, Companies, Opportunities, Prospects, Quotations, Products, Goals), custom field inventory, active tag lists, and engagement volume. We confirm the customer's UPNIFY contract end date and billing cycle to identify the dual-platform cost window. We also assess whether WhatsApp Connect conversations are in active use and whether the customer wants them archived or migrated. The discovery output is a written migration scope document with record counts per object and a recommended go-live date aligned to the contract timeline.
Destination Odoo schema setup
We create the Odoo destination schema before any data import. This includes provisioning custom crm.target model for Goals, pre-creating all custom fields on res.partner and crm.lead via ir.model.fields with type-matched field classes, configuring crm.lead stage pipeline with customer-supplied stage name mapping, setting up crm.tag records matching the source tag inventory, and creating product.product records for Products. Schema is deployed into a staging Odoo database (same version as production) for validation before production migration begins.
Multi-currency transform and quotation flattening
We process all UPNIFY Quotations through a transform step that extracts the embedded exchange-rate metadata, applies the recorded rate to each line item amount, and produces a flat price record with Odoo-compatible currency_id assignment. The original exchange rate is preserved in a custom field for audit. Quotation line items are split into individual sale.order.line records with order_id references resolved at transform time. We validate total line item amounts against the quotation total before generating the sale.order import file.
Staging migration and reconciliation
We run a full migration into the staging Odoo database. The customer reconciles record counts per object, spot-checks 20-30 records per object against the UPNIFY source, validates the Quotation pricing accuracy for multi-currency records, and signs off on the schema and mapping before production migration begins. Any Quotation price discrepancies, custom field mismatches, or tag assignment errors are corrected in the transform logic before the production run. WhatsApp conversation export is confirmed as archive-only or migrated at this stage.
Production migration in dependency order
We run production migration in strict record-dependency order: res.users (provisioned manually and validated), res.partner with is_company=True (Companies), res.partner with is_company=False (Clients with parent_id resolved to Company records), crm.lead type=lead (Prospects), crm.lead type=opportunity (Opportunities with partner_id, stage_id, and user_id resolved), product.product (Products), sale.order (Quotations with currency flattened), sale.order.line (Quotation line items), crm.tag and tag assignments, calendar.event and project.task (Activity history via mail.message), and crm.target (Goals). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation rebuild handoff
We freeze UPNIFY writes during cutover, run a final delta migration of records modified during the migration window, then enable Odoo as the system of record. We deliver a written inventory of every UPNIFY Workflow and Flow automation with its trigger, conditions, and recommended Odoo Studio equivalent. WhatsApp Connect conversation export is delivered as a structured archive with contact linkage. We support a one-week hypercare window for reconciliation issues. Workflow rebuilds in Odoo Studio and WhatsApp gateway configuration are outside standard migration scope and are handled as a separate engagement.
Platform deep dives
UPNIFY CRM
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 UPNIFY CRM 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
UPNIFY CRM: Not publicly documented.
Data volume sensitivity
UPNIFY CRM exposes a bulk API — large-volume migrations stream efficiently.
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 UPNIFY CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your UPNIFY CRM 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 UPNIFY CRM
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.