CRM migration

Migrate from Net-Results to Odoo CRM

Field-level mapping, validation, and rollback between Net-Results and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

Net-Results logo

Net-Results

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

69%

11 of 16

objects map 1:1 between Net-Results and Odoo CRM.

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Net-Results to Odoo CRM is a schema translation, not a direct record copy. Net-Results stores Contacts and Companies as separate objects with a flat relationship; Odoo CRM uses the res.partner model where a partner record can be a person or an organization, and crm.lead handles both unqualified leads and qualified opportunities in a unified model. We resolve that structural difference during scoping by creating separate partner records for companies (with company_type=company) and contacts (with parent_id linking to the company partner), then map active Deals from Net-Results to crm.lead records with lead_type=opportunity and stage values from the destination pipeline. Email, call, meeting, and task engagements migrate as mail.message and mail.activity records threaded to the correct partner and lead. Workflow automation logic cannot export from Net-Results; we deliver a written inventory of every active workflow with trigger, conditions, and recommended Odoo server action equivalent for the customer's admin to rebuild. Suppression lists merge with existing partner opt-out records by email dedupe during the post-load cleanup pass.

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

Net-Results logo

Net-Results

What's pushing teams away

  • Marketing automation workflow logic is not easily portable, making it difficult to migrate complex campaigns when switching platforms.
  • Limited depth in CRM features compared to full-suite platforms means teams requiring advanced sales pipeline management often outgrow the product.
  • Template HTML structures may not transfer cleanly to other platforms, requiring rebuilds when migrating email assets.

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 Net-Results objects map to Odoo CRM

Each row shows how a Net-Results 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.

Net-Results

Contact

maps to

Odoo CRM

res.partner

1:1
Fully supported

Net-Results Contacts map to Odoo res.partner records with partner_type=contact. Standard fields (name, email, phone, website, street, city, state, zip, country) migrate directly. Lifecycle metadata and custom contact fields map to res.partner custom fields created via Odoo Studio or XML during schema setup. Opt-out status from Net-Results suppression records maps to opt_out=True on the res.partner. Email address serves as the dedupe key during import to prevent duplicate partner creation.

Net-Results

Company

maps to

Odoo CRM

res.partner (company_type=company)

1:1
Fully supported

Net-Results Companies map to Odoo res.partner records with company_type=company. This is a structural split from Net-Results where Contacts and Companies live as peers. In Odoo, the company partner is created first, then linked Contacts reference it via parent_id. The company domain becomes the partner's website field and is used as the dedupe key during import. Any custom company fields map to res.partner custom fields.

Net-Results

Company (linked contact resolution)

maps to

Odoo CRM

res.partner.parent_id

1:1
Fully supported

Net-Results Contacts with a linked Company record create res.partner contacts with parent_id pointing to the matching company partner. We resolve the company partner reference at migration time using the company domain or company_id lookup. If no matching company partner exists in Odoo, we create the company partner first before importing the linked contacts.

Net-Results

Deal

maps to

Odoo CRM

crm.lead (lead_type=opportunity)

1:1
Fully supported

Net-Results Deals map to Odoo crm.lead records with lead_type=opportunity. The deal name becomes crm.lead name, deal amount becomes expected_revenue, deal stage maps to crm.stage (we configure stage values during schema setup to match the source pipeline), and closing date maps to date_deadline. Partner_id links the opportunity to the res.partner Account (company partner). Team_id and user_id resolve from Net-Results owner by email lookup against Odoo Users.

Net-Results

Deal Stage

maps to

Odoo CRM

crm.stage

lossy
Fully supported

Net-Results Deal stages map to Odoo crm.stage records within a specific crm.team. Each stage gets a name, sequence order, and probability percentage matching the source pipeline. Stages are scoped per team in Odoo, so multi-pipeline Net-Results accounts require multiple crm.team and stage configurations. We configure this during the schema setup phase.

Net-Results

Campaign

maps to

Odoo CRM

