CRM migration
Field-level mapping, validation, and rollback between TeamSystem CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
TeamSystem CRM
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between TeamSystem CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from TeamSystem CRM to Odoo CRM is a data separation problem before it is a data migration. TeamSystem stores CRM objects alongside accounting, HR, and payroll records in a unified database, so the first migration task is identifying and extracting only the sales layer. We build a data separation map during discovery that distinguishes CRM tables from ERP tables, then run extraction against the CRM subset. For Odoo, we configure the CRM module with pipeline stages named to match the customer's deal lifecycle, map TeamSystem Leads and Contacts into Odoo's crm.lead model using a is_lead flag, and handle the multi-company structure that TeamSystem does not natively support. Workflow automations, custom pricing rules, and ERP-specific configurations do not migrate; we deliver a written map of active automations for rebuilding in Odoo's Automations framework. Historical timestamps on opportunities, activities, and notes are preserved throughout.
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 TeamSystem 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.
TeamSystem CRM
Contact
Odoo CRM
res.partner (contact)
1:1TeamSystem Contact records map to Odoo res.partner with is_company=False and parent_id set to the corresponding company partner record. Address fields (street, city, country, zip) map to partner address fields using Odoo's partner address mechanism. Email, phone, and mobile map to email, phone, and mobile. Owner assignment from TeamSystem maps to Odoo user_id on the CRM activity side; contact-level ownership is implicit through the parent company assignment.
TeamSystem CRM
Company
Odoo CRM
res.partner (company)
1:1TeamSystem Company records map to Odoo res.partner with is_company=True. The company domain becomes the partner's website field. If TeamSystem stores a VAT number, it maps to vat. Multiple contacts under the same company in TeamSystem all reference the same parent partner record via parent_id. We resolve parent_id foreign keys before inserting contact records to avoid Odoo's partner constraint violations.
TeamSystem CRM
Lead
Odoo CRM
crm.lead (is_lead=True)
1:1TeamSystem Lead records map to Odoo crm.lead with type='lead' and is_lead=True. Lead status from TeamSystem (new, contacted, qualified, disqualified) maps to Odoo's lead_stage_id with a custom stage mapping table built during discovery. Lead source, score, and any custom scoring fields map to Odoo's priority and tag fields, or to custom Char/Integer fields if the customer requests granular scoring retention.
TeamSystem CRM
Opportunity
Odoo CRM
crm.lead (type=opportunity)
1:1TeamSystem Opportunity records map to Odoo crm.lead with type='opportunity'. Deal value maps to Odoo's planned_revenue. Stage maps to crm_stage with the stage name matching the customer's pipeline stage names. Expected close date maps to date_deadline. Pipeline association in TeamSystem maps to a combination of Odoo's team_id (sales team) and tag_ids for pipeline-level segmentation if multiple pipelines are in use.
TeamSystem CRM
Pipeline
Odoo CRM
crm.stage + crm.team
lossyTeamSystem pipeline configurations (stage names, probabilities, sequence) map to Odoo crm_stage records ordered by sequence. Each TeamSystem pipeline maps to an Odoo sales team (crm.team), and stage probabilities are set on the stage record. If the customer uses a single pipeline in TeamSystem, we configure one crm.team and map all stages under it. Multi-pipeline customers get multiple crm.team records with their respective stage sequences.
TeamSystem CRM
Activity (calls, meetings, tasks)
Odoo CRM
mail.activity
1:1TeamSystem Activities (calls, emails, meetings, tasks) map to Odoo mail.activity records linked to the parent crm.lead via res_model='crm.lead' and res_id. Activity type maps to activity_type_id with a custom mapping table for non-standard types. Activity date and duration map to date_deadline and duration. Owner maps to user_id. For activities linked to Contacts without a related Opportunity, we link to the res.partner record directly using the same mail.activity mechanism.
TeamSystem CRM
Attachment
Odoo CRM
ir.attachment
1:1TeamSystem file attachments linked to deals, contacts, or activities map to Odoo ir.attachment records with res_model pointing to crm.lead or res.partner and res_id pointing to the migrated record ID. We export attachments by URL reference or download to local storage, then re-attach using Odoo's attachment mechanism. Attachment size limits and storage configuration must be verified against the customer's Odoo hosting plan (Odoo Online vs. Self-hosted) before migration.
TeamSystem CRM
Custom Fields (standard objects)
Odoo CRM
Custom Fields (ir.model.fields)
lossyTeamSystem custom fields on Contacts, Companies, Leads, and Opportunities require pre-creation in Odoo before data import. We extract the custom field registry during discovery, map field types to Odoo field definitions (Char, Integer, Float, Text, Selection, Many2one), and create them via Odoo Studio or direct model definition before import. Custom picklist values become Odoo Selection field options with the same key-value pairs.
TeamSystem CRM
User (owner)
Odoo CRM
res.users
1:1TeamSystem Owner records map to Odoo res.users by email match. Any TeamSystem owner without a matching Odoo user is held in a reconciliation queue while the customer's admin provisions the user. Active vs. inactive status maps directly. Team-based ownership in TeamSystem maps to Odoo crm.team membership via res.users.group_id and team member configuration.
TeamSystem CRM
Custom Objects
Odoo CRM
Custom Models (ir.model)
1:1If TeamSystem contains custom objects beyond standard Contact, Company, Lead, and Opportunity, we map them to Odoo custom models created via the Studio interface or direct model definition. Custom object relationships (lookup fields to standard objects) map to Odoo Many2one fields pointing to crm.lead or res.partner. The customer chooses whether custom objects migrate as CRM-linked records or as separate Odoo apps during scoping.
TeamSystem CRM
Email Integration Data
Odoo CRM
mail.message
1:1Email tracking and inbox association data from TeamSystem migrates as mail.message records linked to crm.lead or res.partner via res_model and res_id. Full email body content may require separate export depending on the TeamSystem integration configuration and whether emails are stored in the CRM layer or the ERP email module. We flag email extraction scope during discovery and exclude ERP-layer email records to avoid including non-CRM correspondence.
TeamSystem CRM
Workflow Automation Rules
Odoo CRM
Automated Actions (server actions)
1:1TeamSystem workflow automation configurations are stored in the ERP-CRM integration layer and are not exportable as discrete data. We do not migrate automations as code. We document every active TeamSystem workflow trigger, condition, and action in a written inventory with recommended Odoo Automations equivalents using ir.actions.server and crm.lead.rule models. The customer's Odoo partner or admin rebuilds them post-migration.
| TeamSystem CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (contact)1:1 | Fully supported | |
| Company | res.partner (company)1:1 | Fully supported | |
| Lead | crm.lead (is_lead=True)1:1 | Fully supported | |
| Opportunity | crm.lead (type=opportunity)1:1 | Fully supported | |
| Pipeline | crm.stage + crm.teamlossy | Fully supported | |
| Activity (calls, meetings, tasks) | mail.activity1:1 | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Custom Fields (standard objects) | Custom Fields (ir.model.fields)lossy | Fully supported | |
| User (owner) | res.users1:1 | Fully supported | |
| Custom Objects | Custom Models (ir.model)1:1 | Fully supported | |
| Email Integration Data | mail.message1:1 | Mapping required | |
| Workflow Automation Rules | Automated Actions (server actions)1:1 | Not 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.
TeamSystem CRM gotchas
Custom pricing with no public tiers
ERP-CRM data entanglement complicates clean CRM exports
API is not publicly documented
Implementation typically requires IT involvement and paid setup
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 ERP-CRM separation mapping
We audit the TeamSystem instance to identify CRM objects versus ERP objects in the unified database. This involves reviewing the schema for Contacts, Leads, Companies, Opportunities, Activities, and Custom Fields, then cross-referencing against accounting and payroll tables to flag which records belong to the sales layer. We also extract the custom field registry, pipeline stage names and probabilities, active workflow configurations, and user roster. The discovery output is a written separation map, a migration scope document, and a confirmed Odoo app stack recommendation (Starter CRM only vs. CRM + other apps) based on what the customer needs from the destination.
API credential procurement and schema validation
We engage the customer's IT team or TeamSystem support to obtain API credentials for CRM object extraction. If API access is restricted or incomplete, we coordinate a database-level export under vendor guidance. We validate the separation map against the live TeamSystem schema by pulling record counts per object and confirming no accounting table cross-contamination before running the full extraction. This step gates the rest of the project; no data moves until the separation map is validated.
Odoo CRM schema configuration
We configure the Odoo destination environment before any data import. This includes creating any custom fields on crm.lead and res.partner that correspond to TeamSystem custom fields (mapped by type during discovery), configuring pipeline stages to match TeamSystem stage names and probabilities, setting up sales teams if multiple pipelines are in use, and defining the lead-stage mapping table for TeamSystem Lead statuses. If the customer is running Odoo multi-company, we configure company assignments per record. The Odoo configuration is deployed into a staging environment first for validation.
Staging migration and record reconciliation
We run a full migration into the Odoo staging environment with production-like record volume. The customer's RevOps or IT lead reviews record counts across all objects, spot-checks 25-50 records for field-level accuracy, and confirms that pipeline stage names and partner-company relationships rendered correctly. Any field mapping corrections, stage alignment issues, or custom field type mismatches are resolved in staging before production migration. Sign-off from the customer's team is required before proceeding to production.
Production migration in dependency order
We run production migration in the following order: res.partner (company records first with is_company=True), res.partner (contact records with parent_id resolved), crm.lead (Leads as is_lead=True, then Opportunities as type='opportunity'), mail.activity records linked to the correct crm.lead or res.partner, ir.attachment records linked to the correct res_model and res_id, and custom model records last. Owner resolution uses email-to-user matching with a reconciliation queue for unmatched owners. Each phase emits a row-count report. We freeze TeamSystem writes during the final cutover window and run a delta migration of any records modified during the window.
Cutover, validation, and automation rebuild handoff
We enable Odoo CRM as the system of record after cutover. We perform a final reconciliation comparing Odoo record counts against the TeamSystem export totals, verify that open Opportunities carry the correct stage and revenue, and confirm that activity timelines are linked to the correct partner and opportunity records. We deliver the workflow automation inventory document to the customer's admin team. We support a one-week post-cutover window for reconciliation issues. We do not rebuild TeamSystem automations as Odoo Automations within the migration scope; that is a separate engagement.
Platform deep dives
TeamSystem CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 TeamSystem CRM and Odoo CRM.
Object compatibility
3 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
TeamSystem CRM: Not publicly documented.
Data volume sensitivity
TeamSystem 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 TeamSystem CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your TeamSystem 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 TeamSystem 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.