CRM migration
Field-level mapping, validation, and rollback between Opera 3 and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Opera 3
Source
Twenty CRM
Destination
Compatibility
6 of 11
objects map 1:1 between Opera 3 and Twenty CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Pegasus Opera 3 to Twenty CRM is a migration from a legacy UK ERP with a bundled CRM module to a modern open-source CRM purpose-built for teams that want developer control and self-hosting options. Opera 3 stores CRM data in a tightly-coupled SQL Server or Visual FoxPro schema with no public REST API, meaning extraction relies on CSV exports and direct database reads. The most technically significant migration step is transforming Opera 3's text-based activity notes into Twenty's structured Task and Note objects so the timeline carries usable history. We do not migrate accounting ledgers, payroll records, stock registers, or fixed asset data — those belong in a dedicated accounting platform, not a CRM. Workflows, custom report definitions, and OPUS add-on bespoke fields are documented in a written inventory for your admin to rebuild post-migration.
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 Twenty 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
CRM Contact / Person
Twenty CRM
People
1:1Opera 3's built-in CRM Contact records export via CSV with name, email, phone, address, and account link. We map these to Twenty People records using the display name, primary email, and phone fields. Opera 3's CRM Contact to Company link maps to the Twenty People.organizationId relationship resolved after Company import. If Opera 3 stores contact role or type in a separate field, we map it to a custom field on People or to the Twenty workInformation block.
Opera 3
CRM Company
Twenty CRM
Company
1:1Opera 3's CRM company records export as a separate CSV from the Sales Ledger accounts. We map company name, address, website, industry, and employee count to Twenty Company fields. The Opera 3 account code becomes a reference field we preserve in a custom field for audit. Companies are imported before People so that the organizationId lookup is satisfied at the moment of People insert.
Opera 3
CRM Activity (text notes)
Twenty CRM
Task or Note
1:manyOpera 3 stores CRM activities as free-text notes without structured event type, date, or duration fields. We parse each activity note for date mentions, action verbs (call, email, meeting), and outcome keywords, then map qualifying entries to Twenty Task records (for action items with a due date or status) or Note records (for contextual history). Date-stamped activity notes migrate with the parsed date; undated notes migrate with the record creation timestamp. This transformation is the most technically significant step in the migration because Opera 3 does not enforce activity structure.
Opera 3
Sales Ledger Account
Twenty CRM
Company and/or People
1:manyOpera 3 Sales Ledger accounts can represent organisations or sole traders with individual contact details stored in the same record. We analyse each account for organisation name, individual name, and contact fields to determine whether it maps to a Twenty Company, a Twenty People record, or both. Accounts flagged as individual (sole trader) map to People; accounts with a company name and multiple contacts map to a Company with linked People records. Payment terms, credit limits, and multi-currency settings from Opera 3 are preserved as custom fields on the target record.
Opera 3
Sales Order
Twenty CRM
Opportunity
1:1Opera 3 Sales Order headers and line items export via CSV with order number, customer reference, order date, status, and totals. We map these to Twenty Opportunity records with the order total mapped to the Opportunity amount field, order date mapped to Opportunity createdAt, and status mapped to an Opportunity stage custom field. Line items map to Opportunity line items if Twenty's Opportunity supports product associations, or are preserved as Note records attached to the Opportunity.
Opera 3
Stock / Product
Twenty CRM
Product
1:1Opera 3 stock codes, descriptions, unit prices, and reorder levels export via the stock CSV. We map stock code to Product code, description to display name, and standard selling price to the standard price field. Customer-specific product variants from the OPUS add-on (stored in a separate CSV with base stock code and customer reference) map to Product variants or are preserved as custom Product records with a customer association field. We flag OPUS variant records for manual review if the variant mapping requires price-list entry creation in Twenty.
Opera 3
Employee (CSV export)
Twenty CRM
People
lossyOpera 3 employees export via the HR/Payroll CSV with name, address, bank details, start date, and P45 data. We map employees flagged as sales or CRM users to Twenty People records (with a team membership field to identify them as internal staff rather than external contacts). Non-CRM employees are archived as an output file rather than loaded into Twenty. RTI FPS and EPS XML files are not processed as CRM data; they remain in the HR/payroll scope for a dedicated payroll system migration if required.
Opera 3
OPUS Customer Product Variant
Twenty CRM
Product or Custom Object
lossyThe OPUS add-on stores customer-specific stock code variants outside the main product schema. Each OPUS record contains a base stock code, a customer account reference, and a customer-specific description and price. We join OPUS records to the main product export using the base stock code, then map each variant to a Twenty Product record with a custom customer association field or to a Custom Object (if the customer's variant model is complex). The customer chooses the strategy during scoping based on how they use the variant data.
Opera 3
Document Attachment (PDF)
Twenty CRM
Note with attachment
1:1Opera 3 stores PDF invoices, statements, and remittance advices as binary files in document folders, with filenames containing the invoice or account reference. We extract the PDF, parse the reference, and attach it to the corresponding Twenty Company or Opportunity record as a Note with a file attachment. PDF filenames that do not match a migrated record are flagged in a separate reconciliation list for manual assignment.
Opera 3
Multi-Company Structure
Twenty CRM
Multiple Company records with ownership field
1:1Opera 3 supports multiple company codes under one installation with inter-company transactions stored as standard invoices with a counterparty code. We extract each company as a separate Opera 3 company entity, map each to a Twenty Company record, and set a custom field for the source company code and inter-company flag. Inter-company debtor and creditor balances are preserved as Notes on the relevant Company records for the customer's finance team to reconcile in their accounting platform.
Opera 3
Custom Properties (OPUS or bespoke VF schema)
Twenty CRM
Custom Object or Custom Field
lossyCustom fields added via the OPUS add-on or bespoke modifications to the Visual FoxPro schema are not standardised and vary by installation. We do not automatically migrate bespoke fields. During discovery we document every named custom field found in the Opera 3 schema, classify each as either a standard field mapping (if the data type is compatible with a Twenty standard field) or a custom field (mapped to a Twenty custom field on the relevant object or to a Custom Object). The customer reviews the inventory and approves which custom fields enter the migration scope.
| Opera 3 | Twenty CRM | Compatibility | |
|---|---|---|---|
| CRM Contact / Person | People1:1 | Fully supported | |
| CRM Company | Company1:1 | Fully supported | |
| CRM Activity (text notes) | Task or Note1:many | Fully supported | |
| Sales Ledger Account | Company and/or People1:many | Fully supported | |
| Sales Order | Opportunity1:1 | Fully supported | |
| Stock / Product | Product1:1 | Fully supported | |
| Employee (CSV export) | Peoplelossy | Fully supported | |
| OPUS Customer Product Variant | Product or Custom Objectlossy | Fully supported | |
| Document Attachment (PDF) | Note with attachment1:1 | Fully supported | |
| Multi-Company Structure | Multiple Company records with ownership field1:1 | Fully supported | |
| Custom Properties (OPUS or bespoke VF schema) | Custom Object or Custom Fieldlossy | 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
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
Discovery and export method scoping
We audit the source Opera 3 installation to determine the edition (Visual FoxPro or SQL SE), identify which CRM modules are in use, and assess the export method for each data type. We extract a sample CSV for Contacts, Companies, Activities, Sales Orders, Products, and Employees and validate that the fields required for mapping are present and populated. If CSV exports are insufficient (for example, if CRM activities span multiple related tables), we scope a direct SQL Server read against the Opera 3 SQL SE database or a file-system extraction from the Visual FoxPro installation. The discovery output is a written migration scope with record counts per object, export method per object, and a list of any known data quality issues in the source.
Workspace setup in Twenty
We provision the Twenty workspace by creating all required custom fields on People and Company (and any custom objects) before any CSV import begins, using the /metadata API. We invite all team members via Settings → Members so that user references in owner fields can be resolved at import time. We create a data model mapping document that references the Opera 3 field names, the Twenty target field names, and any transformation logic (for example, activity type parsing or multi-company flagging). If the customer uses OPUS customer-specific product variants, we define the variant mapping strategy during this step and confirm the target (custom fields on Product or a Custom Object).
Activity transformation logic build and test
We build the activity parsing engine that transforms Opera 3 text notes into Twenty Task and Note records. The engine uses pattern matching on date formats, action verbs (call, email, meeting, visited, contacted), and outcome keywords (discussed, agreed, sent, booked). We run the parser against a sample of 200 activity notes and present the parsed output for customer review. The customer validates that the inferred activity types and dates are acceptable. Any parsing rules that produce incorrect categorisations are adjusted before the full production run. This step is the most time-sensitive because activity history quality directly affects user adoption post-migration.
Test migration and reconciliation
We run a full test migration into a clean Twenty workspace using production-like data volume. The customer reconciles record counts (People in, Companies in, Activities in), spot-checks 25-50 randomly selected records against the Opera 3 source, and reviews the parsed activity sample. We correct any mapping errors, adjust the activity parsing rules, and resolve any orphaned records (for example, People with no organisationId because the parent Company had not yet been imported). The customer signs off the test migration before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: Companies first (to satisfy the organisationId lookup on People), then People (with owner references resolved against the invited Members list), then Opportunities (with company and people relationships resolved), then Activities (with parsed type and date applied and parent record references resolved), then Products (with OPUS variant mapping applied), then Document attachments. Each phase emits a row-count reconciliation report before the next phase begins. We freeze Opera 3 CRM writes during the cutover window and run a final delta migration of any records modified during the migration window before switching Twenty to system of record.
Cutover, validation, and rebuild handoff
We enable Twenty as the system of record and deliver the View, Workflow, and Permission inventory document to the customer's admin team. 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 CRM views or workflows as Twenty equivalents inside the migration scope — that work is documented in the handoff inventory and handled by the customer's admin. We do not migrate accounting data (nominal ledger, purchase ledger, payroll, fixed assets, bank transactions) or RTI files because those belong in a dedicated accounting platform, not a CRM.
Platform deep dives
Opera 3
Source
Strengths
Weaknesses
Twenty 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 Opera 3 and Twenty 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
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 Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Opera 3 to Twenty 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 Twenty 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.