CRM migration
Field-level mapping, validation, and rollback between User.com and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
User.com
Source
Odoo CRM
Destination
Compatibility
7 of 12
objects map 1:1 between User.com and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from User.com to Odoo CRM is a shift from a contact-centric marketing CRM to a modular ERP ecosystem where CRM is one of over fifty integrated applications. User.com treats every record with an email, phone, or chat interaction as a billable Contact; Odoo separates unqualified prospects into crm.lead and qualified relationships into res.partner with an Account counterpart. We resolve that structural split during scoping, map User.com's Companies to Odoo res.partner records with the is_company flag set, and preserve all deal, event, and activity timestamps in Odoo's UTC-converted datetime fields. Automation workflows, email templates, and campaign history do not migrate — User.com's automation sequences are not accessible via documented API and Odoo's automation architecture (Server Actions, Automated Actions, CRM Leads) is fundamentally different. We deliver a written automation inventory and a field-mapping document so the customer's admin rebuilds workflows in Odoo Studio post-migration.
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 User.com 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.
User.com
Contact (User)
Odoo CRM
crm.lead or res.partner
1:manyUser.com Contacts map to Odoo via a split: Contacts with active deal association or company link become Odoo crm.lead records that sales reps convert to crm.opportunity (and ultimately res.partner). Cold prospects with no deal history remain as Odoo crm.lead for follow-up routing. We use the User.com contact's last_heard timestamp and any deal association as the split determinant. Email address becomes crm.lead.email_from or res.partner.email; phone becomes phone; tags map to Odoo tag_ids on crm.lead.
User.com
Company
Odoo CRM
res.partner (is_company=True)
1:1User.com Companies map directly to Odoo res.partner with the is_company flag set to True and the company_type field set to company. The company name becomes res.partner.name, domain becomes website, address fields map to street, street2, city, state_id, zip, and country_id. We link the company's associated Contacts as individual res.partner records with parent_id pointing to the company record, preserving the User.com contact-to-company relationship in Odoo's partner hierarchy.
User.com
Deal
Odoo CRM
crm.opportunity
1:1User.com Deals map to Odoo crm.opportunity. The dealstage property maps to Odoo's stage_id with the stage name and probability preserved. Deal value maps to Odoo's expected_revenue and planned_revenue fields. We map deal owners to Odoo res.users by email lookup, and preserve custom deal fields as Odoo custom Char, Float, or Selection fields on crm.opportunity before import. User.com's deal-contact and deal-company associations map to crm.opportunity.partner_id and the Odoo lead-contact link respectively.
User.com
Event
Odoo CRM
calendar.event
1:1User.com Events (calendar/activity events) map to Odoo calendar.event with name, start_datetime, stop_datetime, duration, and location preserved. We resolve attendee emails against the migrated res.partner and crm.lead records to populate calendar.event.partner_ids. Event-type attributes from User.com map to a custom description field on the calendar event. DateTime values are converted from User.com's ISO 8601 export to UTC for Odoo's datetime storage.
User.com
Activity
Odoo CRM
mail.activity
1:1User.com Activities map to Odoo mail.activity records linked to the parent res.partner or crm.lead record. Activity type (call, email, meeting, task, note) maps to Odoo's activity_type_id. We preserve activity date, summary, and note body as mail.activity's date_deadline, summary, and note fields. Email opens, chat sessions, and push notification metadata are mapped to a custom description field because Odoo mail.activity has a richer type taxonomy than User.com's activity export.
User.com
Custom Properties (Contact)
Odoo CRM
Custom Fields on res.partner
lossyUser.com contact custom properties map to Odoo res.partner custom fields created via Settings > Technical > Database Structure > Custom Fields before migration. Selection and multi-selection properties map to Odoo Selection and Many2many fields respectively; date properties map to Date; text properties to Char or Text depending on length. Choice fields that used {} brackets in User.com's late-2023 export are normalized to plain string values before insert. The customer must pre-create the custom field schema in Odoo or authorize FlitStack AI to create fields via the XML data file import path.
User.com
Custom Properties (Deal)
Odoo CRM
Custom Fields on crm.opportunity
lossyUser.com deal custom fields map to Odoo crm.opportunity custom fields using the same type-mapped approach as contact custom properties. We detect any JSON-typed custom properties in the User.com export and flatten them into Char fields with the JSON string preserved for downstream parsing. Custom fields that reference User.com contact IDs are flagged for cross-record resolution after the contact migration phase.
User.com
Tag
Odoo CRM
crm.tag
1:1User.com Tags on contacts and deals map to Odoo crm.tag records via the tag_ids many2many relationship on crm.lead and crm.opportunity. We extract the distinct tag set from User.com, create matching crm.tag records in Odoo, and build the many2many relation table entries during import. Tags used for segmentation purposes in User.com are preserved as tag assignments even though Odoo's dynamic segment evaluation is a separate feature that must be rebuilt.
User.com
Segment
Odoo CRM
crm.tag + ir.filters
lossyUser.com Segments are dynamic groups based on contact attributes. We export segment membership (the static list of contact IDs that matched each segment at migration time) and map those IDs to crm.tag records labeled with the segment name. Odoo's ir.filters provides saved filter views that approximate segment behavior; we document the attribute criteria for each User.com segment as Odoo domain expressions for the customer's admin to create as ir.filters post-migration.
User.com
Live Chat / Conversation
Odoo CRM
mail.message on res.partner
1:1User.com conversation threads and chat transcripts export as bundled records that we flatten and re-associate to individual res.partner records in Odoo. Each message becomes a mail.message record with message_type = comment, posted to the partner's Odoo chatter (mail.thread) using the partner_id as res_id. Message timestamp, sender, and body content are preserved; attachments in the chat export map to Odoo ir.attachment records linked via the relation field.
User.com
Web Push Subscription
Odoo CRM
Custom Field (not migrated as native object)
lossyWeb push subscriptions in User.com trigger the contact-based billing count but have no native Odoo equivalent. We export the push subscription attribute as a custom field push_opt_in__c on res.partner and flag it for the customer's admin to configure a marketing integration (Odoo Email Marketing or a third-party push service) if needed. This avoids accidentally re-creating push-active contacts that would inflate the User.com bill during the transition window.
User.com
Owner (User)
Odoo CRM
res.users
1:1User.com Owners referenced on Contacts, Companies, Deals, and Activities map to Odoo res.users by email match. We extract the full owner roster from User.com, match each email against the destination Odoo instance's res.users table, and hold any unmatched owners in a reconciliation queue for the customer's Odoo admin to provision before record import resumes. Owner references on deals and activities are resolved at migration time using the validated User-to-res.users map.
| User.com | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact (User) | crm.lead or res.partner1:many | Fully supported | |
| Company | res.partner (is_company=True)1:1 | Fully supported | |
| Deal | crm.opportunity1:1 | Fully supported | |
| Event | calendar.event1:1 | Fully supported | |
| Activity | mail.activity1:1 | Fully supported | |
| Custom Properties (Contact) | Custom Fields on res.partnerlossy | Fully supported | |
| Custom Properties (Deal) | Custom Fields on crm.opportunitylossy | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| Segment | crm.tag + ir.filterslossy | Fully supported | |
| Live Chat / Conversation | mail.message on res.partner1:1 | Fully supported | |
| Web Push Subscription | Custom Field (not migrated as native object)lossy | Fully supported | |
| Owner (User) | 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.
User.com gotchas
Contact-based billing catches more records than expected
Automation workflows are not exportable
Bool and DateTime export format changes break naive imports
Email templates and campaign history are inaccessible
Database size shown in-app updates only every 24 hours
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 destination environment selection
We audit the source User.com account across custom properties, deal pipelines, event types, activity types, owner roster, tag set, segment definitions, and contact count profile. We pair this with a destination Odoo environment decision: Odoo Standard ($31.10/user/month on Odoo.sh) for teams wanting managed hosting with support, or Odoo Community (free, self-hosted) for teams with data-residency requirements or existing Odoo infrastructure. The discovery output is a written migration scope, an Odoo environment recommendation, and the preliminary contact-to-Lead/Partner split rule based on deal association and company link patterns.
Schema design and custom field provisioning
We design the destination schema in the Odoo environment. This includes creating custom fields on res.partner (for contact custom properties), crm.lead (for lead-specific custom fields), and crm.opportunity (for deal custom fields). We map User.com tag names to Odoo crm.tag records and define the tag_ids many2many relationship. We configure crm.lead stage names and probabilities to match the User.com dealstage labels, and set up crm.opportunity stage probabilities for each deal pipeline. If Odoo Community is the destination, we generate the custom field XML definitions for deployment before data import begins.
Data normalization and transform build
We apply normalization transforms to the User.com export before Odoo import: Bool fields ('f'/'t' → True/False), DateTime values (ISO 8601 → Odoo UTC format), Choice fields ({} bracket removal), and JSON value unwrapping. We apply the Lead-Contact split rule to the contact export, producing two subsets: records destined for crm.lead and records destined for res.partner with the company parent_id resolved. We build the cross-record lookup resolution map (contact-to-company, deal-to-contact, activity-to-contact) in preparation for Odoo's external-id-based XML import or CSV import path.
Owner and user reconciliation
We extract every distinct User.com owner referenced on Contacts, Companies, Deals, Events, and Activities and match by email against the destination Odoo res.users table. Owners without a matching Odoo User go to a reconciliation queue for the customer's Odoo admin to provision before record import resumes. This step must complete before any record import because OwnerID references are required on crm.lead, crm.opportunity, and calendar.event in Odoo.
Production migration in dependency order
We run production migration in record-dependency order: crm.tag records first (tags are referenced by many2many), res.partner records for companies (is_company=True, parent_id=None), res.partner records for individual contacts (linked to company via parent_id), crm.lead records (unqualified prospects), crm.opportunity records (converted from User.com deals with partner_id and user_id resolved), calendar.event records (with partner_ids resolved), mail.activity records (linked to parent res.partner or crm.lead), and mail.message records from chat transcripts (posted to partner chatter). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation rebuild handoff
We freeze User.com writes during cutover, run a final delta migration of any records modified during the migration window, then set Odoo as the system of record. We validate 25-50 spot-checked records against the User.com source across each object type, confirm deal stage distribution matches, and verify calendar event attendee counts. We deliver the automation inventory document with User.com automation logic mapped to Odoo Automated Action domain expressions. We support a one-week hypercare window for reconciliation issues raised by the customer's sales and marketing teams. We do not rebuild User.com automations as Odoo Automated Actions inside the migration scope; that is a separate engagement.
Platform deep dives
User.com
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 User.com 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
User.com: Not publicly documented.
Data volume sensitivity
User.com 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 User.com to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your User.com 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 User.com
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.