CRM migration

Migrate from Novo Work Order to Odoo CRM

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 logo

Novo Work Order

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between Novo Work Order and Odoo CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Novo Work Order logo

Novo Work Order

What's pushing teams away

  • Search engine across the platform is described in reviews as 'horrible' — locating older work orders or asset records can require multiple filter passes.
  • Some features are not intuitive and require training; reviewers note a documented learning curve.
  • Report writing is difficult to use according to reviewer feedback — operations needing rich custom reporting often supplement with external BI.
  • Public pricing is limited to the ShareNet Basic Edition at $25/user/month (annual, 3-user minimum); higher tiers are quoted by sales.
  • Vendor scale is small relative to FSM / CMMS leaders like Fiix, UpKeep, or ServiceChannel — partner ecosystem and community resources are thinner.

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 Novo Work Order objects map to Odoo CRM

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)

maps to

Odoo CRM

res.partner

1:1
Fully supported

Novo 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

maps to

Odoo CRM

maintenance.request

1:1
Fully supported

Novo 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

maps to

Odoo CRM

crm.lead

1:1
Fully supported

When 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

maps to

Odoo CRM

maintenance.equipment

1:1
Fully supported

Novo 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

maps to

Odoo CRM

crm.team

1:1
Fully supported

Novo'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

maps to

Odoo CRM

maintenance.stage / crm.stage

1:1
Fully supported

Novo 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

maps to

Odoo CRM

res.partner (Address)

1:1
Fully supported

Novo 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

maps to

Odoo CRM

res.users

1:1
Fully supported

Novo 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

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

Novo 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

maps to

Odoo CRM

mail.message

1:1
Fully supported

Novo'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)

maps to

Odoo CRM

Custom fields on maintenance.request / crm.lead

1:1
Fully supported

Novo 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)

maps to

Odoo CRM

Custom fields on res.partner

1:1
Fully supported

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

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.

Novo Work Order logo

Novo Work Order gotchas

High

No public API forces migration via built-in exports

Medium

Pricing opacity complicates budget planning

Medium

Municipal-specific custom fields need careful schema mapping

Low

Preventative maintenance recurrence rules vary by configuration

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 maintenance.equipment requires the Maintenance module to be installed before data loads

    Novo assets map most naturally to Odoo's maintenance.equipment model, but this requires the Maintenance app to be installed and activated in the Odoo instance. If the Maintenance module is not available — which is common in newly provisioned Odoo Community instances that start with only CRM and Sales apps — assets fall back to product.product and the work-order-to-maintenance.request mapping must switch to crm.lead with custom fields for operational data. FlitStack identifies whether maintenance.equipment is accessible at the start of the migration and configures the object mapping accordingly before any data loads run.

  • Novo multi-department permission model requires Odoo Record Rule configuration post-migration

    Novo Work Order implements department-level data isolation natively — each department's users see only work orders assigned to their department. Odoo CRM does not have a built-in department-ownership model for crm.lead or maintenance.request records. The closest equivalent is configuring Record Rules on the relevant model to restrict read/write access based on crm.team membership or a custom department field. This is an Odoo administrator task after data lands — FlitStack creates a custom department field on the target object and populates it from Novo's department_id, but the Record Rule logic itself requires Odoo Studio or Developer mode configuration.

  • Novo status pick-list values must be pre-created as Odoo stage records before import

    Odoo's stage-based workflow requires the stage records to exist before records that reference them are loaded. Novo status values (Open, In Progress, On Hold, Completed, Cancelled) are stored as free-text or pick-list values in the source system. FlitStack queries the Novo work order status distribution before migration, creates the corresponding maintenance.stage or crm.stage records in Odoo with matching names and sequence numbers, and only then begins importing work order records. If a Novo status value is added after this setup step, a new stage must be created before those records are imported to avoid a foreign-key error.

  • Odoo res.partner uses one table for both contacts and companies, creating N:N relationship complexity

    Novo separates customers and companies into distinct tables with a one-to-many relationship (one company has many customer contacts). Odoo collapses both into a single res.partner table with an is_company flag. Novo customer contacts without an associated company record in Novo land as res.partner records with is_company=False and no parent_id. Novo contacts that are company representatives need to be reviewed post-migration to determine whether to set is_company=True and create a parent partner record, or to link them via child_ids to a newly created company partner. This disambiguation step is surfaced in the migration plan.

  • Novo custom fields with pick-list type require Odoo Selection field option mapping

    Novo custom fields that store pick-list values (e.g., work_order_type, weather_condition, permit_required) use selection constraints in Novo's database. Migrating these as plain Char fields in Odoo loses the enforcement. FlitStack creates Odoo Selection fields with the exact same option values from Novo's definition. However, if a Novo pick-list value contains a character that Odoo's Selection field does not support (such as non-ASCII characters or symbols), the field is created as Char and a validation note is surfaced in the migration report for manual review.

Migration approach

Six steps for a successful Novo Work Order to Odoo CRM data migration

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

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

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

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

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

Context on both ends of the pair

Novo Work Order logo

Novo Work Order

Source

Strengths

  • Links work orders directly to physical assets and equipment for full maintenance history
  • Multi-department routing handles municipal organizational structures out of the box
  • Preventative maintenance scheduling reduces reactive repairs on infrastructure
  • Custom fields, forms, and workflows adapt to municipal compliance and reporting requirements
  • Mobile app allows field technicians to update work order status and log labor from the job site

Weaknesses

  • No public API documented — migration depends on built-in export functions and support coordination
  • Pricing is opaque — no self-service quotes, free tier, or published per-seat cost
  • Designed for municipal government use cases — lacks commercial field service contract and SLA features
  • Limited third-party integrations compared to modern FSM platforms
  • Reporting and analytics are built-in dashboards rather than a queryable data warehouse
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. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Novo Work Order and Odoo CRM.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • 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

    Novo Work Order: Not publicly documented.

  • Data volume sensitivity

    B

    Novo Work Order doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Novo Work Order 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 Novo Work Order to Odoo CRM data migrations

Answers to the questions buyers ask most during Novo Work Order to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most Novo Work Order to Odoo CRM migrations complete within 48–72 hours of clock time for setups with fewer than 10,000 work orders and 5,000 contacts. Larger migrations with 50,000+ work order records, multiple departments, or 15+ custom fields extend to 7–14 days. The longest planning step is configuring the Odoo Maintenance module and creating the stage/team schema before data loads begin — Odoo schema setup for departments and status stages is a prerequisite that adds 1–3 days to the overall timeline.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Novo Work Order.
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