CRM migration
Field-level mapping, validation, and rollback between TeamWave and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
TeamWave
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between TeamWave and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from TeamWave to Odoo CRM is a transition from a thin-API all-in-one suite to an open-source ERP platform where the CRM module is one app among dozens. TeamWave provides no documented public API, so all extraction relies on CSV exports from the web interface. We script repeated UI exports for large datasets, cross-reference embedded foreign keys to reconstruct Deal-to-Contact and Task-to-Project relationships, and load everything into Odoo via XML-RPC in dependency order. Odoo splits unqualified prospects into crm.lead and qualified buyers into res.partner; we resolve this split during scoping using TeamWave's lifecycle stage property. Projects and Tasks do not map to Odoo CRM objects directly — they belong to Odoo Project — so we deliver a project-structure manifest for the customer's Odoo administrator to configure post-migration. We do not migrate Workflows, automations, or forms as code; we inventory them in writing for manual rebuild.
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 TeamWave 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.
TeamWave
Contact
Odoo CRM
crm.lead or res.partner (split required)
1:manyTeamWave Contacts with lifecycle stage indicating a qualified prospect or customer (Stage = Customer, Evangelist, or other post-sale state) map to Odoo res.partner. Contacts with lifecycle stage = Lead, Subscriber, or Marketing Qualified map to Odoo crm.lead. We compute the split using TeamWave's lifecycle_stage export field, create crm.lead records for unqualified prospects and res.partner records for qualified contacts, and preserve the original TeamWave lifecycle stage as a custom Char field tw_original_lifecycle__c on both record types for audit.
TeamWave
Company
Odoo CRM
res.partner (company type)
1:1TeamWave Company records map to Odoo res.partner with is_company = True. The company name, domain, website, and address fields migrate directly. We create the Company partner record before any Contact import so that the child_contact.parent_id foreign key is satisfied at insert time. TeamWave's company_id foreign key on Contact is preserved as a cross-reference column in the migration manifest.
TeamWave
Deal
Odoo CRM
crm.lead
1:1TeamWave Deals map to Odoo crm.lead records. The dealstage property maps to crm.lead stage_id (a Many2one to crm.stage). Pipeline assignment maps to crm.lead.team_id, which we pre-create in Odoo during schema setup. Deal value maps to crm.lead.planned_revenue, and expected close date maps to crm.lead.date_deadline. Closed-Won and Closed-Lost reasons from custom TeamWave fields become crm.lead.lost_reason if the Odoo version supports it, or a custom Char field tw_lost_reason__c.
TeamWave
Deal Stage
Odoo CRM
crm.stage
lossyTeamWave pipeline stages are extracted from the Deal export and mapped to crm.stage records within the target CRM team. We configure stage names, sequence order, and probability percentages (probability field) in Odoo before Deals are loaded. For Odoo versions 14 and above, the kanban_color field on stage is also migrated if TeamWave uses pipeline color coding.
TeamWave
Project
Odoo CRM
project.project (separate app)
1:1TeamWave Project records do not map to Odoo CRM objects; they belong to the Odoo Project app, which is a separate installation and licensing scope. We transfer project records as a structured manifest (project name, client association, start/end dates, status, and description) for the customer's Odoo administrator to create project.project records post-migration. The TeamWave project_id foreign key on Task is preserved in the manifest for reassignment in Odoo Project.
TeamWave
Task
Odoo CRM
project.task (separate app)
1:1TeamWave Tasks linked to Projects map to Odoo project.task records. Tasks linked to Contacts or Deals without a Project map to crm.lead activity records (crm.activity) or project.task with project_id left null, depending on the customer's Odoo setup. Assignee (hubspot_owner_id equivalent) resolves via email match to res.users.
TeamWave
User / Team Member
Odoo CRM
res.users
1:1TeamWave User records (name, email, role, department) map to Odoo res.users. We match by email address during migration. Any TeamWave Owner referenced on a Deal or Contact without a matching Odoo User is placed in a reconciliation queue for the customer's admin to provision before the import resumes. Active/inactive status in TeamWave maps to Odoo active = True/False.
TeamWave
Calendar Event
Odoo CRM
calendar.event
1:1TeamWave Calendar Events (event title, date/time, linked entity type and ID, attendees) map to Odoo calendar.event records. We resolve the linked entity reference (Deal, Project, or Contact) to the migrated Odoo crm.lead.id or res.partner.id and set calendar.event.res_id and res_model accordingly. Attendees migrate as calendar.attendee records linked to the event.
TeamWave
HR Record / Employee
Odoo CRM
res.partner (internal) or hr.employee
1:1TeamWave employee records map to Odoo hr.employee if the Odoo HR app is installed, or to res.partner records with internal = True if only CRM is deployed. Name, role, department, and contact information migrate directly. If the customer runs TeamWave HR alongside CRM and moves only CRM to Odoo, we recommend a separate HR migration engagement for the Odoo HR app scope.
TeamWave
Custom Field (Contacts, Deals)
Odoo CRM
ir.model.fields (custom)
lossyTeamWave custom fields on Contacts and Deals are exported alongside standard fields. We create matching custom fields in Odoo via the Settings > Technical > Custom Fields interface (or programmatically via XML data migration) before loading data. Char, Integer, Float, Date, and Selection field types migrate directly; multi-select and complex custom field types require case-by-case review during scoping.
TeamWave
Attachment Metadata
Odoo CRM
ir.attachment (re-upload manifest)
1:1TeamWave stores attachments linked to Contacts, Deals, and Projects but provides no bulk download mechanism. We extract attachment metadata (filename, size, linked object type, and TeamWave record ID) and produce a re-upload manifest. The customer manually downloads from TeamWave and re-uploads to Odoo ir.attachment records linked to the migrated res.partner or crm.lead. Binary attachment files do not migrate programmatically.
TeamWave
Tag
Odoo CRM
crm.tag
1:1TeamWave tags on Contacts and Deals migrate to Odoo crm.tag records via crm.lead.tag_ids (many2many). Tags used for content classification or project categorization are separated from CRM tags and listed in the project-structure manifest for Odoo Project tag configuration.
| TeamWave | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | crm.lead or res.partner (split required)1:many | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Deal Stage | crm.stagelossy | Fully supported | |
| Project | project.project (separate app)1:1 | Fully supported | |
| Task | project.task (separate app)1:1 | Fully supported | |
| User / Team Member | res.users1:1 | Fully supported | |
| Calendar Event | calendar.event1:1 | Fully supported | |
| HR Record / Employee | res.partner (internal) or hr.employee1:1 | Fully supported | |
| Custom Field (Contacts, Deals) | ir.model.fields (custom)lossy | Fully supported | |
| Attachment Metadata | ir.attachment (re-upload manifest)1:1 | Fully supported | |
| Tag | 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.
TeamWave gotchas
No publicly documented API endpoint surface
Attachment export requires manual re-upload
Free tier enforces feature caps that affect migration scope
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 CSV export scoping
We audit the TeamWave workspace across all active modules (CRM, Projects, Tasks, HR, Calendar) and estimate the total record count per object. We identify the number of CSV export batches required based on TeamWave's UI pagination limits, script the export automation, and validate record counts against what TeamWave's UI displays. We also extract custom field definitions from the TeamWave export headers to map against Odoo's schema during step 2.
Odoo schema pre-deployment
We deploy the destination Odoo schema before any data migration begins. This includes creating custom fields on crm.lead and res.partner, configuring crm.lead teams (crm.team), defining crm.stage records matching the TeamWave pipeline stages with probability percentages, and creating the project.project structure manifest for the project app scope. Schema is deployed in a staging Odoo database first for validation.
Relationship reconstruction from CSV
Since TeamWave CSV exports do not include explicit foreign key IDs in all views, we cross-reference embedded IDs from exported columns (company_id, project_id, contact_id) to reconstruct the relationship graph. We produce a denormalized intermediate dataset that preserves the source object linkages before mapping to Odoo's normalized schema. Owner assignments resolve by email match against the res.users table we have access to during migration.
Sandbox migration and reconciliation
We run a full migration into an Odoo test database (or sandbox if the customer uses Odoo Online with a sandbox environment). The customer reconciles record counts, spot-checks 25-50 records against the TeamWave source, and reviews the custom field values and partner associations before signing off on the mapping. Any schema corrections are applied before production migration begins.
Production migration in dependency order
We load data into the production Odoo instance in record-dependency order: res.users (owner resolution), res.partner company records first, res.partner contact records with parent_id resolved, crm.lead records with team_id and stage_id resolved, crm.tag records, calendar.event and calendar.attendee records, and custom field values on all migrated objects. Each phase emits a row-count reconciliation report. We use Odoo XML-RPC with batch chunking and retry logic for transient API errors.
Cutover, validation, and deliverable handoff
We freeze TeamWave write access during cutover, run a final delta migration for any records modified during the migration window, then enable Odoo as the system of record. We deliver the project-structure manifest for Odoo Project app configuration, the attachment re-upload manifest, and the automation inventory document listing every TeamWave workflow or automation that requires manual rebuild in Odoo. We support a five-business-day hypercare window for reconciliation issues.
Platform deep dives
TeamWave
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 TeamWave 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
TeamWave: Not publicly documented.
Data volume sensitivity
TeamWave 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 TeamWave to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your TeamWave 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 TeamWave
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.