CRM migration

Migrate from Trade Service Pro to Odoo CRM

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 logo

Trade Service Pro

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

10 of 10

objects map 1:1 between Trade Service Pro and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Trade Service Pro logo

Trade Service Pro

What's pushing teams away

  • No public API means third-party integrations or automated data pipelines are not possible, pushing growing companies toward platforms like ServiceTitan or Jobber that offer developer access.
  • Support is ticket-based with no clear SLA, and several reviews of similar FSM platforms cite slow response times as a reason for switching.
  • Limited scalability beyond 11–50 employees means companies that grow past that range often need a more robust platform with advanced dispatch and reporting.
  • Sync issues and reliability bugs, reported across comparable FSM tools, cause field teams to lose confidence in the system during active jobs.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How Trade Service Pro objects map to Odoo CRM

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

maps to

Odoo CRM

res.partner

1:1
Fully supported

TSP 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

maps to

Odoo CRM

crm.lead + project.task

1:1
Fully supported

TSP 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

maps to

Odoo CRM

sale.order

1:1
Fully supported

TSP 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

maps to

Odoo CRM

account.move

1:1
Fully supported

TSP 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

maps to

Odoo CRM

product.product + product.pricelist

1:1
Fully supported

TSP 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

maps to

Odoo CRM

res.users

1:1
Fully supported

TSP 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

maps to

Odoo CRM

crm.lead — lead_source

1:1
Fully supported

TSP 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

maps to

Odoo CRM

ir.model.fields (custom)

1:1
Fully supported

TSP 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

maps to

Odoo CRM

res.groups + ir.model.access

1:1
Not supported

TSP 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

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

TSP 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.

Gotchas + challenges

What specifically takes care here

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 logo

Trade Service Pro gotchas

High

No public API forces reliance on in-app CSV exports

Medium

Active timesheet timers do not export in CSV

Medium

eSign status on Proposals does not carry over

Low

Attachment bulk download requires separate handling

Medium

No schema documentation complicitates field mapping

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Odoo API rate limit of 1 request per second forces batch-oriented migration sequencing

    Odoo's External API enforces a nominal rate limit of 1 request per second on most plans, which means bulk loading tens of thousands of TSP records requires XML-RPC batch operations (model.create() with lists) rather than one record per request. We use Odoo's ORM batch create mode to pack up to 1,000 records per call, reducing a 50,000-record migration from 14 hours to under 3 hours. TSP records that reference unsynced foreign keys (partner_id not yet created) must be staged and re-processed in correct dependency order — partners first, then leads, then orders — to avoid orphaned links.

  • TSP Job scheduling has no native Odoo equivalent and requires custom field scaffolding

    TSP stores technician assignments, job dates, and service locations in dedicated scheduling objects. Odoo CRM has no field-service scheduling module in the base install — the Odoo Field Service app (a separate paid module) handles this but requires separate setup. We represent TSP scheduling data as project.task records with custom fields (tsp_technician_id__c, tsp_job_date__c, tsp_service_address__c) linked to the originating crm.lead. The task.project_id is set to a dedicated 'TSP Migration' project. If you plan to use Odoo Field Service, these tasks can be imported into that module; if not, they serve as historical record of what was scheduled.

  • TSP pricebook requires product.pricelist configuration before sale.order lines can be created

    TSP proposals reference pricebook line items that include service descriptions, unit prices, and labor rates. Odoo sale.order.line requires a product_id pointing to product.product. TSP pricebook items must be migrated as Odoo products first, then attached to Odoo product.pricelist rules that replicate the TSP pricing tiers. If TSP has region-specific pricing or volume discounts, each tier becomes a separate pricelist.rule in Odoo. Skipping this step causes Odoo to reject sale.order.line creation with a missing product_id error during migration.

  • TSP custom forms generate dynamic fields that must be pre-created in Odoo before migration

    TSP custom forms let users define arbitrary key-value fields on customers and jobs. Odoo requires explicit field definitions via ir.model.fields before data can populate them. We audit all TSP custom form definitions, generate the Odoo field creation XML or use the Settings > Technical > Models UI plan, and deliver the field schema as part of the pre-migration setup package. If custom forms were modified after initial setup, late-added fields may be missed — we compare TSP export schema against the field plan before data loads.

  • Odoo Enterprise modules used in TSP-migrated data require the same Odoo edition to function

    If any TSP records reference functionality available only in Odoo Enterprise (e.g., Odoo Studio for custom view layouts, the CRM Enterprise lead scoring module, or the Field Service app), those records and their associated data will not function correctly in an Odoo Community deployment. We flag any such references during the pre-migration audit and either recommend the appropriate Odoo edition upgrade or provide a Community-compatible equivalent for each flagged object.

Migration approach

Six steps for a successful Trade Service Pro to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Trade Service Pro logo

Trade Service Pro

Source

Strengths

  • All-in-one FSM bundle covering CRM, proposals, invoicing, and scheduling for trade contractors.
  • Month-to-month subscription with no annual contract commitment.
  • 30-day free trial with no credit card required for sign-up.
  • Integrated payment processing marketed as accelerating collections for field service businesses.
  • User permission controls differentiate back-office and field technician access levels.

Weaknesses

  • No public API documented, preventing automated integrations or programmatic data exports.
  • No published pricing tiers on the website; cost transparency requires a sales conversation.
  • Small company footprint (11–50 employees, <$5M revenue) suggests limited enterprise-scale features.
  • Support is ticket-based with no documented SLA, leading to unpredictable response times.
  • Schema is undocumented; custom fields and object relationships are not publicly described.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Standard CRM migration. All 8 core objects map 1:1 between Trade Service Pro and Odoo CRM.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Trade Service Pro and Odoo CRM.

  • Object compatibility

    A

    All 8 core objects map 1:1 between Trade Service Pro and Odoo CRM.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Trade Service Pro: Not publicly documented.

  • Data volume sensitivity

    B

    Trade Service Pro doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Trade Service Pro to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Trade Service Pro to Odoo CRM data migrations

Answers to the questions buyers ask most during Trade Service Pro to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most Trade Service Pro to Odoo CRM migrations complete in 48–72 hours of clock time for datasets under 25,000 records. Heavier TSP setups with custom forms, multiple pricebook tiers, or large scheduling datasets extend to 5–10 days. The Odoo API rate limit (1 req/sec) and the need to stage partners before jobs are the main sequencing constraints. Pre-migration Odoo schema setup (custom fields, stage configuration) adds 1–3 days on top of the data migration itself.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Trade Service Pro.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day