CRM migration

Migrate from Visual Practice to Odoo CRM

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 logo

Visual Practice

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

13 of 13

objects map 1:1 between Visual Practice and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Visual Practice logo

Visual Practice

What's pushing teams away

  • Pricing is sales-led with no public tier table, making procurement comparison against mainstream dental PMS (Dentrix, Eaglesoft, Open Dental) opaque.
  • Limited public review and community footprint outside dental marketplace listings.
  • API documentation is not publicly published, limiting custom integration options without vendor engagement.
  • Imaging modality coverage requires confirmation per practice — not all 3D scanners, intraoral sensors, and X-ray sources may have native bridges.
  • Cloud-native architecture may not suit practices with strict on-premise data residency requirements (less common in dentistry but exists in some jurisdictions).

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 Visual Practice objects map to Odoo CRM

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

maps to

Odoo CRM

res.partner

1:1
Fully supported

Individual 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

maps to

Odoo CRM

res.partner (type='company')

1:1
Fully supported

Companies 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

maps to

Odoo CRM

crm.lead (type='lead')

1:1
Fully supported

Visual 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

maps to

Odoo CRM

crm.lead (type='opportunity')

1:1
Fully supported

Visual 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

maps to

Odoo CRM

crm.team + crm.stage

1:1
Fully supported

Visual 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

maps to

Odoo CRM

crm.stage

1:1
Fully supported

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

maps to

Odoo CRM

Custom ir.model.data field on res.partner

1:1
Fully supported

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

maps to

Odoo CRM

Custom ir.model.data field on crm.lead

1:1
Fully supported

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

maps to

Odoo CRM

mail.activity + mail.message

1:1
Fully supported

Logged 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

maps to

Odoo CRM

mail.message (note subtype)

1:1
Fully supported

Visual 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

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

File 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

maps to

Odoo CRM

res.users

1:1
Fully supported

Visual 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

maps to

Odoo CRM

crm.tag

1:1
Fully supported

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

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.

Visual Practice logo

Visual Practice gotchas

High

Clinical imaging files require coordinated binary extraction

High

Electronic claims data has retention and HIPAA constraints

Medium

Specialty module data varies by deployment

Medium

Integrations with imaging hardware require per-device confirmation

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

  • crm.lead type discriminator vs separate lead/opportunity objects

    Visual Practice typically stores leads and opportunities as separate object types. Odoo collapses both into a single crm.lead model where type='lead' or type='opportunity' acts as a discriminator. Stage history for converted opportunities is not natively preserved in Odoo — when a Visual Practice deal has multiple stage transitions, only the final stage name and timestamp migrate unless stage-history records are created as custom audit entries. FlitStack maps the lead to crm.lead with type='lead' and the opportunity to crm.lead with type='opportunity', preserving the current stage and a stage-history custom field for reporting continuity.

  • Custom fields require XML module definition before data lands

    Odoo does not support ad-hoc custom fields through the UI alone for most data models — custom fields on crm.lead and res.partner must be defined in an XML data file within a custom module. This is a structural step that must complete before bulk migration, not after. Visual Practice setups with 15+ custom fields require FlitStack to deliver a module skeleton with field definitions alongside the migration plan. If the custom module is not installed and the fields do not exist in the database, the migration API call will reject the records with a validation error. We surface this requirement in the pre-migration schema checklist so Odoo is ready before data moves.

  • Stage configuration is team-scoped and recreated manually

    Visual Practice pipeline stages with custom names, colors, and probabilities do not export as a portable schema. Odoo's crm.stage records are created per crm.team and configured directly in the kanban view — there is no native import mechanism for stage definitions. Teams with four Visual Practice pipelines end up with four Odoo crm.team records, each needing manual stage setup. FlitStack generates a stage-mapping specification document listing every source stage, its probability, its sequence order, and which Odoo team it belongs to, so the Odoo admin can recreate the configuration before the migration run.

  • Partner deduplication risk with N:N contact-company associations

    Visual Practice may allow a contact to associate with multiple companies (N:N). Odoo's res.partner model supports only a single parent_id for individual contacts — the company they work for. When a Visual Practice contact has multiple associated companies, FlitStack selects the primary company by most-recent activity or by a rule you specify, and surfaces the additional company associations as a custom many2many tag on the res.partner record. This is a data-shape decision that your team should confirm before migration.

  • API rate limits and Community edition constraints

    Odoo Community's XML-RPC API is available but the Custom plan unlocks external API access without per-request throttling. Community edition on Odoo Online also imposes request-frequency limits. For migrations exceeding 50,000 records, FlitStack uses batched write calls with retry logic and respects Odoo's transaction size limits. We confirm the destination Odoo plan type before choosing the API strategy — Enterprise and Custom plans allow higher throughput than Community Online. Additionally, Odoo Community on-premise deployments have no request-frequency cap, making bulk migrations faster when hosted locally.

Migration approach

Six steps for a successful Visual Practice to Odoo CRM data migration

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

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

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

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

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

Context on both ends of the pair

Visual Practice logo

Visual Practice

Source

Strengths

  • Cross-platform support across PC, Mac, and web browser.
  • Broad feature footprint covering clinical, financial, and marketing workflows.
  • Specialty modules for multi-specialty group practices.
  • Cloud imaging bridges reduce need for separate PACS.
  • Procedure-triggered reputation surveys for patient acquisition.

Weaknesses

  • Pricing is sales-led with no public tiers.
  • Limited public review and community footprint.
  • API documentation not publicly published.
  • Imaging hardware compatibility requires per-device confirmation.
  • Cloud-only architecture may not suit on-premise residency requirements.
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 Visual Practice 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

    Visual Practice: Not publicly documented.

  • Data volume sensitivity

    B

    Visual Practice doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Visual Practice 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 Visual Practice to Odoo CRM data migrations

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

Can't find your answer?

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 consultation

Most Visual Practice to Odoo CRM migrations complete within 48–72 hours for under 50,000 records. Larger datasets with 200,000+ records, multiple custom fields, or multi-team pipeline configurations extend to 5–10 days. The longest phase is typically schema setup — defining custom fields in Odoo's XML module structure and configuring crm.team + crm.stage per pipeline. Record migration itself runs in hours; pre-migration planning takes days.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Visual Practice.
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