CRM migration
Field-level mapping, validation, and rollback between Opera 3 and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Opera 3
Source
Odoo CRM
Destination
Compatibility
12 of 16
objects map 1:1 between Opera 3 and Odoo CRM.
Complexity
BStandard
Timeline
6-10 weeks
Overview
Moving from Pegasus Opera 3 to Odoo CRM is a migration from a UK on-premises ERP with a tightly-coupled SQL Server or Visual FoxPro schema to a modular open-source platform with a REST API and lead-to-opportunity pipeline. Opera 3 has no public REST API — data extraction relies on CSV exports, RTI XML files, or direct SQL reads from the SQL SE edition, which determines the export pipeline for this migration. We map Opera 3's Sales Ledger contacts to Odoo Contacts, OPUS Customer Products to Odoo product variants with customer-specific price lists, and text-based activity notes to Odoo's structured activity model with type classification. Multi-company Opera 3 structures require a decision about whether each legal entity maps to a separate Odoo database or a single multi-company database, which affects licensing and setup. We do not migrate Opera 3 Workflows, inter-company transaction templates, or the bespoke Report Generator layouts — these require rebuild in Odoo Studio or by an Odoo implementation partner.
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 Opera 3 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.
Opera 3
Sales Ledger Contact
Odoo CRM
Contact
1:1Opera 3 Sales Ledger contacts export via CSV with full address fields, payment terms, credit limits, and multi-currency settings. We map the contact record to Odoo Contact, preserving the account reference code as the Odoo internal reference. Multi-currency settings from Opera 3 become currency_id on the Contact if the destination uses the multi-company or multi-currency configuration.
Opera 3
Purchase Ledger Supplier
Odoo CRM
Contact (Supplier scope)
1:1Opera 3 Purchase Ledger suppliers export as a separate CSV from Sales Ledger contacts. We map them to Odoo Contacts with the Supplier checkbox enabled, preserving the supplier account code as the internal reference. Bank details, payment terms, and tax numbers carry across as custom fields or notes depending on the Odoo configuration.
Opera 3
Sales Order
Odoo CRM
Sale Order
1:1Opera 3 Sales Order headers and line items export via CSV with pricing, discounts, delivery addresses, and status flags. We map order headers to Odoo Sale Order and line items to Sale Order Lines with product code resolved to Odoo Product2 records. The order-to-invoice linkage chain is preserved by mapping the Opera 3 order reference to the Odoo client_order_ref field.
Opera 3
Purchase Order
Odoo CRM
Purchase Order
1:1Opera 3 Purchase Order headers and line items export similarly to Sales Orders. We map Purchase Order headers to Odoo Purchase Order and line items to Purchase Order Lines. Vendor product codes from Opera 3 map to Odoo product supplierinfo records to preserve the vendor-specific part number on purchase orders.
Opera 3
Sales Invoice
Odoo CRM
Account Move (Customer Invoice)
1:1Opera 3 Sales Invoices export with header totals and detail lines. The system enforces that invoice totals equal the sum of line items, so we validate this relationship before loading. We map invoice headers to Odoo Account Move (type=out_invoice) and line items to move lines with account_id resolved from the Opera 3 nominal code mapping. PDF invoice attachments migrate as Odoo IrAttachment linked to the move.
Opera 3
CRM Contact
Odoo CRM
Lead or Contact
1:manyOpera 3's built-in CRM module stores contacts and companies with text-based activity logs. We map active CRM contacts to Odoo Leads first, then convert unqualified records to Leads and records with active deals to Contacts with a related Opportunity. The activity note log is parsed and reclassified into Odoo activity types (call, email, meeting, task) during the transformation step.
Opera 3
CRM Activity Log
Odoo CRM
Mail Activity
1:1Opera 3 stores CRM activities as plain text notes with timestamps rather than structured events. We parse each note for type indicators (call, meeting, email reference, task) and map the content to Odoo Mail Activity records with the appropriate activity_type_id, user_id resolved from the Opera 3 owner reference, and activity_date set to the original timestamp. Activity records without a clear type default to a generic note activity type in Odoo.
Opera 3
Stock Item
Odoo CRM
Product
1:1Opera 3 stock codes, descriptions, bin locations, reorder levels, and BOM structures export cleanly via CSV. We map stock codes to Odoo Product records, preserving the stock code as the product's default_code. Bin location maps to the Odoo warehouse location field. BOM structures from Opera 3 map to Odoo bom_type=bom_kit on the related product.
Opera 3
OPUS Customer Products
Odoo CRM
Product Variant + Customer Pricelist
1:manyThe OPUS add-on for Opera 3 stores customer-specific stock codes and descriptions as a separate CSV with a different schema from the standard stock file. We join OPUS records to the main product export using the base stock code and the customer account reference, then create Odoo Product Variants (attribute: Customer) with customer-specific prices on the corresponding customer pricelist. This is one of the most complex object transformations in the migration because the source schema is denormalised.
Opera 3
Nominal Ledger Account
Odoo CRM
Account (Accounting)
1:1Opera 3 Nominal Ledger accounts with cost-centre tagging export as a chart of accounts CSV. We map each account code directly to an Odoo Accounting Account record, preserving the account code hierarchy and cost-centre assignments as analytic account tags. The account type (asset, liability, expense, revenue) is derived from the Opera 3 account group code.
Opera 3
Multi-Company Structure
Odoo CRM
Odoo Database (per company) or Multi-Company Configuration
lossyOpera 3 stores multiple legal entities within one database with inter-company transactions flagged by a counterparty company code. We extract each company code as a separate entity and present the customer with two destination options: a separate Odoo database per legal entity (standard Odoo deployment, separate subscription per database), or a single Odoo database with multi-company enabled (shared contacts, restricted data access per company). This decision affects licensing cost and is made during scoping.
Opera 3
Employee + RTI FPS/EPS
Odoo CRM
Employee
1:1Opera 3 employee records export via CSV including bank details, start/end dates, and P45 data. RTI FPS XML files contain tax submission records; EPS files hold employer payment summaries. We map employees to Odoo Employees with the P45 data stored as an attachment on the employee record. RTI FPS records are joined to the employee CSV by National Insurance number to resolve any orphaned RTI entries. Note that Odoo Payroll is a separate paid app and must be configured separately for RTI filing.
Opera 3
Fixed Asset Register
Odoo CRM
Asset
1:1Opera 3 fixed asset registers with acquisition dates, cost, depreciation method, NBV, and disposal history export as structured records. We map to Odoo Asset records with the acquisition date, original value, depreciation method, and accumulated depreciation carried across. Disposal history is preserved as asset line entries.
Opera 3
Project / Project Costing
Odoo CRM
Project
1:1Opera 3 project cost codes and phase-level tracking export with labour, purchase, and expense allocations linked to the Nominal Ledger. We map project headers to Odoo Project and cost code phases to Project Tasks with tracked hours and expenses. The nominal code mapping for labour and purchase lines is preserved in the task description or as analytic account tags.
Opera 3
PDF Document Attachments
Odoo CRM
IrAttachment
1:1Opera 3 stores PDF invoices, statements, and remittance advices as binary files in document folders. We extract the file using the account reference and transaction date from the filename, then attach each PDF to the corresponding Odoo account move, contact, or purchase order record. File naming conventions vary by Opera 3 installation and are resolved during the export scoping phase.
Opera 3
Multi-Currency Transaction
Odoo CRM
Multi-Currency on Account Move
lossyOpera 3 exports currency codes, exchange rates, and transaction amounts in foreign currencies. We preserve the rate used at transaction time in a custom field on the Odoo move line and configure Odoo's multi-currency setting to accept the historical rate. If the destination Odoo instance does not have multi-currency enabled, we flag this during scoping as a configuration prerequisite.
| Opera 3 | Odoo CRM | Compatibility | |
|---|---|---|---|
| Sales Ledger Contact | Contact1:1 | Fully supported | |
| Purchase Ledger Supplier | Contact (Supplier scope)1:1 | Fully supported | |
| Sales Order | Sale Order1:1 | Fully supported | |
| Purchase Order | Purchase Order1:1 | Fully supported | |
| Sales Invoice | Account Move (Customer Invoice)1:1 | Fully supported | |
| CRM Contact | Lead or Contact1:many | Fully supported | |
| CRM Activity Log | Mail Activity1:1 | Fully supported | |
| Stock Item | Product1:1 | Fully supported | |
| OPUS Customer Products | Product Variant + Customer Pricelist1:many | Fully supported | |
| Nominal Ledger Account | Account (Accounting)1:1 | Fully supported | |
| Multi-Company Structure | Odoo Database (per company) or Multi-Company Configurationlossy | Fully supported | |
| Employee + RTI FPS/EPS | Employee1:1 | Fully supported | |
| Fixed Asset Register | Asset1:1 | Fully supported | |
| Project / Project Costing | Project1:1 | Fully supported | |
| PDF Document Attachments | IrAttachment1:1 | Fully supported | |
| Multi-Currency Transaction | Multi-Currency on Account Movelossy | 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.
Opera 3 gotchas
Visual FoxPro to SQL SE migration is mandatory and non-reversible
RTI FPS/EPS payroll files use cryptic renamed filenames after HMRC submission
Customer Products add-on stores customer-specific stock variants outside the main item schema
No public API — data export relies on CSV, XML RTI files, or bespoke WCF
Multi-company inter-company balances require cross-reference mapping
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 export pipeline scoping
We audit the source Opera 3 installation across edition (Visual FoxPro or SQL SE), active modules (Sales Ledger, Purchase Ledger, Nominal, Stock, CRM, Payroll, OPUS add-on), record volumes per module, and data quality. We identify whether the export uses built-in CSV exports, direct SQL Server reads, or bespoke WCF endpoints, and we run the Opera 3 health checker against the source database to surface referential integrity failures before migration begins. The discovery output is a written migration scope with export pipeline specification, record counts per module, and any pre-migration data corrections required.
Odoo target environment setup
We set up the destination Odoo environment: installing the CRM app (and additional apps based on scope — Sales, Accounting, Inventory, Payroll, Project), configuring multi-company or multi-database structure based on the customer's decision, enabling multi-currency if required, and creating the accounting chart of accounts from the Opera 3 Nominal Ledger export. The Odoo admin validates the company details and fiscal year configuration before data migration begins.
Schema mapping and data transformation
We design the field-level mapping for each object: Opera 3 account codes to Odoo account records, Opera 3 product codes to Odoo Product2 with variant creation for OPUS records, Opera 3 contact fields to Odoo Contact fields, and the CRM activity note parser for structured type classification. RTI FPS and EPS files are matched to employee records by National Insurance number. The mapping document is reviewed by the customer before any data is loaded.
Sandbox migration and reconciliation
We run a full migration into a staging Odoo database using production data volumes. The customer reconciles record counts, spot-checks 25-50 records against the Opera 3 source, and validates that the accounting chart of accounts balances. The OPUS customer product variant mapping is verified by checking that customer-specific prices appear on the correct customer pricelist. Any mapping corrections are made before the production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: accounting accounts first, then products and product variants, then contacts (suppliers and customers), then sale and purchase orders, then invoices and credit notes, then CRM leads and contacts with activity history, then employees with RTI data, then projects, then fixed assets, then document attachments. Each phase emits a row-count reconciliation report before the next phase begins. Opera 3 writes are frozen during the production migration window.
Cutover, delta sync, and rebuild handoff
We run a final delta migration for any records modified during the production migration window, then enable Odoo as the system of record. We deliver a written inventory of every Opera 3 automation, inter-company template, and Report Generator layout that requires rebuild in Odoo Studio or by an Odoo implementation partner. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild Opera 3 Workflows as Odoo automated actions inside the migration scope; that is a separate engagement.
Platform deep dives
Opera 3
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Opera 3 and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Opera 3 and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Opera 3 and Odoo CRM.
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
Opera 3: Not publicly documented — no published API means no documented rate limits.
Data volume sensitivity
Opera 3 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 Opera 3 to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Opera 3 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 Opera 3
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.