CRM migration
Field-level mapping, validation, and rollback between Opera 3 and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Opera 3
Source
Freshsales
Destination
Compatibility
7 of 10
objects map 1:1 between Opera 3 and Freshsales.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Pegasus Opera 3 to Freshsales is a structured extraction from a legacy on-premises ERP into a cloud-native CRM. Opera 3 stores CRM contacts, companies, and activities in tightly-coupled SQL Server or Visual FoxPro tables alongside accounting, payroll, and stock data; there is no public REST API, so extraction relies on built-in CSV exports for Sales Ledger and Purchase Ledger contacts, with RTI XML files handling payroll history. We sequence the export in dependency order—companies and contacts first, then deals and invoices, then activity notes—map Opera 3's account codes and cost-centre structures to Freshsales' Account and Contact objects, and load via the Freshsales REST API with batch chunking. The OPUS customer-product variant add-on, multi-company inter-company balances, and bespoke custom fields require manual field-by-field review and are flagged in the written inventory rather than auto-migrated. Workflows, automations, and report definitions from Opera 3 do not migrate as code; we document them for your admin team to rebuild in Freshsales' automation builder.
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 Freshsales, 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
Freshsales
Contact
1:1Opera 3 Sales Ledger contact records export via CSV with fields for account code, company name, billing address, delivery address, payment terms, credit limit, and multi-currency settings. We map the Opera 3 account code to Freshsales Contact phone/email fields and create the Contact record with the full postal address stored in Freshsales' address compound field. Any Opera 3 contact without an email address is flagged for manual enrichment during migration.
Opera 3
Purchase Ledger Supplier
Freshsales
Account (type = Customer or Vendor)
1:1Opera 3 Purchase Ledger supplier records use the same account schema as Sales Ledger but with supplier-specific fields. We map these to Freshsales Account records with the Account Type field set to Vendor for suppliers and Customer for any supplier records that also have outgoing sales invoices. This requires a dedupe check against any Sales Ledger accounts with matching company names.
Opera 3
Sales Ledger Company / Multi-Company Code
Freshsales
Account
1:1Opera 3 multi-company configurations store separate company codes with individual Sales Ledger, Purchase Ledger, and Nominal Ledger instances. We export each company code as a separate entity and create a corresponding Freshsales Account. For inter-company transactions (where one Opera 3 company code invoices another), we flag these as internal and do not create duplicate Accounts; instead, we map the counterparty company code to a note field on the Account for reconciliation.
Opera 3
Sales Order / Purchase Order
Freshsales
Deal
1:1Opera 3 order headers and line items export with order number, order date, status (open/closed), customer reference, delivery address, and line-level pricing including discounts. We map these to Freshsales Deals with the order number stored as a custom field, order date as Deal creation date, and the delivery address as a custom address field on the Deal. Line items are not a standard Freshsales object; we store them as a JSON-formatted note attachment or as Deal Product records if the customer's Freshsales plan includes the Products module.
Opera 3
Sales Invoice / Purchase Invoice
Freshsales
Deal (Closed Won) + Note attachment
1:manyOpera 3 invoices export with header totals that must reconcile to the sum of line items (enforced by the SQL SE health checker). We map closed invoices to Freshsales Deals with stage set to Closed Won, invoice total as Deal Amount, and invoice date as close date. The invoice PDF (migrated from Opera 3's document folder) attaches as a note to the Deal. Invoice line items store as a JSON note on the Deal since Freshsales does not have a native invoice line item object.
Opera 3
CRM Contact (built-in module)
Freshsales
Contact
1:1Opera 3's built-in CRM module stores contacts with company association, activity notes (text-based), and custom fields from the OPUS add-on. Activity notes export as plain text and map to Freshsales Activity records (type = Note) linked to the Contact. OPUS custom fields are not standardised and require manual field-by-field review; we flag each one as unmapped in the written inventory.
Opera 3
CRM Activity Note
Freshsales
Activity (Note)
1:1Opera 3 activity logs are text-based notes rather than structured events with timestamps, attendees, or disposition codes. We extract the note body and creation date, then create Freshsales Activity records with type = Note attached to the corresponding Contact or Account. The original timestamp is preserved as the Activity Date. Call disposition, duration, and meeting attendee data (if present) map to Freshsales Call or Meeting activity types with the relevant fields populated.
Opera 3
OPUS Customer Product Variant
Freshsales
Account Product / Price List Entry
lossyThe OPUS add-on stores customer-specific stock code variants outside the main stock schema — a different product code and description per customer for the same base product. We join the OPUS export to the main product export using the base stock code and customer account reference, then create Freshsales Price List entries tied to the Account. This requires the customer to confirm whether Freshsales Products or Price List entries are the preferred destination for variant pricing. We do not auto-create products; we deliver a mapping table for the admin to configure.
Opera 3
Employee
Freshsales
User or Contact (owner mapping)
1:1Opera 3 employee records export via CSV with name, email, start/end dates, bank details, and P45 data. RTI FPS XML files contain tax submission records and EPS files hold employer payment summaries. We map Opera 3 employees who are active sales or service users to Freshsales User records (for Owner assignment), and non-user employees to Contact records for reference. The customer's Freshsales admin provisions the User accounts and assigns role-based permissions before migration begins.
Opera 3
Custom Properties / User-Defined Fields (OPUS)
Freshsales
Custom Field (unmapped)
lossyCustom fields added via the OPUS add-on or bespoke modifications to the Visual FoxPro schema are not standardised across installations. We do not automatically migrate bespoke custom fields. We deliver a written inventory of every OPUS custom field found in the export, including its data type, current values, and the objects it applies to, so the customer's admin can create equivalent custom fields in Freshsales and map them manually.
| Opera 3 | Freshsales | Compatibility | |
|---|---|---|---|
| Sales Ledger Contact | Contact1:1 | Fully supported | |
| Purchase Ledger Supplier | Account (type = Customer or Vendor)1:1 | Fully supported | |
| Sales Ledger Company / Multi-Company Code | Account1:1 | Fully supported | |
| Sales Order / Purchase Order | Deal1:1 | Fully supported | |
| Sales Invoice / Purchase Invoice | Deal (Closed Won) + Note attachment1:many | Fully supported | |
| CRM Contact (built-in module) | Contact1:1 | Fully supported | |
| CRM Activity Note | Activity (Note)1:1 | Fully supported | |
| OPUS Customer Product Variant | Account Product / Price List Entrylossy | Fully supported | |
| Employee | User or Contact (owner mapping)1:1 | Fully supported | |
| Custom Properties / User-Defined Fields (OPUS) | Custom Field (unmapped)lossy | 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
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
Discovery and export method scoping
We audit the Opera 3 installation — edition (Visual FoxPro or SQL SE), installed modules (Sales Ledger, CRM, OPUS add-on, multi-company configuration), approximate record volumes per object, and export method availability. We confirm whether built-in CSV exports cover the required fields or whether direct SQL reads are needed for the CRM and activity history. We also identify any bespoke WCF endpoints and assess their export capability. The discovery output is a written scope document confirming what migrates, what requires manual field mapping, and what is documented but not auto-migrated.
Export extraction from Opera 3
We run CSV exports from Opera 3's built-in export utilities for Sales Ledger contacts, Purchase Ledger suppliers, and order/invoice headers. For SQL SE installations, we run direct SQL reads against the source database to extract CRM contact records, activity notes, and OPUS variant records where the CSV exports are insufficient. We run the Opera 3 health checker (for SQL SE) to surface any invoice total reconciliation failures before extraction, and we extract RTI FPS/EPS XML files for payroll history if employee-to-User mapping is scoped. All exports are validated against row counts and field presence before the transform phase begins.
Transform and schema mapping
We transform the Opera 3 export files into Freshsales-compatible JSON or CSV formats. This includes splitting the Sales Ledger into Freshsales Contacts (with account lookup) and Purchase Ledger into Freshsales Accounts, mapping the OPUS variant join to Price List entries, resolving inter-company counterparty codes, and converting activity text notes to Freshsales Activity records with the original timestamp preserved. Any records failing validation (missing required Freshsales fields, unmatched Owner lookups) are logged to a reconciliation queue. We also produce the custom field inventory document for OPUS and bespoke custom fields.
Freshsales sandbox load and reconciliation
We load the transformed data into a Freshsales sandbox or trial tenant using the Freshsales REST API with OAuth 2.0 authentication. The customer's admin spot-checks 25-50 records against the Opera 3 source for field accuracy, verifies that inter-company Account relationships are correctly represented, and confirms that activity notes appear on the correct Contact and Account timelines. Any mapping corrections are made in the transform layer before production load begins.
Production migration and cutover
We run the production migration in dependency order: Accounts (from Opera 3 companies), then Contacts, then Deals (from orders and closed invoices), then Activity records. We use the Freshsales REST API with batch endpoints and rate-limit handling. Owner assignment uses email-match lookup against the User table; any unmatched Owners are held in the reconciliation queue until the admin provisions the User. We freeze Opera 3 CRM writes during cutover, run a final delta migration of any records modified during the window, then switch the team to Freshsales as the system of record.
Automation inventory handoff and post-migration support
We deliver the written automation inventory documenting every Opera 3 workflow rule, alert trigger, and cross-module automation found in the installation, with a recommended Freshsales automation equivalent for each. We do not rebuild Opera 3 workflows in Freshsales as part of the migration scope; that work is handled by the customer's admin team or a Freshsales implementation partner. We offer a one-week hypercare window to resolve reconciliation issues raised during the first week of live Freshsales usage.
Platform deep dives
Opera 3
Source
Strengths
Weaknesses
Freshsales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Freshsales.
Object compatibility
2 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 Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Opera 3 to Freshsales 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 Freshsales
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.