CRM migration
Field-level mapping, validation, and rollback between Visual Practice and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Visual Practice
Source
Odoo CRM
Destination
Compatibility
13 of 13
objects map 1:1 between Visual Practice and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Visual Practice and Odoo CRM take different structural approaches to the lead-opportunity divide. Visual Practice typically stores leads and opportunities as separate objects; Odoo uses a single crm.lead model with a type field (lead or opportunity) to distinguish between them. Companies and individual contacts both live in Odoo's res.partner table, with commercial_partner_id linking individual contacts to their organization — a hierarchical pattern that differs from Visual Practice's typical flat company-contact relationship. Deals migrate into crm.lead records with type='opportunity' and stage_id assigned per Odoo's pipeline configuration. Custom fields require definition in Odoo's XML data files before records land, a step FlitStack handles as part of the schema preparation. We map standard contact fields (name, email, phone, address), company fields (name, website, industry, employee count), and deal fields (name, amount, stage, close date) directly. Non-standard fields and custom properties migrate as custom fields on the equivalent Odoo model. Activities (calls, emails, meetings, notes) attach to res.partner or crm.lead records with original timestamps and owners preserved. Owner resolution happens by email match against Odoo system users; unmatched owners are flagged before migration commits. FlitStack sequences the migration so parent companies exist before contacts, and contacts exist before opportunities — preventing foreign-key orphans. Workflows, automation rules, stage configurations, and custom Odoo modules cannot migrate and must be rebuilt post-migration. We export definitions as reference documents for your Odoo administrator.
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 Visual Practice 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.
Visual Practice
Contact
Odoo CRM
res.partner
1:1Individual contacts map directly to res.partner records. Odoo stores the contact type in the partner's type field ('contact' vs 'invoice' vs 'delivery'). Parent company link stored in commercial_partner_id or parent_id depending on whether the contact is an individual or organization.
Visual Practice
Company
Odoo CRM
res.partner (type='company')
1:1Companies map to res.partner records with type='company'. Odoo automatically links child contact partners to this record via parent_id. Website, industry, and employee-count fields migrate to the equivalent Odoo fields. Parent-company hierarchies in Visual Practice map to Odoo's parent_id chain. Additionally, any custom company-level attributes from Visual Practice (such as revenue tier or sector codes) are stored as custom fields on the res.partner record, ensuring data richness is preserved.
Visual Practice
Lead
Odoo CRM
crm.lead (type='lead')
1:1Visual Practice leads migrate as crm.lead records with type='lead'. Stage maps to stage_id from Odoo's crm.stage table for the assigned sales team. Lead scores, source information, and medium (phone, web, referral) map to custom fields or standard Odoo columns (source_id, medium_id).
Visual Practice
Opportunity / Deal
Odoo CRM
crm.lead (type='opportunity')
1:1Visual Practice opportunities and deals migrate as crm.lead records with type='opportunity'. The partner_id links to the corresponding res.partner record. Expected revenue maps to Odoo's planned_revenue field; closed revenue maps to 'Won' stage with date_closed timestamp. Any custom deal attributes (e.g., discount tier, product category, renewal flag) are preserved as custom fields on the crm.lead record, maintaining context for future pipeline analysis.
Visual Practice
Pipeline
Odoo CRM
crm.team + crm.stage
1:1Visual Practice pipelines do not map 1:1 to a single Odoo object. Each pipeline becomes an Odoo crm.team with its own crm.stage sequence. Teams with multiple pipelines in Visual Practice require multiple crm.team records in Odoo — each with a distinct stage configuration.
Visual Practice
Pipeline Stage
Odoo CRM
crm.stage
1:1Stage names map value-by-value to Odoo's crm.stage records, ordered per team. Probability values attached to each stage in Visual Practice are stored as custom fields in Odoo since probability is computed dynamically in Odoo from historical win rates. Stage-entered timestamps are preserved as a custom datetime field.
Visual Practice
Custom Field (on Contact)
Odoo CRM
Custom ir.model.data field on res.partner
1:1Visual Practice custom contact properties require definition as custom fields on res.partner in Odoo — typically via an XML data file in a custom module. Field type (char, selection, float, date) maps to the corresponding Odoo field definition. FlitStack delivers the field definitions alongside the migration so they exist before data lands.
Visual Practice
Custom Field (on Deal)
Odoo CRM
Custom ir.model.data field on crm.lead
1:1Deal-level custom fields from Visual Practice (discount tier, product category, renewal flag) require definition as custom fields on crm.lead. Type-aware mapping preserves pick-list values as Odoo selection fields and numeric fields as float or monetary depending on the source type.
Visual Practice
Activity (Call, Email, Meeting)
Odoo CRM
mail.activity + mail.message
1:1Logged calls and emails from Visual Practice become mail.activity records attached to res.partner or crm.lead. Meetings map to mail.activity with activity_type_id set to 'Meeting'. Original timestamps, owners (user_id), and subject lines are preserved. Odoo's chatter widget surfaces these on the partner or lead form.
Visual Practice
Note
Odoo CRM
mail.message (note subtype)
1:1Visual Practice notes migrate as mail.message records with subtype='mt_note', keeping body text, create date, and author preserved. Notes attached to specific records are linked via res_model and res_id references so they appear in Odoo's chatter thread. If Visual Practice notes include tags or categories, these are stored as a custom many2many field on the mail.message record to preserve categorization.
Visual Practice
Attachment / File
Odoo CRM
ir.attachment
1:1File attachments from Visual Practice re-upload to Odoo's ir.attachment table with the correct res_model and res_id linking them to the parent partner or lead. Odoo's attachment storage (database or filestore) is configurable — we match the destination's current storage setting.
Visual Practice
User / Owner
Odoo CRM
res.users
1:1Visual Practice owner IDs resolve by email match against Odoo's res.users table. Unmatched owners are flagged before migration; records can be assigned to a fallback Odoo user or held for manual assignment. This prevents orphaned crm.lead records with no user_id in Odoo.
Visual Practice
Tag / Label
Odoo CRM
crm.tag
1:1Visual Practice contact or deal tags map to Odoo's crm.tag model. Tags are many2many fields on crm.lead. If tag names conflict with existing Odoo tags, FlitStack merges or renames them based on a deduplication rule agreed upon before migration. The resulting tag set is applied to all relevant crm.lead records, ensuring that pipeline reporting and segmentation remain accurate after migration.
| Visual Practice | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (type='company')1:1 | Fully supported | |
| Lead | crm.lead (type='lead')1:1 | Fully supported | |
| Opportunity / Deal | crm.lead (type='opportunity')1:1 | Fully supported | |
| Pipeline | crm.team + crm.stage1:1 | Fully supported | |
| Pipeline Stage | crm.stage1:1 | Fully supported | |
| Custom Field (on Contact) | Custom ir.model.data field on res.partner1:1 | Fully supported | |
| Custom Field (on Deal) | Custom ir.model.data field on crm.lead1:1 | Fully supported | |
| Activity (Call, Email, Meeting) | mail.activity + mail.message1:1 | Fully supported | |
| Note | mail.message (note subtype)1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| User / Owner | res.users1:1 | Fully supported | |
| Tag / Label | crm.tag1: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.
Visual Practice gotchas
Clinical imaging files require coordinated binary extraction
Electronic claims data has retention and HIPAA constraints
Specialty module data varies by deployment
Integrations with imaging hardware require per-device confirmation
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
Audit Visual Practice data model and define Odoo schema
FlitStack extracts the full list of Visual Practice objects, custom fields, and their data types. We cross-reference these against Odoo's crm.lead, res.partner, and crm.team models. Custom fields that have no Odoo equivalent are flagged for custom field definition. We deliver a schema checklist: which Odoo custom fields to create, which crm.team records to set up, and which crm.stage sequences to configure per team. Your Odoo administrator completes the setup before the migration run.
Resolve owner records by email match
Visual Practice owner IDs are matched against Odoo's res.users table by email address. Any Visual Practice owner with an email address not present in Odoo is flagged as an unresolved user. Your team either invites those users to Odoo before migration or provides a fallback Odoo user for reassignment. No crm.lead record migrates without a resolved user_id — preventing orphaned records with no assigned sales rep.
Sequence data import: companies → contacts → leads → opportunities → activities
Odoo's foreign-key constraints require companies (res.partner, type='company') to exist before individual contacts, and contacts to exist before opportunities that link to them. FlitStack sequences the migration in dependency order: all company partners first, then individual contacts with parent_id resolved, then crm.lead records with partner_id and user_id resolved, then mail.activity and mail.message records attached to the correct res_model and res_id. This ordering prevents validation errors and orphaned activity records.
Run sample migration with field-level diff
A representative slice of 100–500 records migrates first, spanning companies, contacts, leads, opportunities, and activities. FlitStack generates a field-level diff report comparing source values against Odoo destination values for every mapped field. You review the diff to confirm stage mapping, owner resolution, custom field population, and partner deduplication decisions before the full run commits. The report highlights any missing fields, mismatched data types, or truncated values, allowing you to adjust field mappings or data transformation rules before the final migration run. This early validation reduces risk of data loss or integrity issues.
Execute full migration with delta-pickup window
The full dataset migrates in batched API calls respecting Odoo's transaction limits. During and after the migration, a delta-pickup window (24–48 hours) captures records created or modified in Visual Practice while the migration was running. FlitStack produces a reconciliation report listing record counts per object, any remaining unmatched owners, and a delta diff so you can confirm what was captured in the final sync before cutting over.
Platform deep dives
Visual Practice
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 Visual Practice 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
Visual Practice: Not publicly documented.
Data volume sensitivity
Visual Practice 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 Visual Practice to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Visual Practice 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 Visual Practice
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.