CRM migration

Migrate from Opera 3 to Twenty CRM

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 logo

Opera 3

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

55%

6 of 11

objects map 1:1 between Opera 3 and Twenty CRM.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Opera 3 logo

Opera 3

What's pushing teams away

  • Customer service ratings are consistently below competitors (3.8/10 on Capterra), with users reporting slow response times and difficulty reaching knowledgeable support staff.
  • Steep learning curve for non-accountants, particularly around multi-company setups, inter-company transactions, and the report generator's customisation layer.
  • Frequent product updates and version migrations cause friction, especially for customers on the Visual FoxPro edition who face a mandatory upgrade path to SQL SE.
  • Limited ecosystem compared to global platforms — fewer third-party integrations, no marketplace, and bespoke API work required for modern data pipelines.
  • Modern SaaS alternatives like Xero and QuickBooks offer faster onboarding, automatic updates, and lower upfront cost, prompting smaller customers to migrate.

Choosing

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Opera 3 objects map to Twenty CRM

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

maps to

Twenty CRM

People

1:1
Fully supported

Opera 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

maps to

Twenty CRM

Company

1:1
Fully supported

Opera 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)

maps to

Twenty CRM

Task or Note

1:many
Fully supported

Opera 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

maps to

Twenty CRM

Company and/or People

1:many
Fully supported

Opera 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Opera 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

maps to

Twenty CRM

Product

1:1
Fully supported

Opera 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)

maps to

Twenty CRM

People

lossy
Fully supported

Opera 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

maps to

Twenty CRM

Product or Custom Object

lossy
Fully supported

The 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)

maps to

Twenty CRM

Note with attachment

1:1
Fully supported

Opera 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

maps to

Twenty CRM

Multiple Company records with ownership field

1:1
Fully supported

Opera 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)

maps to

Twenty CRM

Custom Object or Custom Field

lossy
Fully supported

Custom 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.

Gotchas + challenges

What specifically takes care here

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 logo

Opera 3 gotchas

High

Visual FoxPro to SQL SE migration is mandatory and non-reversible

Medium

RTI FPS/EPS payroll files use cryptic renamed filenames after HMRC submission

Medium

Customer Products add-on stores customer-specific stock variants outside the main item schema

High

No public API — data export relies on CSV, XML RTI files, or bespoke WCF

Low

Multi-company inter-company balances require cross-reference mapping

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Opera 3 has no public REST API — extraction relies on CSV exports or direct SQL

    Opera 3 exposes no documented REST or GraphQL API. Data extraction relies on built-in CSV exports for ledgers and contacts, RTI XML files for payroll submissions, and PDF archives for document attachments. Where CSV exports are insufficient (for example, when the CRM activity log spans multiple tables), we use direct SQL Server reads against the Opera 3 SQL SE database or file-system reads against the Visual FoxPro installation. We scope the export method during discovery and validate export completeness before designing the transformation pipeline. If the Visual FoxPro edition is in use, we flag the mandatory SQL SE upgrade path because Visual FoxPro data access is file-system dependent and less reliable for large record sets.

  • CRM activities in Opera 3 are text notes, not structured events

    Opera 3's built-in CRM module stores activities as free-text notes without structured event type, date, duration, or outcome fields. There is no equivalent to a structured call log, meeting record, or email engagement. We parse each note for date mentions, action keywords, and outcome indicators to infer the activity type and map to Twenty Task or Note records. This transformation is best-effort — historical notes that contain no date or action signal are imported as Note records with the original text preserved. The customer should review a sample of 50 parsed activities against the source to validate the transformation quality before committing to full production load.

  • Twenty requires custom fields to be created before CSV import

    Twenty's CSV import creates records, not fields. Custom fields must exist in Settings → Data Model before any import that populates them. We create all required custom fields during the workspace setup phase before any data loads, using the /metadata API to provision field metadata alongside the GraphQL schema generation. If the customer adds a new custom field requirement after migration begins, we must pause imports, add the field in Twenty, and resume. Twenty's People and Company objects also lack some standard fields present in other CRMs (per GitHub issue #13953), so we budget time for creating fields like department, jobTitle, and socialProfiles during setup.

  • Views, workflows, and permissions must be rebuilt in Twenty post-migration

    Twenty's documentation explicitly states that views, workflows, and permissions must be recreated manually after migration. Opera 3's report definitions, pipeline views, and any custom CRM workflows are not transferable to Twenty's object model. We deliver a written inventory of every Opera 3 CRM view, saved filter, and report definition for the customer's admin to rebuild in Twenty Settings → Data Model and Settings → Members. This inventory is produced during the discovery phase and handed off at the start of the configuration phase so rebuild work can begin in parallel with data migration.

  • Multi-company inter-company balances require cross-reference mapping

    Opera 3 stores inter-company transactions as normal invoices with a counterparty company code rather than a separate ledger type. When migrating CRM records (contacts, companies, activities) rather than accounting data, we flag each multi-company Company record with the source Opera 3 company code and an inter-company flag so the customer's finance team can correctly identify them in Twenty. We do not migrate the inter-company accounting balances because that data belongs in an accounting platform. The written inventory includes a cross-reference map of every Opera 3 company code to its corresponding Twenty Company record for the finance team's reference.

Migration approach

Six steps for a successful Opera 3 to Twenty CRM data migration

  1. 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.

  2. 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).

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Opera 3 logo

Opera 3

Source

Strengths

  • Integrated accounting, payroll, stock control, and CRM in one UK-compliant ERP platform.
  • SQL Server-backed data integrity with health checker validation and rollback capability during migrations.
  • Multi-company and multi-currency support for businesses with complex legal entity and international trading structures.
  • RTI payroll compliance with HMRC FPS/EPS XML filing built directly into the system.
  • Flexible reporting with Business Intelligence integration and Qlik Sense connectivity for advanced analytics.

Weaknesses

  • No public REST API — bespoke integrations require WCF endpoint development or CSV file exports.
  • Visual FoxPro edition (legacy) lacks features available in SQL SE such as AP Automation and Pegasus Data Connector.
  • Customer service ratings lag behind competing ERP platforms, with support speed cited as a recurring pain point.
  • Self-service migration tools only support movement between Opera 3 editions; cross-vendor migrations require direct engagement with Pegasus Professional Services.
  • UI and workflow design reflects traditional Windows desktop application patterns, creating friction for teams expecting modern SaaS UX.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Opera 3 and Twenty CRM.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Opera 3: Not publicly documented — no published API means no documented rate limits.

  • Data volume sensitivity

    B

    Opera 3 doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Opera 3 to Twenty CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Opera 3 to Twenty CRM data migrations

Answers to the questions buyers ask most during Opera 3 to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between two and four weeks for accounts under 5,000 Contacts and 2,000 Company records with clean CSV exports and straightforward activity parsing. Migrations requiring direct SQL Server reads for Opera 3 SQL SE, large activity history volumes (over 50,000 activity notes), multi-company CSV consolidation, or OPUS customer-product variant mapping move to six to ten weeks because of schema analysis time, activity transformation logic build and test, and cross-company reconciliation. The activity parsing validation step (Step 3) adds one to two weeks for customer review cycles if the source data has inconsistent note formatting.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Opera 3.
Land in Twenty CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day