CRM migration
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
Source
Odoo CRM
Destination
Compatibility
11 of 16
objects map 1:1 between Net-Results and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
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.
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 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
Odoo CRM
res.partner
1:1Net-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
Odoo CRM
res.partner (company_type=company)
1:1Net-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)
Odoo CRM
res.partner.parent_id
1:1Net-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
Odoo CRM
crm.lead (lead_type=opportunity)
1:1Net-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
Odoo CRM
crm.stage
lossyNet-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
Odoo CRM
crm.lead.tag + crm.team
1:manyNet-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
Odoo CRM
mail.message (mail_message_subtype)
1:1Net-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
Odoo CRM
mail.template
1:1Net-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
Odoo CRM
mail.activity (activity_type_id=call)
1:1Net-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
Odoo CRM
calendar.event
1:1Net-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
Odoo CRM
note.note
1:1Net-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
Odoo CRM
res.partner.opt_out + mail.black_list
1:1Net-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
Odoo CRM
IrActionsServer + AutomatedAction
lossyNet-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)
Odoo CRM
res.partner custom field
lossyNet-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)
Odoo CRM
res.partner custom field (company_type=company)
lossyNet-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
Odoo CRM
res.users
1:1Net-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.
| Net-Results | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company_type=company)1:1 | Fully supported | |
| Company (linked contact resolution) | res.partner.parent_id1:1 | Fully supported | |
| Deal | crm.lead (lead_type=opportunity)1:1 | Fully supported | |
| Deal Stage | crm.stagelossy | Fully supported | |
| Campaign | crm.lead.tag + crm.team1:many | Fully supported | |
| Email Send | mail.message (mail_message_subtype)1:1 | Fully supported | |
| Email Template | mail.template1:1 | Fully supported | |
| Engagement: Call | mail.activity (activity_type_id=call)1:1 | Fully supported | |
| Engagement: Meeting | calendar.event1:1 | Fully supported | |
| Engagement: Note | note.note1:1 | Fully supported | |
| Suppression List | res.partner.opt_out + mail.black_list1:1 | Fully supported | |
| Automation Workflow | IrActionsServer + AutomatedActionlossy | Fully supported | |
| Custom Field (Contact) | res.partner custom fieldlossy | Fully supported | |
| Custom Field (Company) | res.partner custom field (company_type=company)lossy | Fully supported | |
| Owner | res.users1: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.
Net-Results gotchas
Workflow automation logic cannot be exported
Email template HTML may not render identically in destination systems
Suppression lists must be explicitly merged at the destination
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
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.
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.
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.
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.
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.
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
Net-Results
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Net-Results and Odoo CRM.
Object compatibility
2 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
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
Net-Results 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 Net-Results to Odoo CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Net-Results
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.