CRM migration
Field-level mapping, validation, and rollback between VAIL-CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
VAIL-CRM
Source
Odoo CRM
Destination
Compatibility
11 of 14
objects map 1:1 between VAIL-CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from VAIL-CRM to Odoo CRM is an extraction-and-reconstruction migration. VAIL-CRM organizes customer data across three active modules—sales force automation, marketing automation, and service automation—that may not all be in use in every instance, so we identify which modules are active before scoping the extraction. VAIL-CRM has no publicly documented API, which means we must confirm bulk export capabilities with Velosi directly before committing to an automated approach; CSV export with manual field validation is the fallback where API access is restricted. We map VAIL-CRM Companies to Odoo Partner records, Deals to Odoo CRM Lead records with stage mapping, and Activities to Odoo communication records. Custom fields added to standard objects in VAIL-CRM require individual field-type mapping against Odoo's ir.model.data schema before migration. Odoo is an all-in-one ERP with CRM as one of over 50 integrated apps, so teams migrating from VAIL-CRM typically evaluate Odoo for its modular breadth, open-source licensing model, and lower total cost of ownership versus point-solution CRMs with separate billing for each module. We do not migrate automation workflows, marketing campaigns, or service desk configurations as functional code; we deliver a written inventory of these for the customer's admin to rebuild in Odoo's Action Rules and Studio.
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 VAIL-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.
VAIL-CRM
Contact
Odoo CRM
res.partner
1:1VAIL-CRM Contact records map to Odoo res.partner with contact=True. Standard fields (name, email, phone, mobile, website, street, city, state, country) map directly to Odoo partner fields. Social media identifiers from VAIL-CRM (LinkedIn, Twitter handles) migrate to res.partner custom fields or the contact's user-defined fields. The partner_type flag (company vs individual) is set based on whether VAIL-CRM records are linked to a Company or are standalone individual contacts.
VAIL-CRM
Company
Odoo CRM
res.partner (company type)
1:1VAIL-CRM Company records map to Odoo res.partner with company_type='company'. Address fields (street, city, state, country, zip) migrate to the partner address fields. Website from VAIL-CRM becomes the partner website field and is used as the dedupe key during import. We create the company partner record before any child contact import so that the child contact's parent_id reference is satisfied at insert time.
VAIL-CRM
Contact-Company relationship
Odoo CRM
res.partner child contacts
1:1VAIL-CRM's contact-company linking is preserved by setting the child contact's parent_id to the matching company partner record. We match on company name or VAIL-CRM company ID. If the same person appears as a contact under multiple companies in VAIL-CRM, we create multiple partner records in Odoo with separate parent_id relationships rather than collapsing them, since Odoo supports multi-company contact affiliations through the contact_is_company flag.
VAIL-CRM
Deal
Odoo CRM
crm.lead
1:1VAIL-CRM Deals map to Odoo crm.lead with type='opportunity'. Deal name becomes crm.lead name, deal amount becomes expected_revenue, close date becomes date_deadline, and the VAIL-CRM pipeline stage name maps to an Odoo CRM Stage ID. We extract the full stage probability percentage from VAIL-CRM and configure a corresponding stage in Odoo's CRM Stage management with the probability value set.
VAIL-CRM
Deal Stage
Odoo CRM
crm.stage
lossyVAIL-CRM pipeline stages (names, sequence order, probability weights) are extracted during discovery and pre-configured in Odoo as crm.stage records within the relevant crm.team. Each stage probability migrates as the stage's probability percentage. The Odoo Stages must exist in the destination before Deal migration begins, or all Deals will land in the default stage.
VAIL-CRM
Pipeline
Odoo CRM
crm.team
lossyVAIL-CRM custom pipeline configurations map to Odoo crm.team records. Where multiple VAIL-CRM pipelines exist (one per line of business or product), we create one crm.team in Odoo per pipeline, assign the team members, and map the pipeline's stages to that team's stage configuration. crm.team members map to Odoo res.users via email match.
VAIL-CRM
Activity: Call
Odoo CRM
crm.phonecall
1:1VAIL-CRM call activity records (from the service automation or activity history) map to Odoo crm.phonecall with name, duration (in minutes), date, user_id (owner), and notes. Call disposition values from VAIL-CRM map to crm.phonecall tag or a custom selection field. The phonecall is linked to the related partner or lead via the crm.phonecall model references.
VAIL-CRM
Activity: Email
Odoo CRM
mail.message
1:1VAIL-CRM email engagement records migrate to Odoo mail.message records linked to the corresponding crm.lead or res.partner. Email body content, sender, recipient, and timestamp migrate to mail.message fields. Attachments migrate as ir.attachment records linked via mail.message.attachments. Email threading is preserved by matching on the message-id header if available.
VAIL-CRM
Activity: Meeting
Odoo CRM
calendar.event
1:1VAIL-CRM meeting records map to Odoo calendar.event with name, start_datetime, stop_datetime, location, and description. Attendees migrate as calendar.event attendee records (res.partner records linked via calendar.attendee). Meeting organizer maps to res.users via email match. All-day meetings set allday=True with date instead of datetime.
VAIL-CRM
Activity: Note
Odoo CRM
Note
1:1VAIL-CRM notes attached to Contacts, Companies, or Deals migrate to Odoo note records on the respective model. Note body, author, and creation date migrate. Notes linked to a Deal that maps to a crm.lead attach to the lead; notes linked to a Contact attach to the res.partner record. The note's create_date is preserved for timeline ordering.
VAIL-CRM
Marketing Automation: Campaign
Odoo CRM
utm.campaign
1:1VAIL-CRM marketing automation campaign records map to Odoo utm.campaign records, which serve as the tracking source for all marketing activities in Odoo. Campaign name, start date, and end date migrate. Note that VAIL-CRM marketing automation workflows (triggers, conditions, actions) do not migrate as code; we deliver a written inventory of each campaign's workflow logic for the customer's admin to rebuild using Odoo's Marketing app Action Rules or external automation tools.
VAIL-CRM
Service Automation: Ticket
Odoo CRM
helpdesk.ticket
1:1VAIL-CRM service automation tickets map to Odoo helpdesk.ticket records when the Helpdesk app is installed in the destination Odoo instance. Ticket subject, description, status, priority, and assignment migrate. VAIL-CRM custom ticket field configurations (priority tiers, category fields, resolution notes) map to Odoo helpdesk.ticket custom fields pre-created during schema setup. If the destination Odoo does not include the Helpdesk app, tickets are mapped to crm.lead notes as a fallback.
VAIL-CRM
Custom Fields
Odoo CRM
ir.model.data (custom fields)
lossyVAIL-CRM custom fields on any standard object (Contact, Company, Deal, Activity) are extracted during discovery with their field type, required status, and picklist values. We pre-create each custom field as an Odoo ir.model.data field before data migration begins, using the matching Odoo field type (char, selection, many2one, etc.). Picklist values migrate as selection options or many2many tags depending on whether the field is single-select or multi-select in VAIL-CRM.
VAIL-CRM
Owner
Odoo CRM
res.users
1:1VAIL-CRM owner assignments on Contacts, Companies, Deals, and Activities map to Odoo res.users by email match. We extract all distinct owner email addresses from VAIL-CRM records and match them against the destination Odoo user list. Any owner without a matching Odoo user goes to a reconciliation queue for the customer's admin to provision the user before record migration continues. Owner assignments on Deals map to crm.lead user_id; owner assignments on Contacts map to res.partner user_id.
| VAIL-CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Contact-Company relationship | res.partner child contacts1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Deal Stage | crm.stagelossy | Fully supported | |
| Pipeline | crm.teamlossy | Fully supported | |
| Activity: Call | crm.phonecall1:1 | Fully supported | |
| Activity: Email | mail.message1:1 | Fully supported | |
| Activity: Meeting | calendar.event1:1 | Fully supported | |
| Activity: Note | Note1:1 | Fully supported | |
| Marketing Automation: Campaign | utm.campaign1:1 | Fully supported | |
| Service Automation: Ticket | helpdesk.ticket1:1 | Fully supported | |
| Custom Fields | ir.model.data (custom fields)lossy | Mapping required | |
| Owner | 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.
VAIL-CRM gotchas
Limited public API documentation requires direct inquiry with Velosi for export capabilities
Multi-module data isolation requires identifying which components are active
CRM migration complexity underestimated without discovery phase
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
Multi-module discovery and extraction capability confirmation
We audit the VAIL-CRM instance to identify which modules are active (sales force automation, marketing automation, service automation, or a combination) and confirm bulk export capabilities with Velosi Software directly. We extract the custom field schema for each active module, including field type, required status, and picklist values. We also extract the full pipeline definition (stage names, sequence, probability weights) and the distinct owner list with email addresses. This discovery output forms the migration scope document and the baseline for estimating record volume per object type.
Odoo target configuration and custom field schema creation
We confirm the Odoo edition, version, and hosting model with the customer. We then install the required Odoo apps (CRM, Helpdesk if applicable, Marketing if applicable) and create the custom field schema against the destination Odoo database using Odoo Studio or the metadata API. This includes creating any custom fields on res.partner and crm.lead that correspond to VAIL-CRM custom fields. We configure the CRM stages and crm.teams based on the extracted VAIL-CRM pipeline definition, and pre-create the utm.campaign records for marketing automation data.
Test migration to Odoo staging environment
We run a full migration into the customer's Odoo staging environment (Odoo.sh staging database or a sandbox copy) using a representative subset of records from each active VAIL-CRM module. The customer's admin reviews 25-50 randomly sampled records per object type against the source system, checks that stage mappings are correct, and validates that custom field values appear as expected. Any field mapping corrections, custom field additions, or stage configuration changes happen at this stage before production migration begins.
Owner and user reconciliation
We extract every distinct owner referenced on Contacts, Companies, Deals, and Activity records and match by email against the destination Odoo org's res.users table. Owners without a matching Odoo user go to a reconciliation queue. The customer's admin provisions any missing users in Odoo. Migration cannot proceed past record insertion because user_id and partner_id references must be satisfied at insert time. This step is a gate: no production data loads until owner reconciliation is complete.
Production migration in dependency order
We run production migration in record-dependency order: company Partner records first, then child Contact Partner records with parent_id resolved, then crm.lead records from Deals with stage and user_id resolved, then crm.phonecall, calendar.event, and mail.message records for activity history, then utm.campaign for marketing data, then helpdesk.ticket for service data. Each phase emits a row-count reconciliation report comparing source record count to destination record count before the next phase begins. We use Odoo's XML-RPC API with batch chunking and rate-limit handling for all insertions.
Cutover, delta sync, and automation rebuild handoff
We freeze VAIL-CRM writes during cutover and run a final delta migration of any records modified during the migration window. We then enable Odoo as the system of record. We deliver a written inventory of every active VAIL-CRM marketing automation workflow, service automation rule, and any custom automation with its trigger, conditions, and actions, plus a recommended Odoo equivalent using Action Rules, Studio automations, or Odoo.sh Git-based workflow triggers. We do not rebuild VAIL-CRM automation logic as Odoo automation code inside the migration scope; that is a separate engagement. We offer a one-week hypercare window for reconciliation issues raised during the first week of live use.
Platform deep dives
VAIL-CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 VAIL-CRM and Odoo CRM.
Object compatibility
2 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
VAIL-CRM: Not publicly documented.
Data volume sensitivity
VAIL-CRM 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 VAIL-CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your VAIL-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 VAIL-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.