CRM migration
Field-level mapping, validation, and rollback between Novo Work Order and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Novo Work Order
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Novo Work Order and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Novo Work Order stores work orders, assets, customer contacts, departments, and location data in a flat-to-relational structure optimized for municipal field-service teams. Odoo CRM represents leads and opportunities in crm.lead, contacts and companies in res.partner, and asset-related work orders in maintenance.request — a separate module that must be activated during Odoo setup. The migration must sequence imports so res.partner records (customers and companies) are created before crm.lead records that reference them, and maintenance.request records are created only after the relevant asset and partner records exist. Novo's custom fields, priority tiers, and department assignments map to Odoo custom Char/Selection fields, maintenance team assignments, and crm.team records respectively. FlitStack AI exports Novo data via its built-in CSV export, transforms the structure to match Odoo's ORM conventions (xmlrpc or direct PostgreSQL injection), and loads in the correct dependency order. Workflows, email templates, department-specific automation rules, and department-level permission sets do not migrate — these are Odoo configuration items rebuilt post-migration using Odoo's built-in automation engine or Studio. All work-order history, timestamps, and assignment logs migrate as Odoo note or message records on the target object.
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 Novo Work Order 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.
Novo Work Order
Contact (Novo Customer)
Odoo CRM
res.partner
1:1Novo stores customers as contact records with name, email, phone, and address fields. These map directly to res.partner in Odoo. The partner's is_company flag is set to False for individual contacts; company-type contacts (if Novo distinguishes them) set is_company to True and become parent partner records. Novo's customer_id is preserved as Source_System_ID__c for delta-run de-duplication.
Novo Work Order
Work Order
Odoo CRM
maintenance.request
1:1Novo work orders map to maintenance.request in Odoo when the Maintenance module is installed. This is the most structurally faithful mapping — maintenance.request includes user_id (assigned technician), equipment_id (linked asset), schedule_date, completion date, and description. Novo's priority field maps to maintenance.priority (0–5 scale). If the Maintenance module is not available in the target Odoo instance, work orders map to crm.lead as a Project-type opportunity with custom fields for operational data.
Novo Work Order
Work Order
Odoo CRM
crm.lead
1:1When the Maintenance module is not activated or when work orders represent sales-driven service engagements rather than asset maintenance, Novo work orders map to crm.lead. The work order name becomes the opportunity name, description maps to crm.lead description, and operational fields (labor hours, parts cost) become custom fields on the lead. The crm.lead type is set to 'opportunity' to distinguish from standard sales leads.
Novo Work Order
Asset
Odoo CRM
maintenance.equipment
1:1Novo assets (equipment records with name, serial number, category, and location) map directly to maintenance.equipment in Odoo. The equipment_id on maintenance.request links work orders to the relevant asset. If the target Odoo instance does not have the Maintenance module, assets map to product.product (with type='product') for inventory tracking purposes.
Novo Work Order
Department
Odoo CRM
crm.team
1:1Novo's multi-department structure has no native Odoo equivalent. FlitStack maps each Novo department to a crm.team record in Odoo, with team members (technicians) assigned as crm.team member res.users records. Odoo's Record Rules are then configured to scope visibility by team, approximating Novo's department-level data isolation. This requires Odoo admin configuration post-migration.
Novo Work Order
Work Order Status
Odoo CRM
maintenance.stage / crm.stage
1:1Novo status values (Open, In Progress, On Hold, Completed, Cancelled) are mapped one-to-one to Odoo maintenance.stage or crm.stage records depending on the destination object. Each stage is created in Odoo with the appropriate sequence number and fold flag before work order imports run. Stage-entered timestamps from Novo are preserved as custom datetime fields on the target record.
Novo Work Order
Location / Facility
Odoo CRM
res.partner (Address)
1:1Novo stores locations as address records attached to work orders. These migrate as res.partner records with is_company=False and a dedicated address type. In Odoo, the address is stored on the partner record using the address fields (street, city, state_id, zip, country_id). If a location serves as both a customer and a service site, it is duplicated as a separate partner record with category='Service Location'.
Novo Work Order
User / Technician
Odoo CRM
res.users
1:1Novo users (technicians, department heads, admins) map to res.users in Odoo. Resolution is performed by email address match — each Novo user.email is matched against res.users.login. Unmatched users are flagged before migration; the team either pre-creates Odoo user accounts or assigns records to a fallback user. Novo department assignments map to crm.team membership.
Novo Work Order
Work Order Attachments
Odoo CRM
ir.attachment
1:1Novo file attachments on work orders (photos, PDFs, inspection reports) are exported from Novo's storage and re-uploaded to Odoo as ir.attachment records linked to the target maintenance.request or crm.lead record via res_model and res_id. Odoo's ir_attachment model stores files in its filestore directory. Large file handling respects Odoo's attachment size limits (configurable in system parameters).
Novo Work Order
Work Order Activity Log
Odoo CRM
mail.message
1:1Novo's internal activity history on work orders (status changes, notes, internal comments) migrates as mail.message records on the target Odoo record. Each message is created with message_type='comment', author_id matching the Novo user who performed the action, and body containing the activity description. Original timestamps are preserved. This provides a complete audit trail on the Odoo record without requiring Odoo's full activity tracking module.
Novo Work Order
Novo Custom Fields (Work Order)
Odoo CRM
Custom fields on maintenance.request / crm.lead
1:1Novo custom fields on work orders (e.g., inspection_type, permit_number, weather_conditions) require Odoo custom field definitions on the target model (maintenance.request or crm.lead). FlitStack creates the Odoo field definition (x_ prefix for Community Edition) with the matching type (Char, Selection, Date, Float, etc.) before data import. Pick-list-style custom fields in Novo are created as Selection fields in Odoo with the same option values.
Novo Work Order
Novo Custom Fields (Contact)
Odoo CRM
Custom fields on res.partner
1:1Novo custom fields on customer contacts (e.g., preferred_service_area, customer_tier, billing_code) migrate as custom fields on res.partner in Odoo. The same x_ prefix convention applies for Community Edition. After migration, Odoo Studio can be used to expose these fields on the partner form view without code changes.
| Novo Work Order | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact (Novo Customer) | res.partner1:1 | Fully supported | |
| Work Order | maintenance.request1:1 | Fully supported | |
| Work Order | crm.lead1:1 | Fully supported | |
| Asset | maintenance.equipment1:1 | Fully supported | |
| Department | crm.team1:1 | Fully supported | |
| Work Order Status | maintenance.stage / crm.stage1:1 | Fully supported | |
| Location / Facility | res.partner (Address)1:1 | Fully supported | |
| User / Technician | res.users1:1 | Fully supported | |
| Work Order Attachments | ir.attachment1:1 | Fully supported | |
| Work Order Activity Log | mail.message1:1 | Fully supported | |
| Novo Custom Fields (Work Order) | Custom fields on maintenance.request / crm.lead1:1 | Fully supported | |
| Novo Custom Fields (Contact) | Custom fields 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.
Novo Work Order gotchas
No public API forces migration via built-in exports
Pricing opacity complicates budget planning
Municipal-specific custom fields need careful schema mapping
Preventative maintenance recurrence rules vary by configuration
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 Novo data structure and activate Odoo modules
FlitStack extracts a full inventory of Novo Work Order objects — contacts, work orders, assets, locations, departments, custom fields, and file attachments — using Novo's built-in CSV export. We simultaneously identify which Odoo apps are active in the target instance (CRM, Maintenance, Inventory). If maintenance.equipment is not available, we configure the object mapping to use crm.lead as the work order destination. All Novo status values, priority levels, and department names are catalogued to create matching Odoo stage, selection, and team records before any data loads begin.
Create Odoo destination schema (stages, teams, custom fields, users)
We pre-create the Odoo infrastructure that data will reference on import: maintenance.stage or crm.stage records for each Novo status, maintenance.team records for each Novo department, and custom fields on maintenance.request, crm.lead, and res.partner for all Novo custom properties. User resolution runs by email — Novo users are matched to existing Odoo res.users by login (email). Unmatched users are flagged in the migration report; the team pre-creates Odoo accounts or designates a fallback user before the full migration run.
Migrate in dependency order: partner → equipment → work orders → attachments → activity history
Data loads run in the correct foreign-key order: res.country and res.country.state records first, then res.partner (contacts and companies), then maintenance.equipment (assets), then maintenance.request or crm.lead (work orders). This sequence ensures that partner_id and equipment_id references on work order records resolve correctly in Odoo. Novo work order attachments are exported from Novo's file storage and uploaded to Odoo's ir.attachment records linked to the corresponding maintenance.request. Activity history from Novo (status changes, internal notes) loads as mail.message records after the parent record exists.
Run sample migration with field-level diff and reconciliation
A representative slice of 200–500 records across contacts, work orders, assets, and attachments migrates first. FlitStack generates a field-level diff comparing source and destination values for every mapped field. We verify that priority mapping produces the correct maintenance.priority integer, that status values resolve to the correct stage_id, that equipment_id links are intact, and that timestamps on mail.message records match the original Novo activity timestamps. Reconciliation passes when all critical fields match within tolerance; otherwise the mapping is corrected before the full run proceeds.
Full migration run with delta-pickup window and one-click rollback
The complete dataset migrates to Odoo under a scoped transaction. A delta-pickup window of 24–48 hours captures any work orders created or modified in Novo during the cutover window. FlitStack generates a full audit log of every record created, every foreign-key resolved, and every transformation applied. If reconciliation identifies mismatches, one-click rollback reverts all Odoo records created during the migration run and the process restarts from the validated sample. The Novo source account remains fully operational throughout — only read access is used, with no impact on active work orders.
Platform deep dives
Novo Work Order
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Novo Work Order and Odoo CRM.
Object compatibility
1 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
Novo Work Order: Not publicly documented.
Data volume sensitivity
Novo Work Order 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 Novo Work Order to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Novo Work Order 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 Novo Work Order
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.