CRM migration

Migrate from OneHash CRM to Odoo CRM

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

OneHash CRM logo

OneHash CRM

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between OneHash CRM and Odoo CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from OneHash CRM to Odoo CRM is a migration between two ERP-forked platforms with overlapping ancestry but divergent object models. OneHash inherits ERPNext's DocType architecture — a document-centric model where Leads, Contacts, Customers, Quotations, and Sales Orders are separate document types with rich custom-field support. Odoo uses its own object hierarchy where Leads and Opportunities share the crm.lead model, Contacts are res.partner records, and Quotations and Sales Orders are both sale.order records distinguished by state. We handle the schema translation between these models, including the res.partner split between company-level and person-level records, the DocType-to-object type resolution, and the custom field mapping that OneHash's ERPNext inheritance makes necessary. Attachment migration, INR-to-USD pricing conversion during scoping, and Odoo's XML-RPC API access requirements are surfaced early so teams are not surprised at cutover.

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

OneHash CRM logo

OneHash CRM

What's pushing teams away

  • Initial complexity requires a steep learning curve — G2 reviewers note the software is 'initially complex' even if it becomes usable with practice.
  • Performance and loading issues reported on larger datasets suggest the platform does not scale as smoothly as enterprise-grade alternatives.
  • Limited documentation and unclear API specifications make custom integrations and data extraction difficult without developer involvement.
  • Businesses with purely US or European operations may find the India-market pricing structure and rupee billing cumbersome for budgeting and invoicing.
  • Some reviewers note the platform's aggressive sales outreach via Calendly and spam booking calls creates a negative first impression, driving early churn.

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

Each row shows how a OneHash CRM 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.

OneHash CRM

Lead

maps to

Odoo CRM

crm.lead

1:1
Fully supported

