CRM migration
Field-level mapping, validation, and rollback between BenchmarkONE and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
BenchmarkONE
Source
Odoo CRM
Destination
Compatibility
9 of 13
objects map 1:1 between BenchmarkONE and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
BenchmarkONE organizes records around Contacts with Temperature (lead scoring), Tags, and a built-in Deal Pipeline; Odoo CRM uses a Lead-to-Opportunity pipeline model where Leads convert into Opportunities attached to a Partner (the Odoo Account equivalent). We map BenchmarkONE Contacts directly to Odoo Partners, preserve the Temperature score as a custom field, and split the BenchmarkONE Deal Pipeline into Odoo CRM crm.lead records with a corresponding Pipeline and Stage configuration. Tags migrate to Odoo Tags or a many2many tag field on the partner model. Email campaign metadata and aggregate stats migrate to Odoo crm.activity.history. BenchmarkONE automations (triggered by form submissions, website visits, tag changes, or purchases) do not export as data; we deliver a written inventory of each active automation with a recommended Odoo ir.actions.server or base.automation equivalent so the customer's admin can rebuild them post-migration. The Odoo.sh migration service is not used for cross-platform data moves; we load directly via Odoo's XML-RPC or JSON-RPC API.
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 BenchmarkONE 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.
BenchmarkONE
Contact
Odoo CRM
Partner (res.partner)
1:1BenchmarkONE Contact records map to Odoo res.partner with type='contact'. Standard fields (name, email, phone, website, street, city, state, zip, country) map 1:1 to their Odoo counterparts. The BenchmarkONE Temperature field (Cold/Warm/Hot) maps to a custom integer field temperature_score__c where 0=Cold, 1=Warm, 2=Hot. Contact Status maps to partner.state_id (custom stage field). Assigned Sales Rep maps to Odoo User (user_id) via email lookup. Tags stored as a comma-separated list in BenchmarkONE become Odoo Tags (mailing.mailing contact) or a many2many tag field on res.partner, depending on how the customer intends to use them post-migration.
BenchmarkONE
Company
Odoo CRM
Partner (res.partner, type=company)
1:1BenchmarkONE Company records map to Odoo res.partner with type='company' and is_company=True. The company record is created first, then BenchmarkONE Contacts linked to that company receive the parent_id pointing to the company Partner record. Website, Industry, and custom company fields migrate as fields on the company Partner record. Address fields on Company migrate as address fields on the company Partner, and contact addresses on related Contact records reference the company as parent_id.
BenchmarkONE
Deal
Odoo CRM
Opportunity (crm.lead)
1:1BenchmarkONE Deals map to Odoo crm.lead records of type='opportunity'. The Deal name becomes the Opportunity subject, the deal amount maps to Odoo's expected_revenue or amount_currency fields, and the deal probability maps to probability (with stage-based defaults). We configure an Odoo crm.team pipeline with stages that match the BenchmarkONE pipeline stages before migration, so stage names and probabilities are pre-aligned. Deal custom fields migrate as custom fields on crm.lead via Odoo Studio.
BenchmarkONE
Deal Pipeline Stage
Odoo CRM
Pipeline Stage (crm.stage)
lossyEach BenchmarkONE Deal Pipeline stage becomes an Odoo crm.stage record within the crm.lead model. Stage order, name, and probability percentage migrate directly. The Odoo pipeline uses crm.team to scope which stages are visible to which sales team, which allows multi-team setups that BenchmarkONE's single pipeline model does not support.
BenchmarkONE
Task
Odoo CRM
Task (project.task)
1:1BenchmarkONE Tasks map to Odoo project.task records linked via project_id (a shared Project record serving as the task container). Standard fields (subject, date_deadline, user_id, stage_id, priority, description) map directly. Tasks associated with a specific Contact or Deal receive a res_model='crm.lead' and res_id pointing to the migrated Opportunity record. Tasks without a parent record are attached to the default project container.
BenchmarkONE
Tag
Odoo CRM
Tag (mailing.mailing contact) or many2many field
lossyBenchmarkONE tags are free-form string labels applied to contacts for segmentation. We implement them as Odoo mailing.contact tags (mailing.mailing contact model) if the customer intends to use Odoo's Email Marketing app for campaign audience segmentation. Alternatively, we create a custom many2many tag field (benchmarkone_tags) on res.partner. The customer chooses during scoping; tags used primarily for CRM segmentation (not email marketing) typically use the custom field approach to avoid unintended mailing list inclusion.
BenchmarkONE
Custom Fields
Odoo CRM
Custom Fields (ir.model.fields via Odoo Studio)
lossyBenchmarkONE custom fields on Contact, Company, and Deal records map to Odoo custom fields on res.partner and crm.lead via Odoo Studio. We audit field types during scoping (text, number, date, dropdown) and create matching field types in Odoo before migration begins. Dropdown fields in BenchmarkONE become Odoo selection fields; multi-select fields become many2many fields pointing to a dedicated tag model. Date and datetime fields require timezone normalization to UTC before Odoo import. This is the highest-risk schema step because mismatched field types silently reject or corrupt imported values.
BenchmarkONE
Email Campaign
Odoo CRM
Activity History (crm.activity + mail.mail.statistics)
1:1BenchmarkONE stores email campaign metadata (name, send date, audience count, template name) and aggregate stats (opens, clicks, bounces, unsubscribes). We map these to Odoo crm.activity records linked to the target Partner records, and aggregate stats migrate as mail.mail.statistics records on the Partner. Individual email event logs (per-recipient open and click timestamps) require separate extraction from BenchmarkONE and are stored as notes or activity descriptions in Odoo because Odoo's standard CRM does not include a per-event email analytics table.
BenchmarkONE
Email Activity
Odoo CRM
Mail Message (mail.message)
1:1BenchmarkONE stores individual email interactions logged against contacts as email activity records. These migrate as Odoo mail.message records with model='res.partner' and res_id pointing to the target Partner. Body content, timestamp, and direction (inbound/outbound) migrate directly. Odoo's Discuss app surfaces these as conversation threads on the Partner record.
BenchmarkONE
Social Profiles
Odoo CRM
Partner Social Fields (res.partner)
1:1BenchmarkONE stores social profile URLs (LinkedIn, Twitter, Facebook, Instagram) as fields on the Contact record. These map to Odoo res.partner social fields (social_twitter, social_linkedin, social_facebook, social_instagram). Odoo surfaces these in the Partner form view under a Social Media section.
BenchmarkONE
Lead Source
Odoo CRM
Source Tag or Char Field (crm.lead)
1:1BenchmarkONE Lead Source (website, referral, event, paid ad, organic search, other) maps to a selection field or char field source_id on Odoo crm.lead. We preserve the original label so that pipeline reports can be filtered by acquisition channel at destination. If the customer uses UTM-based attribution, we map the utm.source, utm.medium, and utm.campaign from BenchmarkONE to Odoo's utm.lead.mixin fields.
BenchmarkONE
Owner / Sales Rep
Odoo CRM
User (res.users)
1:1BenchmarkONE assigns users (sales reps) as owners to Contacts, Companies, Deals, and Tasks via an Assigned Sales Rep field. We resolve each distinct owner by email against the Odoo res.users table. Any BenchmarkONE Owner without a matching Odoo User is placed in a reconciliation queue for the customer's admin to provision before record import resumes. Owner ID resolution is a blocking dependency for Contacts and Deals because Odoo requires a valid user_id on crm.lead and res.partner.
BenchmarkONE
Automations / Workflows
Odoo CRM
Server Actions (ir.actions.server)
lossyBenchmarkONE automations are triggered by form submissions, link clicks, website visits, tag changes, or purchases. These are platform-specific workflow constructs that do not export as data. We audit each active automation during discovery (trigger type, conditions, actions) and deliver a written inventory mapping each automation to an Odoo ir.actions.server, base.module.record rule, or mail.activity.type configuration. The customer or an Odoo implementation partner rebuilds them in Odoo's automation framework post-migration. This is documented reconstruction, not a data migration.
| BenchmarkONE | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Partner (res.partner)1:1 | Fully supported | |
| Company | Partner (res.partner, type=company)1:1 | Fully supported | |
| Deal | Opportunity (crm.lead)1:1 | Fully supported | |
| Deal Pipeline Stage | Pipeline Stage (crm.stage)lossy | Fully supported | |
| Task | Task (project.task)1:1 | Fully supported | |
| Tag | Tag (mailing.mailing contact) or many2many fieldlossy | Fully supported | |
| Custom Fields | Custom Fields (ir.model.fields via Odoo Studio)lossy | Mapping required | |
| Email Campaign | Activity History (crm.activity + mail.mail.statistics)1:1 | Fully supported | |
| Email Activity | Mail Message (mail.message)1:1 | Fully supported | |
| Social Profiles | Partner Social Fields (res.partner)1:1 | Fully supported | |
| Lead Source | Source Tag or Char Field (crm.lead)1:1 | Fully supported | |
| Owner / Sales Rep | User (res.users)1:1 | Fully supported | |
| Automations / Workflows | Server Actions (ir.actions.server)lossy | Mapping required |
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.
BenchmarkONE gotchas
Admin-only database export locks down data access
Contact-tier pricing means record count directly impacts billing
Email sending limits are tied to plan tier, not contact count
API requires SSL and JSON media type with no documented rate limits
Automations are BenchmarkONE-native and require manual reconstruction at 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 Odoo edition selection
We audit the BenchmarkONE portal across tier (Free/Lite/Pro), contact count, company count, deal count, tag inventory, custom field definitions, active automations, and engagement volume. We pair this with an Odoo edition assessment: Standard ($31.10/user/month) covers most CRM migrations; Custom ($46.80/user/month) is required if the customer needs custom modules, advanced automation, or multi-company support. We also confirm whether the customer plans to use Odoo.sh (cloud-hosted) or an on-premise Odoo deployment, as this determines the API access method (XML-RPC vs direct database). The discovery output is a written migration scope document and an Odoo edition recommendation.
Schema design and Odoo Studio configuration
We design the destination schema in Odoo before any data moves. This includes creating custom fields on res.partner and crm.lead via Odoo Studio (matching BenchmarkONE custom field types and names), configuring crm.lead stage pipeline with stages mapped to BenchmarkONE Deal stages, setting up crm.team for multi-sales-team scoping, creating the temperature_score custom field with selection values Cold/Warm/Hot, and mapping the Odoo Lead-to-Opportunity convert wizard to preserve all custom fields during conversion. Schema is validated in an Odoo staging database before production deployment.
Staging migration and reconciliation
We run a full migration into an Odoo staging environment (test database or Sandbox equivalent) using production-like data volume. The customer reconciles record counts across all objects (Contacts in, Partners out; Companies in, company Partners out; Deals in, Opportunities out; Tasks in), spot-checks 25-50 random records against the BenchmarkONE source, and validates that Temperature scores, tags, and custom field values are present and correct in Odoo. Mapping corrections happen at this stage. Any Odoo ir.model.field or stage configuration issues are resolved before production migration begins.
Owner reconciliation and Odoo user provisioning
We extract every distinct BenchmarkONE user assigned as owner to Contact, Company, Deal, or Task and match by email against the Odoo res.users table. Any BenchmarkONE Owner without a matching Odoo User is placed in a reconciliation queue. The customer's Odoo admin provisions missing Users (with active=True or active=False depending on whether the rep is still employed and will use the system). OwnerId resolution is required before Contact and Deal migration can proceed because Odoo enforces a valid user_id on crm.lead records.
Production migration in dependency order
We run production migration in record-dependency order: Partners (company type from BenchmarkONE Companies first, then contact type), crm.lead records (from BenchmarkONE Deals, with stage_id and team_id pre-configured), project.task (from BenchmarkONE Tasks, with parent_id linking to crm.lead), mail.message records (from BenchmarkONE email activity), Tags (mailing contacts or many2many field per scoping choice), Custom field values (validated against Odoo field type), and Lead Source / UTM attribution. Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC or JSON-RPC API with batch chunking and exponential backoff on 403/429 responses.
Cutover, validation, and automation rebuild handoff
We freeze BenchmarkONE 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 validate a sample of records post-cutover (record counts, custom field presence, owner assignment). We deliver the BenchmarkONE automation inventory document with Odoo ir.actions.server recommendations to the customer's Odoo admin team. We offer a one-week hypercare window to resolve any data issues surfaced by the sales team. We do not rebuild BenchmarkONE automations as Odoo Server Actions inside the migration scope; that is a separate Odoo implementation engagement.
Platform deep dives
BenchmarkONE
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 BenchmarkONE 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
BenchmarkONE: Not publicly documented.
Data volume sensitivity
BenchmarkONE 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 BenchmarkONE to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your BenchmarkONE 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 BenchmarkONE
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.