CRM migration
Field-level mapping, validation, and rollback between Onpipeline and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Onpipeline
Source
Odoo CRM
Destination
Compatibility
11 of 14
objects map 1:1 between Onpipeline and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Onpipeline to Odoo CRM is an all-in-one upgrade, not a like-for-like switch. Onpipeline is a standalone sales CRM organized around Deals linked to Contacts and Companies; Odoo CRM is one module inside a full ERP suite where Leads can convert into Opportunities, Partners unify people and organizations, and the Product catalog feeds into inventory, sales orders, and accounting simultaneously. We resolve Odoo's Lead-versus-Opportunity model by converting all Onpipeline Deals directly to Odoo Opportunities, maintain the Contact-Company-Deal association as Partner-Contact and Opportunity relationships, and define Odoo custom fields in developer mode before migration data is written. We do not migrate Onpipeline Workflows, automation rules, or recurring invoice schedules as code; we deliver a written inventory for the customer's Odoo admin to rebuild in Odoo Studio. Quotes migrate as sale.order records with their line items, and Products migrate as product.product entries that feed directly into Odoo's inventory and sales order models.
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 Onpipeline 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.
Onpipeline
Contact
Odoo CRM
Partner (type=contact)
1:1Onpipeline Contacts map to Odoo res.partner records with partner_type=contact. Standard fields (name, email, phone, address) migrate directly. Custom fields on Contact are created in Odoo developer mode via XML data file before import. The Contact-to-Company linkage is preserved by creating the Company Partner first, then setting parent_id on the Contact Partner record to the Company Partner.
Onpipeline
Company
Odoo CRM
Partner (type=company)
1:1Onpipeline Company records map to Odoo res.partner with partner_type=company. The company domain from the website field is used as a deduplication key. Multi-contact organizations in Onpipeline all link to the same Company Partner via parent_id relationships. Odoo's commercial partner concept automatically rolls up activity to the company-level Partner for reporting.
Onpipeline
Deal
Odoo CRM
Opportunity (crm.lead)
1:1Onpipeline Deals map to Odoo crm.lead records with type=opportunity. Deal value maps to Odoo's planned_revenue field. Deal stage maps to a corresponding Odoo stage in the configured sales team pipeline. The Onpipeline Deal probability is written to a custom float field probability_override__c since Odoo calculates stage probability automatically but allows override. The Deal's linked Contact resolves to a Partner record via email lookup, and the linked Company resolves to the parent_id Partner.
Onpipeline
Pipeline Stage
Odoo CRM
Stage (crm.stage)
lossyEach Onpipeline pipeline with its stages maps to an Odoo Sales Team (crm.team) with corresponding stages. Stage names, probabilities, and sequence order are recreated in Odoo via the CRM pipeline configuration. Onpipeline's pipeline-level stage customization maps to Odoo's team-specific stage sequences. We configure the stages before Deal import so that Deals land in the correct stage on insert.
Onpipeline
Activity (Events, Tasks, Notes)
Odoo CRM
Mail Activity / Task
1:manyOnpipeline Events, Tasks, and Notes merge into Odoo's mail.activity and mail.message model. Calendar events map to mail.activity with activity_type_id set to 'meeting' and activity_date_deadline set to the event datetime. Tasks map to mail.activity with activity_type_id='call' or 'to_do'. Notes migrate as mail.message records with message_type='notification' attached to the parent Opportunity or Partner. Owner attribution is preserved by resolving the Onpipeline user email to an Odoo res.users record.
Onpipeline
Product
Odoo CRM
Product (product.product)
1:1Onpipeline Products map to Odoo product.product records with type=product (for inventory-tracked items) or type=consu (for consumables). SKU maps to default_code. List price, standard cost, and stock quantity migrate directly. If the destination Odoo instance includes Inventory, we write stock quant records to preserve the current inventory level from Onpipeline's product catalog.
Onpipeline
Quote
Odoo CRM
Sale Order (sale.order)
1:1Onpipeline Quotes migrate to Odoo sale.order records in state='draft'. Quote line items map to sale.order.line with product_id resolved from the Product mapping, quantity from Onpipeline quantity, and price_unit from the quoted price. The linked Contact resolves to a Partner record, and the linked Deal resolves to a crm.lead opportunity. E-signature status is noted in a custom field but the PDF attachment migrates as an IrAttachment linked to the sale.order.
Onpipeline
Invoice
Odoo CRM
Account Move (account.move)
1:1Onpipeline Invoices migrate as Odoo account.move records with move_type='out_invoice'. Invoice headers, line items, and payment status transfer. Odoo's invoicing lives in the Accounting module, so this import requires the Accounting app to be installed in the destination Odoo instance. Recurring invoice configurations are noted but automated recurring generation requires manual setup in Odoo or an Odoo Studio automation rule.
Onpipeline
Custom Fields
Odoo CRM
Custom Fields (developer mode)
lossyOnpipeline custom fields on Contacts, Companies, Deals, and Products require Odoo developer mode to be enabled before migration. We create custom fields via Odoo's XML data file mechanism (ir.model.fields with the appropriate model and column characters), matching the Onpipeline field type (char, float, selection, boolean, date, etc.) before any data import runs. Custom field definitions are scoped per object to avoid field name collisions.
Onpipeline
Tag
Odoo CRM
Tag (crm.tag)
1:1Onpipeline Tags migrate to Odoo crm.tag records. Multi-tag assignments per Contact, Company, or Deal are preserved via the crm.lead.res_partner_partner_category_rel many-to-many table. Tags used for deal classification map to crm.tag records linked to crm.lead via crm_lead_tag_rel. The customer selects tag-to-category mapping strategy during scoping.
Onpipeline
User / Owner
Odoo CRM
User (res.users)
1:1Onpipeline Users are mapped to Odoo res.users by email. Owner assignments on Deals, Activities, and Notes are resolved by matching the Onpipeline user email to the Odoo user login. Any Onpipeline Owner without a matching Odoo user is flagged in the reconciliation queue and the customer's admin provisions the missing user before record import resumes.
Onpipeline
Recurring Revenue / Subscription
Odoo CRM
Recurring Model Notes
1:1Onpipeline recurring revenue schedules are documented as a written inventory during migration scoping. The subscription metadata (amount, frequency, linked Contact, linked Product) migrates as notes on the associated Partner and Opportunity records. Automated recurring invoice generation in Onpipeline is Advanced-plan-only and does not have a direct Odoo CRM migration path; the customer's admin must configure a recurring model in Odoo Accounting or Odoo Studio post-migration.
Onpipeline
Web Form Submissions
Odoo CRM
Lead (crm.lead)
1:1Onpipeline Web Form submissions migrate as crm.lead records with lead_type='lead' and the form name stored in a custom source field. The submitted field data maps to standard lead fields or to custom fields created for the form. Form definitions are documented as a written handoff for the customer to recreate in Odoo Website Forms or Odoo Studio.
Onpipeline
Calendar Events
Odoo CRM
Calendar Event (calendar.event)
1:1Onpipeline Calendar Events migrate to Odoo calendar.event records. The event datetime, duration, and location map directly. Attendee assignment links to Partner records via calendar.attendee with partner_id resolved by email lookup. Owner attribution is preserved by setting res_users_id on the event to the matched Odoo user. Onpipeline's user-scoped calendar is consolidated into Odoo's shared calendar model while maintaining per-owner event ownership.
| Onpipeline | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Partner (type=contact)1:1 | Fully supported | |
| Company | Partner (type=company)1:1 | Fully supported | |
| Deal | Opportunity (crm.lead)1:1 | Fully supported | |
| Pipeline Stage | Stage (crm.stage)lossy | Fully supported | |
| Activity (Events, Tasks, Notes) | Mail Activity / Task1:many | Fully supported | |
| Product | Product (product.product)1:1 | Fully supported | |
| Quote | Sale Order (sale.order)1:1 | Fully supported | |
| Invoice | Account Move (account.move)1:1 | Fully supported | |
| Custom Fields | Custom Fields (developer mode)lossy | Mapping required | |
| Tag | Tag (crm.tag)1:1 | Fully supported | |
| User / Owner | User (res.users)1:1 | Fully supported | |
| Recurring Revenue / Subscription | Recurring Model Notes1:1 | Fully supported | |
| Web Form Submissions | Lead (crm.lead)1:1 | Fully supported | |
| Calendar Events | Calendar Event (calendar.event)1: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.
Onpipeline gotchas
Trial account data deleted 7 days after expiry
Calendar is user-scoped, not team-wide by default
Recurring invoice automation gated to Advanced plan
Facebook Lead Ads import requires API or Zapier setup
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 source audit
We audit the Onpipeline account across plan tier (Pipeline/Standard/Advanced), custom field schema on all objects, pipeline count, active Deals with stage and owner assignments, product catalog size, Quote and Invoice volume, and active Workflow configurations. We confirm the trial expiry date and prioritize accounts approaching the 7-day deletion window. The discovery output is a written migration scope document and an Odoo edition recommendation (Community vs Enterprise) based on the customer's multi-company, multi-currency, and inventory requirements.
Odoo environment preparation
We enable developer mode in the destination Odoo instance and create all custom field definitions via XML data files before any Onpipeline data is written. We configure Odoo CRM pipeline stages, sales teams, and probability mappings to match the Onpipeline pipeline structure. If the customer uses Odoo Enterprise, we configure multi-company and multi-currency settings. The Odoo Accounting app is confirmed as installed if Invoice migration is in scope.
Sandbox migration and reconciliation
We run a full migration into a test Odoo database or sandbox environment using production-like data volume. The customer's Odoo administrator reconciles record counts (Partners from Contacts, Partners from Companies, Opportunities from Deals, Activities, Products, Quotes), spot-checks 25-50 records against the Onpipeline source, and validates custom field data. Any schema corrections or mapping adjustments happen in this phase before production migration begins.
Owner reconciliation and user provisioning
We extract every distinct Onpipeline User referenced on Deal, Activity, and Note records and match by email against the destination Odoo res.users table. Any Onpipeline Owner without a matching Odoo user is placed in a reconciliation queue for the customer's admin to provision before record import resumes. Odoo users must be active to receive activity assignments, so we coordinate the user provisioning timing with the activity import phase.
Production migration in dependency order
We run production migration in record-dependency order: Company Partners first (so Contact parent_id is satisfied), then Contact Partners, then Opportunities from Deals (with Partner lookup resolved by email), then Activities, then Products, then Quotes as sale.order records, then Invoices as account.move records (if Accounting is installed), then Tags, then Custom Fields. Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's CSV import via base_import or direct SQL writes depending on volume and complexity.
Cutover, validation, and Workflow handoff
We freeze Onpipeline writes during cutover, run a final delta migration of any records modified during the migration window, then set the destination Odoo instance as the system of record. We deliver the Workflow and Automation inventory document and the recurring invoice configuration notes to the customer's Odoo administrator for rebuild in Odoo Studio. We support a one-week hypercare window to resolve any data reconciliation issues raised by the customer's team.
Platform deep dives
Onpipeline
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 Onpipeline 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
Onpipeline: Not publicly documented in the available developer docs.
Data volume sensitivity
Onpipeline 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 Onpipeline to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Onpipeline 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 Onpipeline
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.