CRM migration
Field-level mapping, validation, and rollback between Trade Service Pro and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Trade Service Pro
Source
Odoo CRM
Destination
Compatibility
10 of 10
objects map 1:1 between Trade Service Pro and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Trade Service Pro is a field-service management platform built for HVAC, plumbing, electrical, and tree-service contractors. It stores customers, jobs, estimates, invoices, and scheduling data in a single application optimized for mobile crews and back-office workflows. Odoo CRM uses a different data model: contacts live in res.partner (with the same table serving both customer and company records), leads and opportunities share the crm.lead table differentiated by the type field ('lead' vs 'opportunity'), and estimates map to sale.order / sale.order.line. Jobs from TSP are best represented as Odoo project.task records linked to the originating crm.lead, preserving the service-address and trade-type context in custom fields. We extract TSP data via the platform's export interfaces, map each object type to its Odoo counterpart, create any custom fields needed for TSP-specific properties (trade_type, service_area, intake_source), and load records in the correct dependency order: partners first, then leads, then opportunities, then sale orders, then tasks. FlitStack runs a sample migration with a field-level diff before committing the full run, and captures a 24–48h delta window for records modified during cutover. Workflows, automations, and custom integrations do not migrate — those must be rebuilt in Odoo's automation framework.
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 Trade Service Pro 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.
Trade Service Pro
Customer
Odoo CRM
res.partner
1:1TSP customers map 1:1 to Odoo res.partner records. The partner_type field ('customer', 'invoice_address', 'delivery_address') determines the Odoo address role, allowing multiple address types per customer in the same table. The residential versus commercial distinction from TSP becomes a custom selection field (tsp_customer_type) on the partner record to preserve the original customer classification. Each TSP customer is validated against Odoo's partner constraints before insertion.
Trade Service Pro
Job / Service Record
Odoo CRM
crm.lead + project.task
1:1TSP jobs contain both lead context (customer info, trade type, service address) and scheduling context (assigned tech, job date, status). We split this: the lead/opportunity portion maps to crm.lead (type='opportunity'), and the work-order portion maps to project.task linked via crm.lead.task_ids. Original TSP job number is preserved as a custom field on both records for traceability.
Trade Service Pro
Proposal / Estimate
Odoo CRM
sale.order
1:1TSP proposals map to Odoo sale.order records in state='draft'. Each TSP proposal line item becomes a sale.order.line linked to a product.product. TSP proposal status (sent, accepted, rejected) maps to Odoo sale.order state transitions. The original proposal number is stored as name on the Odoo record.
Trade Service Pro
Invoice
Odoo CRM
account.move
1:1TSP invoices become Odoo account.move records of type='out_invoice'. Line items map to account.move.line with product references where available. TSP invoice payment status (paid, pending, overdue) maps to Odoo's payment_state field using the account_payment module's reconciliation logic. TSP invoice numbers are preserved as account.move.name, and TSP tax rates mapped by service address state and zip become corresponding account.tax records linked to the invoice lines.
Trade Service Pro
Pricebook / Product Catalog
Odoo CRM
product.product + product.pricelist
1:1TSP pricebook entries (service descriptions, unit prices, labor rates) translate to Odoo product.product records with type='service'. TSP pricing tiers become Odoo product.pricelist rules attached to those products. Each TSP service item receives a corresponding Odoo product so sale.order.line can reference it directly.
Trade Service Pro
User / Technician
Odoo CRM
res.users
1:1TSP users and technicians map to Odoo res.users. Email is the matching key. TSP role assignments (admin, back office, field tech) map to Odoo groups: field technician becomes Odoo's 'Project / Task User' group with access to project.task and crm.lead but not accounting journal entries.
Trade Service Pro
Intake / Lead Source
Odoo CRM
crm.lead — lead_source
1:1TSP intake records capture the ad source or referral channel for each new lead. The TSP intake_source values map to Odoo crm.lead.source_id (crm.lost_reason for non-lead types). Value mapping is done per unique source string found in the TSP dataset; unmapped sources become a generic 'TSP Intake' entry.
Trade Service Pro
Custom Form Data
Odoo CRM
ir.model.fields (custom)
1:1TSP custom forms generate user-defined fields on customers and jobs. Each TSP custom field is created as an Odoo ir.model.fields entry on the appropriate model (res.partner for customer-level forms, crm.lead for job-level forms). Field types are inferred from TSP data types: text fields become char/-text, numeric fields become float, date fields become date. Custom field definitions are delivered as a setup plan before migration.
Trade Service Pro
User Permissions
Odoo CRM
res.groups + ir.model.access
1:1TSP permission sets (back-office vs field-tech access) have no direct Odoo equivalent. We preserve the TSP permission metadata in a custom field on res.users (tsp_original_permissions__c) and deliver a group-mapping plan so your Odoo admin can recreate access rules in Odoo's Security configuration before the migration goes live.
Trade Service Pro
Attachments / Files
Odoo CRM
ir.attachment
1:1TSP file attachments (images, signed documents, inspection reports) attached to jobs and customers are downloaded and re-uploaded to Odoo's ir.attachment table, linked to the corresponding res.partner or crm.lead via res_model and res_id. Odoo's 100MB per-file limit covers most TSP attachment sizes; files exceeding this are flagged before migration.
| Trade Service Pro | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer | res.partner1:1 | Fully supported | |
| Job / Service Record | crm.lead + project.task1:1 | Fully supported | |
| Proposal / Estimate | sale.order1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Pricebook / Product Catalog | product.product + product.pricelist1:1 | Fully supported | |
| User / Technician | res.users1:1 | Fully supported | |
| Intake / Lead Source | crm.lead — lead_source1:1 | Fully supported | |
| Custom Form Data | ir.model.fields (custom)1:1 | Fully supported | |
| User Permissions | res.groups + ir.model.access1:1 | Not supported | |
| Attachments / Files | ir.attachment1: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.
Trade Service Pro gotchas
No public API forces reliance on in-app CSV exports
Active timesheet timers do not export in CSV
eSign status on Proposals does not carry over
Attachment bulk download requires separate handling
No schema documentation complicitates field mapping
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
Audit TSP data export and map to Odoo schema
FlitStack extracts a full data export from Trade Service Pro covering all standard objects (customers, jobs, proposals, invoices, users) and any active custom forms. We compare the TSP export schema against Odoo's data model, identify which TSP custom fields require Odoo ir.model.fields creation, map TSP job records to crm.lead + project.task, and generate the Odoo field-scaffolding plan. This audit produces a data map document that lists every TSP field and its Odoo destination before any data moves.
Create Odoo custom fields and configure partner / lead stages
We deliver the Odoo field-scaffolding plan — the list of ir.model.fields entries for every TSP custom property — so your Odoo admin creates them before migration. Simultaneously, we configure crm.stage records that mirror TSP job statuses (New, Scheduled, In Progress, Completed, Cancelled) and set up product.pricelist rules for each TSP pricebook pricing tier. The project.task model is enabled and a migration project is created to receive TSP scheduling data. Res.users accounts are matched by email against TSP user records.
Migrate partners and products in dependency order
We load TSP customers as res.partner records using XML-RPC batch create in groups of up to 1,000. TSP pricebook items are created as product.product records followed by product.pricelist and product.pricelist.rule entries that replicate TSP pricing tiers. These must complete before proposals and invoices can reference valid product_id and partner_id values. Owner resolution matches TSP owner names to Odoo res.users by email; unmatched owners are flagged and assigned to a 'TSP Unassigned' placeholder user for review.
Migrate leads, opportunities, and proposals
With partners and products in place, TSP jobs are split into crm.lead (type='opportunity') records and linked project.task records. TSP proposals become sale.order drafts with sale.order.line entries referencing the migrated products. We preserve the original TSP proposal number as the Odoo sale.order name, and proposal status (sent, accepted, rejected) maps to Odoo state transitions. The stage_id on each crm.lead is set by TSP job status value mapping.
Run sample migration with field-level diff and capture delta window
A representative sample — typically 200–500 records spanning customers, jobs, proposals, and invoices — is migrated first. We generate a field-level diff report comparing source TSP values against Odoo destination values for every mapped field, including custom fields. You review the diff to confirm stage mapping, technician assignment, and custom form data placement. Any discrepancies are corrected in the mapping plan before the full run. After sample sign-off, the full migration runs and a 24–48h delta-pickup window opens to capture TSP records modified during cutover.
Deliver final audit log and rebuild reference for automations
The full migration run produces an operation-level audit log: every record created, updated, or skipped with reason codes. We export the TSP workflow definitions as a structured reference document (trigger names, conditions, actions) so your Odoo admin can rebuild automations in Odoo Automations or Server Actions. One-click rollback is available if reconciliation against the TSP export count reveals discrepancies. Post-migration, your team configures Odoo groups and ir.model.access control to replace TSP user permissions per the access-mapping plan we deliver.
Platform deep dives
Trade Service Pro
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Trade Service Pro and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Trade Service Pro and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Trade Service Pro and Odoo CRM.
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
Trade Service Pro: Not publicly documented.
Data volume sensitivity
Trade Service Pro 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 Trade Service Pro to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Trade Service Pro 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 Trade Service Pro
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.