crm.lead.tag + crm.team

1:many
Fully supported

Net-Results Campaigns map to crm.lead.tag records (for campaign classification on leads and opportunities) and optionally to crm.team records if the campaign represents a sales team or business unit. Campaign metadata (name, status, start and end dates, type) is preserved in tag description fields and the team record name. Customers choosing tag-based mapping can query leads by campaign across the pipeline.

Net-Results

Email Send

maps to

Odoo CRM

mail.message (mail_message_subtype)

1:1
Fully supported

Net-Results Email Send events (send timestamps, open events, click events, bounce codes) migrate as mail.message records linked to the res.partner recipient. Send events use mail_message_subtype=mail.mt_comment for sends and comment threads for opens and clicks. Bounce codes map to a custom field on mail.message for bounce classification. Note that Odoo does not have a native bulk email send model; this migration preserves the historical record of what was sent and how recipients engaged, not the send infrastructure itself.

Net-Results

Email Template

maps to

Odoo CRM

mail.template

1:1
Fully supported

Net-Results email template HTML and asset references export to Odoo mail.template records. However, the Net-Results drag-and-drop rendering engine produces HTML that may reflow when pasted into Odoo's QWeb template engine. We export all template assets and HTML, flag each template for manual review post-migration, and advise customers to preview email sends before launching imported templates in Odoo campaigns.

Net-Results

Engagement: Call

maps to

Odoo CRM

mail.activity (activity_type_id=call)

1:1
Fully supported

Net-Results call engagements migrate as mail.activity records with activity_type_id referencing the built-in Phonecall activity type (or a custom call type if configured in Odoo). Call duration, disposition, and recording URL preserve in custom activity fields. Activity date and responsible user map from the Net-Results engagement timestamp and owner.

Net-Results

Engagement: Meeting

maps to

Odoo CRM

calendar.event

1:1
Fully supported

Net-Results meeting engagements map to Odoo calendar.event records. Event name, start datetime, end datetime, location, and attendee list (mapped to res.partner records via email lookup) preserve. Odoo calendar.event automatically creates related mail.message records in the partner and lead activity threads. Attendee status (accepted, declined, tentative) migrates as calendar.attendee state.

Net-Results

Engagement: Note

maps to

Odoo CRM

note.note

1:1
Fully supported

Net-Results Notes attached to Contacts or Companies migrate as Odoo note.note records. The note body (rich text) migrates as the note content, and the related res.partner or crm.lead reference preserves via res_model and res_id on the note. Notes with an assigned owner map to the matching Odoo User via email lookup.

Net-Results

Suppression List

maps to

Odoo CRM

res.partner.opt_out + mail.black_list

1:1
Fully supported

Net-Results suppression records (hard bounces, unsubscribes, manually suppressed contacts) merge with existing Odoo partner records by email address dedupe. Active contacts in Odoo receive opt_out=True on res.partner. Hard bounces also add the email address to mail.black_list to block future Odoo mailings. We run the suppression merge as a post-load cleanup pass after all contact records are imported, deduplicating against any existing suppression records in the destination to avoid false opt-out flags on valid active contacts.

Net-Results

Automation Workflow

maps to

Odoo CRM

IrActionsServer + AutomatedAction

lossy
Fully supported

Net-Results workflow automation logic cannot be exported as a portable artifact. We capture workflow name, associated contact enrollment count, step count metadata, and which contacts were enrolled in each workflow. This data becomes a written rebuild guide for Odoo IrActionsServer automated actions or base.automation rules. The customer or an Odoo implementation partner rebuilds the trigger-and-action logic post-migration. Workflow enrollment data itself migrates as a custom partner field tracking which workflow each contact participated in.

Net-Results

Custom Field (Contact)

maps to

Odoo CRM

res.partner custom field

lossy
Fully supported

