CRM migration
Field-level mapping, validation, and rollback between Zuper and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Zuper
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Zuper and Odoo CRM.
Complexity
BStandard
Timeline
24–72 hours
Overview
Zuper is a field-service management platform built around jobs, customers, teams, and work-order scheduling — with a mobile-first offline architecture and a workflow builder for field-automation chains. Odoo CRM operates as a module within the broader Odoo ERP: its primary CRM object is crm.lead (which serves as both lead and opportunity), and contacts/companies live in res.partner. The migration challenge is that Zuper has no native Odoo-equivalent for job types, job-status stages, or timesheet-to-activity mapping — these require custom fields on crm.lead and careful value-mapping for Zuper's job-state labels. FlitStack AI extracts Zuper data via its REST API using paginated endpoints, maps jobs to crm.lead with a job_type__c custom field to preserve what a job is, translates Zuper team memberships into Odoo sales teams (crm.team) and res.users assignments, and carries custom field definitions as Odoo custom fields. Workflows, guided workflows, and automation chains do not migrate — we export their definitions as a rebuild reference for Odoo's Studio automation tools. All attachments re-upload to Odoo Documents (ir_attachment). A delta-pickup window of 24–48 hours captures any jobs created or updated during cutover.
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 Zuper 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.
Zuper
Customer
Odoo CRM
res.partner
1:1Zuper customers map 1:1 to Odoo res.partner records. The partner_type field in Odoo is set to 'contact' for individuals and 'company' for business accounts. Address fields (street, city, state, zip, country) migrate directly via the address fields on res.partner. Phone, email, and mobile fields map to phone, email, and mobile on res.partner.
Zuper
Job
Odoo CRM
crm.lead
1:1Zuper jobs are the core migration object. Each job becomes a crm.lead record where the opportunity name is the job title, the partner_id links to the Zuper customer (res.partner), and job-specific properties — job type, job status, priority, description — are stored in custom fields on crm.lead (job_type__c, job_status__c, job_priority__c, job_description__c). The crm.lead.stage_id field maps Zuper job statuses to Odoo pipeline stages.
Zuper
Job Category
Odoo CRM
Custom field (job_category__c) on crm.lead
1:1Zuper job categories (configured in Settings > Jobs > Job Categories) have no native Odoo CRM equivalent. We create a custom selection field job_category__c on crm.lead with the exact Zuper category values preserved. If categories are hierarchical, we store the full path as a Char field and optionally create tags in Odoo (crm.tag) for cross-cutting categorization.
Zuper
Job Status
Odoo CRM
crm_stage (pipeline stage)
1:1Zuper job statuses (New, In Progress, On Hold, Completed, Cancelled, etc.) map to Odoo crm_stage records. We create or reuse stages in Odoo's pipeline and assign each Zuper status value to the corresponding stage. Stage display names in Odoo can be customized to match Zuper's naming. Closed stages (Completed → Won, Cancelled → Lost) set the crm.lead.stage_id to the appropriate closed stage and the active flag is set accordingly.
Zuper
Team
Odoo CRM
crm_team
1:1Zuper teams map to Odoo crm_team records. The team name and description migrate directly. Members of the Zuper team are resolved by email against Odoo res_users — matched users are added to the crm_team via the crm_team_member relation table. Unmatched users are flagged and assigned to a fallback team or user until Odoo accounts are provisioned.
Zuper
Team Member
Odoo CRM
res_users
1:1Zuper team members (assigned_user_id on jobs) map to Odoo res_users records. The mapping is resolved by email address — if a Zuper user email matches an existing Odoo user, their user_id is assigned to the crm.lead as the opportunity owner. If no match exists, the job owner is stored in a custom field job_owner_email__c and the record is assigned to a migration admin user.
Zuper
Custom Field (Customer)
Odoo CRM
Custom field on res.partner
1:1Zuper custom fields created on customers become Odoo custom fields on res.partner using the Odoo Studio interface or model definition. Field types (Char, Integer, Float, Date, Selection, Many2one) are preserved. Selection-type custom fields replicate the Zuper pick-list values as options in the Odoo field. Many2one fields may require lookup tables in Odoo.
Zuper
Custom Field (Job)
Odoo CRM
Custom field on crm.lead
1:1Zuper custom fields created on jobs migrate to crm.lead custom fields following the same type-preservation logic applied to customer custom fields. These fields extend the opportunity record with Zuper-specific data such as equipment_serial__c, service_contract_type__c, warranty_expiration__c, and parts_used__c that have no native Odoo CRM equivalent. Field definitions including selection pick-lists, date formats, and many2one relationships are recreated identically in Odoo Studio, ensuring data integrity and consistent downstream reporting.
Zuper
Job Attachment / File
Odoo CRM
ir_attachment (Documents)
1:1Files attached to Zuper jobs (photos, PDFs, signed documents) are downloaded and re-uploaded to Odoo ir_attachment records linked to the corresponding crm.lead. The original filename, MIME type, and create date are preserved. Large files are chunked to respect Odoo's attachment size limits. Inline images from job notes are extracted and stored as separate attachments.
Zuper
Workflow / Guided Workflow
Odoo CRM
Studio automation rules
1:1Zuper Workflow Builder and Guided Workflow definitions do not have a migration path to Odoo CRM. The workflow node structure, condition branches, and action chains are exported as a JSON reference document that Odoo developers can use to recreate equivalent automations using Odoo Studio, server actions, and scheduled actions. This is a manual rebuild step — we provide the map, not the automation.
Zuper
Timesheet Entry
Odoo CRM
mail.message on crm.lead
1:1Zuper timesheet entries linked to jobs have no native equivalent in Odoo CRM. We migrate them as internal notes (mail.message with internal=True) on the corresponding crm.lead, preserving the hours logged, date, user, and timeoff type. For teams that need formal timesheet tracking post-migration, we recommend enabling the Odoo Timesheets app and linking crm.lead to project tasks.
Zuper
Job Location
Odoo CRM
res_partner_address_field on res.partner
1:1Zuper job locations (service address) that differ from the customer address are stored as a separate location record. We create a secondary address on the res.partner record using the 'Additional Addresses' feature, or store the location as a custom Char field on crm.lead (service_address__c) if the job is always at a different address than the partner record.
| Zuper | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer | res.partner1:1 | Fully supported | |
| Job | crm.lead1:1 | Fully supported | |
| Job Category | Custom field (job_category__c) on crm.lead1:1 | Fully supported | |
| Job Status | crm_stage (pipeline stage)1:1 | Fully supported | |
| Team | crm_team1:1 | Fully supported | |
| Team Member | res_users1:1 | Fully supported | |
| Custom Field (Customer) | Custom field on res.partner1:1 | Fully supported | |
| Custom Field (Job) | Custom field on crm.lead1:1 | Fully supported | |
| Job Attachment / File | ir_attachment (Documents)1:1 | Fully supported | |
| Workflow / Guided Workflow | Studio automation rules1:1 | Fully supported | |
| Timesheet Entry | mail.message on crm.lead1:1 | Fully supported | |
| Job Location | res_partner_address_field on res.partner1: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.
Zuper gotchas
No bulk API endpoint means large migrations are sequential
Quote object schema is shallower than Job schema
Workflow Builder automations have no export capability
Multi-custom-field filter on Properties API returns no records when multiple filters applied
Mobile app instability causes incomplete Job records in production data
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 Zuper data model and define the value-mapping table
FlitStack AI connects to Zuper via its REST API and exports a full inventory of all objects: customers, jobs, job categories, teams, team members, custom field definitions, and attachments. We build the value-mapping table that routes each Zuper job status to a corresponding Odoo crm_stage record, and identify which custom fields on customers and jobs need to be created in Odoo before migration. This audit output is shared with your Odoo admin for confirmation.
Pre-create Odoo schema: custom fields, stages, and sales teams
Before any data moves, your Odoo admin (or our team using Studio) creates the custom fields identified in the audit — job_category__c, job_type__c, job_priority__c, job_service_address__c, Original_Create_Date__c, Source_System_ID__c, and any custom fields unique to your Zuper setup. We also configure the Odoo pipeline stages to match the Zuper status values and create crm_team records for each Zuper team. This ensures the schema is ready before validation runs.
Resolve owners and team members by email
Zuper assigned_user_ids and team members are resolved against Odoo res_users by email address. FlitStack AI generates a match report: matched users are assigned directly, and unmatched users are flagged with their Zuper email stored in job_owner_email__c. Your team either creates Odoo accounts for unmatched users before migration or designates a fallback owner. No crm.lead lands in Odoo without a resolved user_id or an explicit fallback.
Run a sample migration with field-level diff
A representative slice of records — typically 100–300 jobs spanning multiple teams, job categories, and statuses — migrates first. FlitStack AI generates a field-level diff comparing source (Zuper) values against destination (Odoo) fields for every mapped property. You verify that job_category__c and job_status-to-stage mapping are correct, that custom field values transferred, and that owner resolution worked. No full run commits until the sample diff is approved.
Execute full migration with delta-pickup window and rollback readiness
The full migration runs in dependency order: res_partner records first (for customer links), then crm_team, then crm_lead with all custom fields and partner_id lookups resolved. Attachments and files are downloaded from Zuper and re-uploaded to Odoo ir_attachment linked to each crm.lead. A 24–48-hour delta-pickup window captures any jobs created or updated in Zuper during cutover. All operations are logged in the FlitStack audit log. One-click rollback reverts the Odoo environment to its pre-migration state if reconciliation reveals data integrity issues.
Platform deep dives
Zuper
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Zuper and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Zuper and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Zuper 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
Zuper: Not publicly documented in current developer documentation.
Data volume sensitivity
Zuper 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 Zuper to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Zuper 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 Zuper
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.