CRM migration
Field-level mapping, validation, and rollback between Opera 3 and Salesforce Sales Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Sales Cloud.
Opera 3
Source
Salesforce Sales Cloud
Destination
Compatibility
9 of 15
objects map 1:1 between Opera 3 and Salesforce Sales Cloud.
Complexity
BStandard
Timeline
5-8 weeks
Overview
Moving from Pegasus Opera 3 to Salesforce is a cross-vendor migration that separates accounting and payroll from CRM entirely. Opera 3 stores contacts in its Sales Ledger, financial transactions in the Nominal Ledger, orders and invoices in the distribution layer, and payroll in RTI XML files — each with its own export format and none accessible via a REST API. We extract via CSV for ledgers and contacts, direct SQL Server reads for the SQL SE edition, and RTI file parsing for employee and payroll records, then map each source object to its Salesforce equivalent with full schema reconciliation. Visual FoxPro editions require mandatory health-check validation before migration because SQL SE enforces that invoice totals equal the sum of line items; orphaned records and misaligned totals are flagged and corrected before any load. We do not migrate Workflows, automations, or custom OPUS add-on fields as code — we deliver a written inventory for the customer's admin to rebuild in Salesforce Flow.
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 Salesforce Sales Cloud, 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
Salesforce Sales Cloud
Account and Contact
1:manyOpera 3's Sales Ledger stores customer records as a single contact entity with company name, billing address, delivery address, payment terms, credit limit, and multi-currency settings. We split this into a Salesforce Account (the company entity) and a Contact (the primary billing or operations contact). Additional contact roles on the same company in Opera 3 map to additional Contact records under the same Account. The Account.Industry and Account.Type fields are populated from Opera 3's account classification codes.
Opera 3
Purchase Ledger Supplier
Salesforce Sales Cloud
Account (Type = Vendor)
1:1Opera 3 Purchase Ledger suppliers map to Salesforce Account records with Type = Vendor. Supplier payment terms, bank details, and currency settings migrate to Account fields or custom fields. Purchase Ledger contacts do not map to Salesforce Contact records unless the supplier has a named purchasing contact that the business wants to track as a Salesforce Contact linked to the vendor Account.
Opera 3
Nominal Ledger Account
Salesforce Sales Cloud
General Ledger Custom Object
lossyOpera 3 Nominal Ledger accounts with cost-centre tagging map to a custom GL_Account__c object in Salesforce if the customer does not already have an ERP integration that manages the chart of accounts. Account codes, descriptions, and cost-centre assignments migrate as structured records. We do not replicate Opera 3's double-entry journal logic in Salesforce because Salesforce is not an accounting system — we preserve the chart as reference data for reporting and reconciliation purposes only.
Opera 3
Sales Order
Salesforce Sales Cloud
Opportunity
1:1Opera 3 Sales Orders map to Salesforce Opportunity. Order header fields (order number, date, status, delivery address) map to Opportunity fields and custom fields. Order status in Opera 3 (Quoted, Confirmed, Despatched, Invoiced) maps to Opportunity StageName, with a custom field o3_original_status__c preserving the source status for audit. The order-to-invoice linkage chain in Opera 3 is preserved as a custom Opportunity field linking to the related invoice Opportunity or Quote.
Opera 3
Sales Invoice and Purchase Invoice
Salesforce Sales Cloud
Opportunity (Closed-Won) or Custom Invoice Object
lossyClosed invoices in Opera 3 (status = Invoiced) are mapped to Salesforce Opportunity records with StageName = Closed Won for sales invoices, or to a custom Invoice__c object if the customer needs line-item invoice detail preserved beyond the Opportunity summary. Invoice totals are validated against line-item sums before load — any mismatch is flagged for correction. Credit notes map to Opportunity records with StageName = Closed Lost and a custom type field distinguishing them from cancellations.
Opera 3
Stock Item
Salesforce Sales Cloud
Product2
1:1Opera 3 stock codes with bin locations, reorder levels, and BOM structures map to Salesforce Product2 records. ProductCode maps from the Opera 3 stock code. Standard Price Book entries are created during migration with the last purchase or selling price from Opera 3. Customer-specific product variants from the OPUS add-on (which stores a different stock code and description per customer) are mapped to Salesforce PricebookEntry records scoped per Account, preserving the customer-specific description as a custom field.
Opera 3
BOM Structure
Salesforce Sales Cloud
Product2 (with custom component relationship)
lossyOpera 3 bill-of-materials structures map to a custom Product_Component__c junction object linking parent Product2 records to child Product2 components with quantity-per-assembly stored as a custom field. This preserves the BOM as reference data in Salesforce for quoting and product configuration use cases.
Opera 3
Employee Record
Salesforce Sales Cloud
User (or Contact for non-user employees)
1:1Opera 3 employee records export via CSV including name, start and end dates, bank details, and P45 data. Active employees with Salesforce seat licences map to User records with the employee number stored as a custom External_ID__c field for deduplication. Inactive employees and contractors without Salesforce licences are mapped to a custom Employee__c object to preserve HR audit data without consuming Salesforce user licences.
Opera 3
RTI FPS and EPS XML
Salesforce Sales Cloud
Employee Payroll Custom Object
1:1Pegasus Opera 3's RTI FPS (Full Payment Submission) and EPS (Employer Payment Summary) XML files contain tax period, pay, deductions, and NIC data submitted to HMRC. We parse the XML, map each FPS submission to a custom Payroll_Submission__c record linked to the corresponding Employee__c or User record, and preserve the submission date, tax period, and amounts as structured fields. The cryptic renamed filenames (Z_FPS.RTI to timestamped .BAK files after HMRC submission) are resolved by matching file timestamps to the tax period.
Opera 3
Project and Project Costing
Salesforce Sales Cloud
Opportunity with Project Custom Fields
lossyOpera 3 Projects with phase-level labour, purchase, and expense allocations map to Salesforce Opportunity records with a custom project flag. Phase-level tracking and cost-code allocations migrate to a custom Project_Phase__c object linked to the Opportunity. If the customer uses Salesforce Financial Services Cloud or a project management integration, we map to the relevant standard object instead and scope this during discovery.
Opera 3
Fixed Asset Register
Salesforce Sales Cloud
Asset (or Custom Fixed_Asset__c)
1:1Opera 3 fixed assets with acquisition date, cost, depreciation method, net book value, and disposal history map to Salesforce Asset records. Asset records are linked to the related Account (vendor for capital purchases or customer if leasing) and include custom fields for depreciation_method__c, nbv__c, and acquisition_cost__c. Disposal history is stored as Asset history records or custom disposal transaction records.
Opera 3
Multi-Currency Transaction
Salesforce Sales Cloud
Account and Opportunity Custom Currency Fields
1:1Opera 3 multi-currency settings, exchange rates at transaction time, and foreign-currency amounts migrate to Salesforce as custom fields on Account and Opportunity. Currency codes map from Opera 3 currency codes. The exchange rate used at transaction time is stored as a custom field on each transaction record rather than relying on Salesforce's own currency conversion, because Opera 3 historically uses contracted or locked rates that differ from daily market rates.
Opera 3
Multi-Company Structure
Salesforce Sales Cloud
Multiple Account Hierarchies
lossyOpera 3 multi-company configurations store each legal entity as a separate company code with its own chart of accounts and inter-company debtor and creditor balances. We map each Opera 3 company to a Salesforce Account at the top of a hierarchy, with inter-company transactions remapped so the destination correctly identifies them as internal transfers rather than third-party transactions. Inter-company balance reconciliation reports are generated before cutover to ensure the consolidated view is accurate in Salesforce.
Opera 3
Document Attachment (PDF)
Salesforce Sales Cloud
ContentDocument (linked via ContentDocumentLink)
1:1Opera 3 stores PDF invoices, statements, and remittance advices as binary files in document folders. We extract each PDF, map it to a Salesforce ContentDocument record, and attach it via ContentDocumentLink to the corresponding Account, Opportunity, or Asset record. File naming conventions in Opera 3's document archive determine the linkage — we parse the filename to extract the invoice number or account reference, then resolve the link in Salesforce. Files without a resolvable reference are attached to the related Account as orphaned documents for manual reconciliation.
Opera 3
CRM Contact and Activity Note
Salesforce Sales Cloud
Contact and Note
1:1Opera 3's built-in CRM module stores contacts, companies, and activity logs as text-based notes rather than structured event records. We map CRM contact records to Salesforce Contact under the related Account. Activity notes migrate to Salesforce Note records linked via ContentDocumentLink to the parent Contact or Account. Because Opera 3 CRM activities do not have structured event types or timestamps in a standardised format, we map the note body and creation date, and flag records where the activity type could not be determined for manual review.
| Opera 3 | Salesforce Sales Cloud | Compatibility | |
|---|---|---|---|
| Sales Ledger Contact | Account and Contact1:many | Fully supported | |
| Purchase Ledger Supplier | Account (Type = Vendor)1:1 | Fully supported | |
| Nominal Ledger Account | General Ledger Custom Objectlossy | Fully supported | |
| Sales Order | Opportunity1:1 | Fully supported | |
| Sales Invoice and Purchase Invoice | Opportunity (Closed-Won) or Custom Invoice Objectlossy | Fully supported | |
| Stock Item | Product21:1 | Fully supported | |
| BOM Structure | Product2 (with custom component relationship)lossy | Fully supported | |
| Employee Record | User (or Contact for non-user employees)1:1 | Fully supported | |
| RTI FPS and EPS XML | Employee Payroll Custom Object1:1 | Fully supported | |
| Project and Project Costing | Opportunity with Project Custom Fieldslossy | Fully supported | |
| Fixed Asset Register | Asset (or Custom Fixed_Asset__c)1:1 | Fully supported | |
| Multi-Currency Transaction | Account and Opportunity Custom Currency Fields1:1 | Fully supported | |
| Multi-Company Structure | Multiple Account Hierarchieslossy | Fully supported | |
| Document Attachment (PDF) | ContentDocument (linked via ContentDocumentLink)1:1 | Fully supported | |
| CRM Contact and Activity Note | Contact and Note1: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.
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
Salesforce Sales Cloud gotchas
Workflow Rules and Process Builder are retired
Bulk API batch quota exhaustion during large imports
Storage overage billing is non-obvious
Account-Contact many-to-many relationship mapping
Territory and team member import ordering dependencies
Pair-specific challenges
Migration approach
Discovery and installation audit
We audit the Opera 3 installation to determine the edition (Visual FoxPro or SQL SE), the modules active (Sales Ledger, Purchase Ledger, Nominal Ledger, Payroll, Stock, CRM, OPUS add-ons), the export methods available (CSV templates, direct SQL Server access, RTI file archive location), and the data volumes per table. We also assess multi-company structures, inter-company transaction volume, and whether the health checker has been run recently. The discovery output is a written migration scope, a data-volume inventory, and a Salesforce edition recommendation based on the customer's target user count and feature requirements.
Data extraction and quality assessment
We extract data using the appropriate method per module: CSV exports for Sales Ledger, Purchase Ledger, and Nominal Ledger; direct SQL Server reads for SQL SE installations where CSV exports are insufficient; RTI XML file parsing for FPS and EPS payroll data; and document folder scanning for PDF attachments. We run reconciliation checks against the source data — invoice totals versus line-item sums for SQL SE, inter-company transaction cross-references, and duplicate detection on customer and supplier accounts. Every data quality issue is documented in a pre-migration remediation report for the customer to address before the migration load begins.
Schema design and sandbox migration
We design the Salesforce destination schema: standard Account, Contact, Opportunity, Product2, Asset, and User objects for the primary scope, plus custom objects for GL_Account__c, Employee__c, Payroll_Submission__c, Project_Phase__c, and BOM_Component__c where needed. We deploy the schema to a Salesforce Sandbox (Full Copy or Partial Copy) and run a first migration with production-like data volumes. The customer's finance and operations leads reconcile record counts and spot-check migrated data against the Opera 3 source. Any schema corrections, field mapping changes, or validation rule conflicts are resolved in the Sandbox before production migration begins.
Payroll RTI sequencing and employee record provisioning
We sequence payroll records before standard CRM records because employees may be the Owner on migrated Opportunities and Contacts. We parse each FPS and EPS XML file, map the tax period and payment data to Payroll_Submission__c records linked to the corresponding User or Employee__c record, and validate that the employee count matches the CSV export. Any employee with a missing or mismatched HMRC employee reference is flagged for manual review. Salesforce Users are provisioned by the customer's admin before the production migration begins so that OwnerId lookups are satisfied at insert time.
Production migration in dependency order
We run the production migration in dependency order: Users and Employees first (to satisfy OwnerId lookups), then Accounts (from Sales Ledger customers and Purchase Ledger suppliers), then Contacts, then Opportunities (with order and invoice history), then Products and Pricebook entries, then BOM and Stock variants, then Activity notes and document attachments, then the Nominal Ledger chart and inter-company mapping, then Payroll submissions. Each phase emits a row-count reconciliation report before the next phase begins. We use Salesforce Bulk API 2.0 for high-volume phases with batch chunking, parent-record lookup resolution, and exponential backoff on rate-limit responses.
Cutover, validation, and automation rebuild handoff
We freeze Opera 3 writes during cutover, run a final delta migration of any records created or modified during the migration window, then enable Salesforce as the system of record. We deliver a written inventory of every Opera 3 workflow, automation, and OPUS add-on configuration that does not migrate as code, with a recommended Salesforce Flow equivalent for each. We support a one-week hypercare window to resolve reconciliation issues raised by the customer's team. We do not rebuild Opera 3 workflows as Salesforce Flow, configure Salesforce reports and dashboards, or provide admin training as part of the migration scope — these are separate engagements.
Platform deep dives
Opera 3
Source
Strengths
Weaknesses
Salesforce Sales Cloud
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 Opera 3 and Salesforce Sales Cloud.
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
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 Salesforce Sales Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Opera 3 to Salesforce Sales Cloud 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 Salesforce Sales Cloud
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.