Net-Results custom fields on Contacts require explicit mapping against Odoo res.partner during discovery. We inventory all custom fields, classify by data type (text, number, date, picklist, checkbox), and create matching custom fields on res.partner via Odoo Studio or custom module XML before contact import begins. Multi-select picklists in Net-Results map to Odoo many2many or selection fields depending on whether values are open or closed sets.

Net-Results

Custom Field (Company)

maps to

Odoo CRM

res.partner custom field (company_type=company)

lossy
Fully supported

Net-Results custom fields on Companies map to Odoo res.partner custom fields on the company partner record. Type mapping follows the same logic as contact custom fields. If a custom company field references a related contact or external ID, we preserve it as a Char field and flag for manual review if the relationship cannot be resolved as a native Odoo many2one.

Net-Results

Owner

maps to

Odoo CRM

res.users

1:1
Fully supported

Net-Results Owners (users who own Contacts, Companies, Deals) resolve by email match against Odoo res.users. We extract every distinct owner email from Net-Results records and cross-reference the destination Odoo User list. Owners without a matching Odoo User enter a reconciliation queue for the customer's Odoo admin to provision before record import resumes. OwnerId references on Deals and Contacts cannot insert until User resolution is complete.

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.

Net-Results logo

Net-Results gotchas

High

Workflow automation logic cannot be exported

Medium

Email template HTML may not render identically in destination systems

Medium

Suppression lists must be explicitly merged at the destination

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

  • Contact and Company split requires schema design before import

    Net-Results stores Contacts and Companies as separate, peer-level objects. Odoo CRM uses a single res.partner model where company_type=company distinguishes organizational partners from person partners, and contacts link to companies via parent_id. If contacts and companies are imported without this split designed upfront, contact records end up without a parent company link, and duplicate company records may be created. We design the Contact-Company split during the discovery phase, create the company partners first, then import contacts with the parent_id resolved before any contact insert runs.

  • Odoo crm.lead handles both Leads and Opportunities

    Net-Results Deal records have no direct Odoo equivalent because Odoo CRM uses crm.lead for both unqualified leads and qualified opportunities. We map Net-Results Deals to crm.lead with lead_type=opportunity, but leads in Net-Results (Contacts not yet attached to a Deal) require a decision during scoping: should they land as crm.lead with lead_type=lead, or as res.partner records with a custom lead flag? We define this mapping during discovery so the Odoo schema reflects the intended data model before any records migrate.

  • Email template HTML does not render identically in Odoo

    Net-Results uses a proprietary drag-and-drop email builder that generates platform-specific HTML. When this HTML is imported into Odoo mail.template (which uses QWeb rendering), layout breaks, image references reflow, and inline styles misalign. We export the template HTML and asset URLs, but we flag every template for manual review post-migration. Customers should preview imported templates with a test send before launching campaigns from migrated assets. This is a pair-specific gotcha because it is specific to the Net-Results template engine, not to Odoo as a general destination.

  • Suppression list merge requires post-load pass after contact import

    Net-Results suppression records (hard bounces, unsubscribes, manually suppressed contacts) must merge against the newly imported Odoo res.partner records by email address. If suppression records are applied during contact import, opt_out flags may be lost on records that already exist in Odoo and were skipped during dedupe. We run suppression merge as a dedicated post-load pass after all contacts and company partners are imported, cross-referencing mail.black_list and res.partner.opt_out to ensure no valid active contact is incorrectly flagged as opted out.

  • Automation workflow logic cannot migrate and must be rebuilt

    Net-Results does not expose a portable export for automation workflow definitions. The trigger-and-action logic that runs in Net-Results must be rebuilt in Odoo using IrActionsServer automated actions or base.automation rules. We capture workflow metadata (name, enrollment count, step count) and produce a written rebuild guide, but the automation logic itself is not a migration deliverable. This is consistent with FlitStack AI's standard scope for workflow and automation migration.

Migration approach