OneHash Lead DocType maps directly to Odoo crm.lead with type=lead. We map lead_name to name, status to stage_id (with a stage-name map built from Odoo's default CRM stages), source to source_id, and notes to description. Custom fields on the Lead DocType migrate to custom crm.lead fields (ir.model.fields with model=crm.lead) created before import. Lead-to-Contact conversion linkage is preserved as a tag or note so the relationship is auditable in Odoo even though Odoo handles the conversion differently.

OneHash CRM

Contact

maps to

Odoo CRM

res.partner

1:1
Fully supported

OneHash Contact records map to Odoo res.partner where is_company=False. We map first_name and last_name to firstname and lastname, email to email, phone to phone, and organization linkage to parent_id (pointing to the Customer partner record). Contact addresses nested within the Contact DocType in OneHash extract to separate res.partner address records linked via type (invoice, delivery, contact). OneHash contact custom fields map to res.partner custom fields.

OneHash CRM

Customer

maps to

Odoo CRM

res.partner

1:1
Fully supported

OneHash Customer (organization-level) DocType maps to Odoo res.partner where is_company=True. The customer name maps to name, billing and shipping addresses map to child partner records with type=invoice or type=delivery, and any linked Contacts attach via child_ids. OneHash Customer custom fields (industry, annual_revenue, company_size) map to res.partner custom fields on the company partner.

OneHash CRM

Opportunity

maps to

Odoo CRM

crm.lead

1:1
Fully supported

OneHash Opportunity DocType maps to Odoo crm.lead with type=opportunity. The opportunity amount maps to planned_revenue, probability to probability (0-100 integer), stage to stage_id (via a stage-name map), party information to partner_id (res.partner lookup resolved after the Customer/Contact migration phase), and pipeline assignment to team_id. The pipeline stage ordering migrates via a stage-sequence map applied after the crm.lead import completes.

OneHash CRM

Quotation

maps to

Odoo CRM

sale.order

1:1
Fully supported

OneHash Quotation DocType maps to Odoo sale.order in state=draft (Odoo treats quotations as draft sale orders). Quotation line items (Items with pricing, tax templates, and quantities) map to sale.order.line with Product2 references resolved after the product catalog migration phase. Tax templates from OneHash map to Odoo account.tax. The quotation-to-opportunity linkage is preserved in sale.order.description as a reference tag since Odoo does not natively store the opportunity link on sale.order; this is documented in the migration inventory for the customer's admin to configure via Odoo's CRM link if needed.

OneHash CRM

Sales Order

maps to

Odoo CRM

sale.order

1:1
Fully supported

OneHash Sales Order DocType maps to Odoo sale.order in state=sale (confirmed order). Order item rows map to sale.order.line with quantity, price_unit, discount, and tax resolved. OneHash order status flags (delivery status, billing status) have no direct Odoo equivalents on sale.order; we preserve these as custom fields so the customer's admin can map them to stock.picking state or account.move state post-migration if needed.

OneHash CRM

Item

maps to

Odoo CRM

product.product

1:1
Fully supported

OneHash Item DocType maps to Odoo product.product. Standard fields (item_name to name, item_code to default_code, unit_of_measure to uom_id) migrate directly. Custom Item fields specific to the business (weight, dimensions, supplier, HS codes) map to product.product custom fields created before import. OneHash pricing data (price_list rates) maps to product.pricelist.item entries against the standard Odoo pricelist.

OneHash CRM

Project

maps to

Odoo CRM

project.project

1:1
Fully supported

OneHash Project DocType maps to Odoo project.project. Project name, description, start and end dates, and status (open vs completed) migrate directly. Tasks within the project map to project.task with parent_id hierarchy preserved. Task assignees (Employee DocType references) map to project.task user_id via the Odoo User resolution pass. Open vs completed status is preserved; task comments map to project.task description notes.

OneHash CRM

Employee

maps to

Odoo CRM

hr.employee

1:1
Fully supported

OneHash Employee DocType maps to Odoo hr.employee. Designation maps to job_id (linked to hr.job), department to department_id (linked to hr.department), and compensation records to hr.contract on the employee. We preserve org-chart parent_id relationships and effective-dated contract records as a separate mapping layer. Employee custom fields migrate to hr.employee custom fields created in the destination Odoo database before import.

OneHash CRM

Chart of Accounts

maps to

Odoo CRM

account.account

1:1
Mapping required

OneHash Chart of Accounts DocType maps to Odoo account.account. Account names, types (asset, liability, equity, income, expense), and parent-child hierarchy (parent_account) migrate directly. Account numbers are preserved in code where the destination supports them. This migration scope is scoped to the account master records only; Odoo requires chart of accounts initialization via the setup wizard which the customer's accountant completes; the migration provides the account list for manual entry or CSV import via Odoo's accounting setup.

OneHash CRM

Custom DocType

maps to

Odoo CRM

Custom Object

1:1
Fully supported

OneHash custom DocTypes (ERPNext-style documents created via Customize Form) require schema discovery before mapping. We introspect each custom DocType's field definitions via the OneHash API during the discovery pass, then pre-create matching Odoo models (ir.model), fields (ir.model.fields), and menu items in the destination Odoo database. Custom DocType relationships to standard DocTypes (e.g., a custom field on Lead linking to a custom Customer extension) map to Odoo many2one or many2many fields created alongside the standard object mapping.

OneHash CRM

Attachment

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

Documents attached to any OneHash DocType migrate as ir.attachment records in Odoo. We extract the binary blob, preserve the original filename, and link via res_model and res_id to the migrated parent record (crm.lead, res.partner, sale.order, etc.). Large attachments (over 10 MB) require chunked download from OneHash and chunked upload to Odoo. File storage backend in the destination Odoo instance (file on disk, S3, database) is confirmed during scoping so that the migration pipeline is configured correctly before attachments are processed.

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.

OneHash CRM logo

OneHash CRM gotchas

Medium

OneHash is a fork of ERPNext with Indian-market pricing

Medium

Annual billing is mandatory for paid plans above the free tier

High

No publicly documented API rate limits or bulk export endpoints

Medium

Custom Fields are DocType-specific and require schema discovery

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

  • OneHash ERPNext DocType model does not map directly to Odoo objects

    OneHash is an ERPNext fork and uses the ERPNext DocType architecture — every entity type is a DocType with its own schema, custom fields, and API endpoint. Odoo uses a different object model where Leads and Opportunities share crm.lead, Contacts and Customers are both res.partner (distinguished by is_company), and Quotations and Sales Orders are the same sale.order object in different states. The DocType-to-object translation is not a simple rename; it requires understanding which DocTypes merge into a single Odoo object, which split into multiple, and how cross-DocType custom fields map to Odoo custom fields. We run a pre-migration DocType discovery pass that enumerates every custom field and DocType in the OneHash instance before we design the Odoo schema.

  • No published OneHash API rate limits or bulk export endpoints

    OneHash does not publish API rate limits or a dedicated bulk/batch export API in its public documentation. The platform inherits ERPNext's REST API but exposes it inconsistently across DocTypes, and some custom DocTypes may use different endpoint conventions than standard ERPNext. We discover rate limits dynamically during migration by monitoring 429 responses and backing off with exponential retry. For record volumes above 10,000, we request a read-only API key with elevated limits from OneHash support before migration begins. If OneHash support does not respond or cannot provide elevated access, migration scope is adjusted to smaller batch sizes with longer execution windows.

  • Odoo uses XML-RPC/JSON-RPC, not REST — different library and response handling

    Odoo's external API uses XML-RPC or JSON-RPC (kwrpc endpoint) with a session-based authentication model (database + login + password), not OAuth2 REST as commonly used in modern SaaS. Our migration pipeline includes Odoo-specific XML-RPC client code for record creation, search, and batch operations. Response formats differ from REST — Odoo returns structured arrays and dictionaries that require different parsing than JSON REST responses. We handle authentication session management, database context switching, and model binding per Odoo's XML-RPC conventions.

  • Custom fields in OneHash are DocType-specific and require schema discovery

    OneHash allows unlimited custom fields per DocType via ERPNext's Customize Form tool. These fields do not appear in standard API responses unless explicitly requested and are not listed in any public schema registry. We run a pre-migration discovery pass that introspects each DocType's custom field definitions via the API before mapping, ensuring no custom property is dropped during export. Custom field values that reference other DocTypes (e.g., a custom field on Lead linking to a custom Customer extension) require cross-DocType dependency resolution before import.

  • Odoo requires schema initialization before data import — migration is not a pure data load

    Odoo enforces referential integrity at the ORM level, meaning that parent records (res.partner, product.product, account.account) must exist before child records referencing them are imported. The Chart of Accounts requires initialization via Odoo's accounting setup wizard before account.account records can be created via the API. We sequence the migration in strict dependency order: partner and product masters first, then crm.lead, then sale.order, then attachments, then custom objects last. Attempting to import before schema initialization causes validation errors and record rejection.

Migration approach

Six steps for a successful OneHash CRM to Odoo CRM data migration

  1. Discovery and DocType inventory

    We audit the source OneHash instance across all active DocTypes, custom fields per DocType, record counts per DocType, attachment volumes, and any custom scripts or server-side hooks that modify DocType behavior. We run the schema discovery pass against each DocType's API endpoint to enumerate custom field names, types, and options. We also confirm the OneHash API key scope and request elevated read access if the instance exceeds 10,000 records. The discovery output is a written DocType inventory, custom field matrix, and migration scope document that the customer reviews before we proceed.

  2. Odoo schema design and custom field provisioning

    We design the destination Odoo schema by mapping each OneHash DocType to its Odoo equivalent object (crm.lead, res.partner, sale.order, product.product, etc.), creating any required custom fields via ir.model.fields, and configuring Odoo-specific settings like CRM team, stage definitions, sales team, and warehouse before any data is imported. Custom DocTypes in OneHash require us to create new Odoo models (ir.model) in the destination database, which is a schema creation step that requires the migration user to have technical access or the customer's Odoo admin to pre-provision. Schema is validated in an Odoo test database before production migration begins.

  3. Odoo API access and rate-limit characterization

    We configure Odoo XML-RPC API access for the migration user (database, login, password, and model access permissions). We characterize Odoo's rate-limit behavior during a dry-run pass to establish safe batch sizes and retry intervals. We also confirm the destination Odoo edition (Community self-hosted vs Odoo Online vs Odoo.sh) because API access methods and rate limits differ by deployment type. If the destination is Odoo Community self-hosted, we coordinate with the customer's technical team on server resource headroom for bulk import operations.

  4. Owner and user reconciliation

    We extract every distinct owner referenced on OneHash records (Leads, Contacts, Opportunities, Quotations, Projects) and match them against the destination Odoo User list. OneHash stores owner as a User DocType reference; Odoo uses res.users for owner_id on crm.lead and sale.order. Owners without a matching Odoo User go to a reconciliation queue for the customer's admin to provision. This step gates the entire migration because OwnerId references are required on most Odoo standard records and cannot be nulled out without affecting accountability reporting.

  5. Production migration in dependency order

    We run production migration in strict dependency order: res.partner company records first (Customer DocType), res.partner contact records second (Contact DocType with parent_id resolved), product.product records third, account.account records fourth, crm.lead records fifth (Lead and Opportunity DocTypes mapped to crm.lead with type split), sale.order records sixth (Quotation DocType to draft sale.order, Sales Order DocType to confirmed sale.order), project.project and project.task seventh, hr.employee eighth, custom object records ninth, and ir.attachment records last with res_model and res_id linkage resolved to the migrated parent. Each phase emits a row-count reconciliation report before the next phase begins.

  6. Cutover, validation, and automation rebuild handoff

    We freeze OneHash writes during cutover, run a final delta migration of any records created or modified during the migration window, then enable Odoo as the system of record. We deliver a written inventory of every active OneHash workflow, automation, and DocType-level script with a recommended Odoo equivalent (studio action, server action, or base.automation rule). We do not rebuild OneHash automations as Odoo actions inside the migration scope — that work requires Odoo-specific configuration by the customer's admin or an Odoo partner. We support a one-week hypercare window where we resolve any record linkage issues or field mapping discrepancies raised by the customer's team.

Platform deep dives

Context on both ends of the pair

OneHash CRM logo

OneHash CRM

Source

Strengths

  • Free starter plan for up to 2 users with chat history and inbox support, per official pricing page.
  • All-in-one bundling of CRM with ERP modules reduces tool sprawl for small and mid-sized businesses.
  • Multi-currency and multi-language support enables global operations from a single platform.
  • Workflow automation for approvals, role assignments, and repetitive tasks, per product feature documentation.
  • Strong customer support responsiveness highlighted across multiple review sources.

Weaknesses

  • Steep initial learning curve due to ERPNext-inherited complexity, cited by G2 reviewers.
  • Limited public API documentation makes programmatic data extraction difficult without reverse-engineering.
  • Performance degrades on large datasets, according to review themes around loading and lag issues.
  • Limited customization compared to true ERPNext forks; white-label and DocType customization are restricted relative to self-hosted ERPNext.
  • Aggressive outbound sales tactics, including Calendly booking spam, noted in Trustpilot reviews.
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 OneHash CRM 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

    OneHash CRM: Not publicly documented — discovered dynamically during migration.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

Walk through your OneHash CRM 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 three and five weeks for accounts under 20,000 records and fewer than five custom DocTypes. Migrations with extensive custom fields, custom DocTypes, large attachment volumes (over 2 GB), or parallel Employee and Chart of Accounts exports move to eight to fourteen weeks because of schema discovery overhead, Odoo custom model creation, and chunked API batch handling. Odoo's referential integrity enforcement means that parent-child record dependencies must be resolved in order, which adds sequencing time that pure CSV-load migrations do not have.

Adjacent paths

Related migrations to explore

Ready when you are

Move from OneHash CRM.
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