CRM migration
Field-level mapping, validation, and rollback between Teamwork CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Teamwork CRM
Source
Odoo CRM
Destination
Compatibility
6 of 12
objects map 1:1 between Teamwork CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Teamwork CRM to Odoo CRM is a platform-family migration that requires remapping the object hierarchy at the schema level. Teamwork CRM uses Companies and Contacts as the foundational pair with separate Leads and Opportunities pipelines; Odoo uses a Lead object (crm.lead) that converts into an Opportunity within a Sales Team, with Partner (res.partner) serving as both person and organization records under a single model. We sequence the migration with Companies before Contacts, preserve stage names and probability weights across the pipeline split, and pre-create Odoo custom fields before import so that Teamwork's text, integer, and dropdown custom fields land in the correct Odoo field types. The Teamwork API enforces a 120 req/min ceiling, and the platform has no bulk import endpoint — we handle rate-limit backoff and batch extraction from list view throughout. Workflows, automation rules, and custom filters are out of scope; we deliver a written inventory for the customer's Odoo admin to rebuild in Odoo's Studio and automated-actions builder 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 Teamwork 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.
Teamwork CRM
Contact
Odoo CRM
Partner (res.partner)
1:1Teamwork CRM Contacts map to Odoo Partner records with is_company=False. The Partner record inherits the contact name, email, phone, and address fields directly. We resolve the parent Company by matching the Teamwork Contact's companyId against the previously migrated Company Partner with is_company=True, then set parent_id on the Contact Partner. Tag names from Teamwork migrate to critical field on the Partner record. Active/inactive status maps to active boolean in Odoo.
Teamwork CRM
Company
Odoo CRM
Partner (res.partner, is_company=True)
1:1Teamwork CRM Companies map to Odoo Partner records with is_company=True. We migrate company name, domain/website, industry, phone, address, and any custom Company fields as Odoo Partner fields or pre-created custom fields on res.partner. Companies are loaded first in the migration sequence so that parent_id references on Contact Partner records are satisfied at the time of Contact insert.
Teamwork CRM
Lead
Odoo CRM
Lead (crm.lead)
1:1Teamwork CRM Leads map directly to Odoo crm.lead records. The Teamwork Lead's stage name, probability weight, assigned owner (mapped to Odoo res.users by email), and any custom Lead fields migrate. We preserve lead source and lead score if the customer has those fields configured. The Teamwork Leads pipeline becomes an Odoo Sales Team with a dedicated stage sequence. If the customer runs separate Leads and Opportunities pipelines simultaneously, we map each to its own Sales Team in Odoo.
Teamwork CRM
Opportunity
Odoo CRM
Lead (crm.lead, stage = opportunity stage)
1:manyTeamwork CRM Opportunities are distinct records in a separate pipeline from Leads. In Odoo, Opportunities are crm.lead records at an advanced pipeline stage rather than a separate object type. We map each Teamwork Opportunity to a crm.lead record in the corresponding Odoo Sales Team pipeline, preserving the deal name, monetary value, probability, close date, and stage label. The stage-to-Sales-Team mapping is defined during scoping so that each Teamwork pipeline resolves to a named Odoo Sales Team and stage order.
Teamwork CRM
Pipeline
Odoo CRM
Sales Team (crm.team)
lossyEach named Teamwork CRM pipeline becomes an Odoo Sales Team. Odoo Sales Teams group leads by sales unit and provide team-level assignment rules and dashboards. We configure the team name, member list (from Odoo res.users mapped from Teamwork owners), and team-specific stage sequence. Stage order within each team maps from Teamwork's pipeline stage configuration.
Teamwork CRM
Pipeline Stage
Odoo CRM
Stage (crm.stage within crm.team)
lossyTeamwork CRM pipeline stages (with custom names, sort order, and probability percentages) map to Odoo crm.stage records scoped to the relevant Sales Team. Probability percentages migrate to the stage's projected_revenue percentage field in Odoo. Stage name, sequence, and fold (whether the stage collapses in the Kanban view) are configured. We flag any deprecated or inactive Teamwork stages that the customer wishes to archive rather than import.
Teamwork CRM
Custom Fields
Odoo CRM
Custom Fields (ir.model.fields)
lossyTeamwork CRM supports custom fields of type short text, integer, and dropdown only. We pre-create equivalent Odoo custom fields on the target model (res.partner for contact/company fields, crm.lead for deal fields) before any data import. Text custom fields map to Odoo Char or Text; integer maps to Integer; dropdown maps to Selection with the customer's option labels as the selection values. Multi-select, date, or boolean custom fields that the customer uses via Teamwork workarounds require manual Odoo field creation before migration begins.
Teamwork CRM
User
Odoo CRM
User (res.users)
1:1Teamwork CRM Users (owners) map to Odoo res.users records resolved by email address match. Before migration begins, the customer provisions Odoo user accounts for every Teamwork user referenced on Contact, Company, Lead, Opportunity, or Activity record. Any Teamwork Owner without a matching Odoo User is held in a reconciliation queue. Active/inactive status in Teamwork maps to active boolean in Odoo res.users.
Teamwork CRM
Activity (Call, Meeting, Task)
Odoo CRM
Mail Activity (mail.activity)
1:1Teamwork CRM Activities (calls, meetings, tasks) linked to Contacts or Opportunities map to Odoo mail.activity records. Activity type (call, meeting, task) maps to activity_type_id in Odoo; subject and description transfer as activity's summary and note fields. Date, due date, duration, and completion status preserve. Assignee maps from Teamwork owner_id to Odoo res.users via the User lookup. The related Odoo Partner or crm.lead record is set as res_id with the correct model.
Teamwork CRM
Note
Odoo CRM
Message (mail.message)
1:1Teamwork CRM notes attached to Contacts or Opportunities migrate as Odoo mail.message records with message_type=comment. The message body carries the note text. We link the message to the correct Partner or crm.lead record via res_id and model. Note author maps to Odoo res.users via email lookup. Internal notes in Teamwork map to Odoo internal message subtype.
Teamwork CRM
Tag
Odoo CRM
Tags (crm.tag on crm.lead)
lossyTeamwork CRM tags on Contacts and Opportunities map to Odoo crm.tag records. Tags are created once and linked via crm.lead.tag_ids on crm.lead records. For tags on Teamwork Contacts (mapped to Partner), Odoo does not have a native Partner tag model in standard CRM — we map those to a custom Char field partner_tag__c or to a Note record for searchability. The customer selects the preferred strategy during scoping.
Teamwork CRM
Custom Filter
Odoo CRM
Configuration reference (metadata only)
lossyTeamwork CRM saved custom filters are workspace-level view configurations, not business data. We capture filter definitions (field conditions, operators, sort order) as a reference document delivered alongside the migration. The customer's Odoo admin rebuilds applicable filters in Odoo Studio. Custom filters do not carry as migratable data records.
| Teamwork CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Partner (res.partner)1:1 | Fully supported | |
| Company | Partner (res.partner, is_company=True)1:1 | Fully supported | |
| Lead | Lead (crm.lead)1:1 | Fully supported | |
| Opportunity | Lead (crm.lead, stage = opportunity stage)1:many | Fully supported | |
| Pipeline | Sales Team (crm.team)lossy | Fully supported | |
| Pipeline Stage | Stage (crm.stage within crm.team)lossy | Fully supported | |
| Custom Fields | Custom Fields (ir.model.fields)lossy | Mapping required | |
| User | User (res.users)1:1 | Fully supported | |
| Activity (Call, Meeting, Task) | Mail Activity (mail.activity)1:1 | Fully supported | |
| Note | Message (mail.message)1:1 | Fully supported | |
| Tag | Tags (crm.tag on crm.lead)lossy | Fully supported | |
| Custom Filter | Configuration reference (metadata only)lossy | 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.
Teamwork CRM gotchas
120 req/min API rate limit during extraction
CSV export only available in list view
Known API bug with custom field value deletion
Working hours absent for legacy user profiles
SSO unavailable on Pro tier
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 field inventory
We audit the source Teamwork CRM portal for record volumes (Contacts, Companies, Leads, Opportunities), active pipelines and stages, custom field definitions with types and option values, owner list, activity count by type (calls, meetings, tasks), and any tag taxonomy. We pair this with an Odoo environment assessment: edition (Community vs Enterprise), existing Partner records, Sales Teams, stage definitions, and installed modules. The discovery output is a written migration scope document listing all objects to migrate, the Odoo field pre-creation checklist, the pipeline-to-Sales-Team mapping matrix, and any records that require manual review before import.
Schema preparation and Odoo field pre-creation
We pre-create all Teamwork CRM custom fields in the target Odoo database before any data import begins. This includes Char fields for Teamwork text custom fields, Integer fields for number fields, and Selection fields with matching option labels for dropdown fields. We also create the Sales Teams (crm.team) with stage sequences matching the Teamwork pipeline-stage configuration. Custom fields not pre-created are silently skipped by Odoo's import; this step is a migration prerequisite, not an optional optimization.
Owner reconciliation and Odoo user provisioning
We extract every distinct Teamwork CRM owner referenced across Contact, Company, Lead, Opportunity, and Activity records and match by email against the Odoo destination res.users table. Owners without a matching Odoo user go to a prerequisite list for the customer's Odoo admin to provision before record migration resumes. This step gates the entire migration because OwnerId is required on most standard CRM objects in Odoo.
Staging migration and data reconciliation
We run a full migration into the Odoo staging environment using production-equivalent data volume. The customer reconciles record counts (Partners in, Leads in, stage distribution), spot-checks 25-50 records against the Teamwork CRM source, and confirms field mapping accuracy before production migration is authorized. Any field type corrections, stage mapping adjustments, or missing custom fields are resolved in staging. This prevents import errors in production that would require a re-import cycle.
Production migration in dependency order
We execute production migration in the following order: Companies (Partner with is_company=True), then Contacts (Partner with is_company=False and parent_id resolved to the Company Partner), then Leads (crm.lead), then Opportunities (crm.lead in the opportunity-stage Sales Team). Activities (calls, meetings, tasks) migrate via the Odoo XML-RPC API with mail.activity records resolved against the parent Partner or crm.lead by external ID. Notes migrate as mail.message records. Each phase emits a row-count reconciliation report before the next phase begins. Teamwork's 120 req/min API rate limit is monitored throughout extraction.
Cutover, validation, and automation inventory handoff
We freeze Teamwork CRM writes during the cutover window, run a final delta migration of any records modified during the migration window, then set Odoo CRM as the system of record. We deliver the Workflow and Automation Inventory document listing every Teamwork CRM workflow rule and custom filter with the equivalent Odoo Automated Action or Studio filter configuration for the customer's admin to rebuild. We support a one-week hypercare window for reconciliation issues. We do not rebuild Teamwork CRM workflows as Odoo automated actions within the migration scope; that is a separate engagement.
Platform deep dives
Teamwork 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 Teamwork 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
Teamwork CRM: 120 requests per minute per organization.
Data volume sensitivity
Teamwork 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 Teamwork CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Teamwork 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 Teamwork 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.