Six steps for a successful Net-Results to Odoo CRM data migration

  1. Discovery and schema mapping

    We audit the Net-Results portal for record counts across Contacts, Companies, Deals, Campaigns, Email Sends, and custom fields. We inventory all active automation workflows and suppression lists. We pair this with a review of the target Odoo CRM instance: installed apps, existing res.partner records, existing crm.lead data, crm.team structure, and crm.stage values. The discovery output is a written migration scope including the Contact-Company split design, the Lead-Opportunity mapping rule, custom field type mappings, and the automation rebuild handoff plan.

  2. Schema setup in Odoo

    We create custom fields on res.partner and crm.lead for all Net-Results custom contact and company fields. We configure crm.team records matching the source Net-Results pipeline structure. We create crm.stage values with sequence and probability matching the source Deal stages. If multi-company Odoo is in use, we configure the relevant company_id scope on all target fields. Schema setup runs in a staging Odoo database first for validation before production migration begins.

  3. Sandbox migration and reconciliation

    We run a full migration into an Odoo test database using production-like data volume. The customer's Odoo admin reconciles record counts (partners in, leads in, opportunities in), spot-checks 20-40 random records against the Net-Results source, and validates that the Contact-Company parent_id chain is intact. The suppression merge pass is tested by loading suppressed contacts and confirming opt_out=True. Any mapping corrections happen in this phase.

  4. Owner reconciliation and User provisioning

    We extract every distinct Net-Results Owner referenced on Contact, Company, and Deal records and match by email against the Odoo destination's res.users table. Owners without a matching Odoo User enter a reconciliation queue for the customer's admin to provision. Migration cannot proceed past contact and deal import until owner resolution is complete because OwnerId references on crm.lead require a valid res.users record.

  5. Production migration in dependency order

    We run production migration in record-dependency order: company partners (res.partner with company_type=company) first, then contact partners with parent_id linking to companies, then suppression merge (opt_out=True and mail.black_list), then crm.lead records for active Deals (with lead_type=opportunity, partner_id, team_id, and user_id resolved), then Email Send history (mail.message records), then call and meeting activities (mail.activity and calendar.event), then Notes. Each phase emits a row-count reconciliation report before the next phase begins.

  6. Cutover, validation, and automation rebuild handoff

    We freeze Net-Results writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver the automation rebuild guide documenting every Net-Results workflow with trigger, conditions, and recommended Odoo equivalent. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. Workflow rebuild, report recreation, and user training are outside the migration scope and are handled by the customer's Odoo admin or an Odoo implementation partner.

Platform deep dives

Context on both ends of the pair

Net-Results logo

Net-Results

Source

Strengths

  • Drag-and-drop email builder with dozens of responsive templates
  • Granular sync control specifying direction, timing, and source-of-truth
  • JSON API with hundreds of CRUD methods across objects
  • Strong deliverability and activity tracking (opens, clicks, bounces)
  • Responsive customer support consistently praised in reviews

Weaknesses

  • Workflow automation logic is not exportable and must be manually recreated at the destination
  • Complex CRM features like advanced pipeline management are limited compared to enterprise CRMs
  • Email template HTML may require reformatting when migrating to non-Net-Results platforms
  • Limited public documentation on API rate limits and bulk export capabilities
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. 2 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 Net-Results and Odoo CRM.

  • Object compatibility

    B

    2 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

    Net-Results: Not publicly documented — no published numeric rate limits on the marketing site. Confirm via vendor support before high-volume operations..

  • Data volume sensitivity

    B

    Net-Results doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Net-Results 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 Net-Results to Odoo CRM data migrations

Answers to the questions buyers ask most during Net-Results to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Net-Results to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between four and eight weeks for accounts under 20,000 Contacts and 4,000 Deals with no custom objects and a clean suppression list. Migrations with custom objects, multi-pipeline Deal structures, large engagement histories (over 300,000 activity records), or existing Odoo data requiring deduplication move to eight to fourteen weeks because of parent-record lookup resolution, the suppression list merge pass, and the Contact-Company split design work during discovery.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Net-Results.
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