CRM migration

Migrate from Opal CRM to Twenty CRM

Field-level mapping, validation, and rollback between Opal CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

Opal CRM logo

Opal CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

60%

6 of 10

objects map 1:1 between Opal CRM and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Opal CRM organizes its data around field-sales workflows—leads tracked from capture through quotation with role-based permissions for Sales Reps, Managers, and Admins. Twenty CRM is an open-source, developer-friendly platform built with a modern GraphQL API, custom objects available from the free tier, and a transparent AGPL-3.0 codebase on GitHub with over 40,000 stars. The structural difference that defines this migration is Opal's lack of a documented public REST API or bulk export endpoint: data extraction relies on manual coordination with Opal support or direct database access, which we scope and validate before any data moves. We preserve the relationship between Sales Representatives and their assigned Leads, decompress Tour Plan expense line items into structured records, and map Opal's quotation workflow state to a custom field in Twenty. We do not migrate Workflows, Sequences, automations, or Reports as code; these require rebuild in Twenty by the customer's admin team.

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

Opal CRM logo

Opal CRM

What's pushing teams away

  • Limited integrations beyond two-lines-of-code setup mean teams with established tech stacks hit walls when connecting to accounting, marketing, or telephony tools.
  • Small user review sample on G2 and Capterra makes it difficult to assess long-term reliability and support quality before committing.
  • No clear public documentation for a REST API or bulk export endpoint means teams cannot programmatically migrate data or build automated workflows.
  • Scalability concerns emerge as teams grow beyond the Standard plan — pricing is per-organization rather than per-user, and feature gates between tiers are not clearly documented.
  • Support responsiveness is not quantified on the website, and the absence of a public status page or community forum makes it hard to gauge ongoing platform reliability.

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 Opal CRM objects map to Twenty CRM

Each row shows how a Opal CRM 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.

Opal CRM

Lead

maps to

Twenty CRM

Person (standard object)

1:1
Fully supported

Opal CRM Leads are the primary record for field-sales prospects captured from forms, campaigns, and manual entry. They map directly to Twenty's Person object, preserving contact fields (name, phone, email, address) and any source attribution. If Opal Lead records include point-based performance data (a feature in the Basic plan), we carry it to a custom number field in Twenty rather than discarding it.

Opal CRM

Sales Representative

maps to

Twenty CRM

WorkspaceMember (user provisioning)

1:1
Fully supported

Opal CRM team members with roles (Sales Rep, Manager, Admin) migrate as Twenty Workspace Members. Role permissions in Opal (role-based access tiers) do not export as structured data, so we capture the role assignment per user and document the mapping so the customer's Twenty admin can configure equivalent access levels in Twenty's workspace settings during setup.

Opal CRM

Tour Plan

maps to

Twenty CRM

Custom Object (TourPlan) + related Task records

1:many
Fully supported

Opal CRM Tour Plans store itinerary data (dates, locations, assigned rep) plus expense line items. If Opal exports Tour Plans as a flat record, we decompress the expense entries from any available structured export and reconstruct them as individual TourPlanExpense records linked to the parent TourPlan. Twenty does not have a native Tour or Visit object, so we pre-create a custom object schema in Twenty via the Settings UI and the metadata API before migration.

Opal CRM

Quotation

maps to

Twenty CRM

Opportunity (with line items)

1:1
Fully supported

Opal CRM Quotations are financial sales-closure records with line items and workflow approval state. They map to Twenty Opportunities, with Quotation header fields (total amount, status, dates) as Opportunity fields and line items as related OpportunityLineItem-equivalent records in Twenty's custom object structure. The approval workflow state from Opal is a platform-specific field with no direct Twenty equivalent; we preserve it as a custom picklist field workflow_state__c and document it in the handover notes.

Opal CRM

Pipeline Stage

maps to

Twenty CRM

Custom field on Person or Opportunity (stage name + order)

lossy
Fully supported

Opal CRM tracks lead progress through pipeline stages tied to its lead engagement workflow. Stage names and order are preserved as a custom picklist field (pipeline_stage__c) on the migrated Person record, and the customer configures matching stage values in Twenty's pipeline view settings post-migration. We do not assume a fixed number of stages; we extract the actual stage set from the source data during discovery.

Opal CRM

Activity (Calls, Emails, Meetings)

maps to

Twenty CRM

Task records with activity type flag

1:1
Fully supported

Opal CRM interaction logs (calls, emails, meetings) attached to Leads migrate as Twenty Task records with a custom activity_type__c field (call, email, meeting) and ActivityDate set to the original Opal timestamp. If the interaction has notes or a disposition, these land in the Task body and the customer configures Twenty's timeline view to surface the relevant fields per activity type.

Opal CRM

Custom Properties on Lead

maps to

Twenty CRM

Custom fields on Person

lossy
Fully supported

Opal CRM supports custom fields on Leads, but the custom field schema is not publicly documented. We identify custom fields during discovery by inspecting the Opal export file, infer field types (text, number, date, picklist, checkbox), and pre-create matching custom fields in Twenty via the settings UI before migration. Any custom field that cannot be typed from the export lands as a text field with a flag for the admin to re-type post-migration.

Opal CRM

Lead Source Attribution

maps to

Twenty CRM

Custom field on Person (lead_source)

1:1
Fully supported

Opal CRM captures leads from website forms, offline events, marketing campaigns, and manual entry. We preserve the source attribution as a custom lead_source__c field on the Person record so the customer's sales team can report on pipeline origin in Twenty without rebuilding the source-tracking logic.

Opal CRM

Performance Points / Rewards

maps to

Twenty CRM

Custom number fields on Person or WorkspaceMember

1:1
Fully supported

Opal CRM's Basic plan includes sales performance tracking using a point/rewards system. This does not have a standard CRM equivalent in Twenty. We migrate any visible point totals or reward flags as custom number fields on the Person (for lead-level scores) or WorkspaceMember (for rep-level performance) and document the field in handover notes so the admin can configure reporting or remove it if the tracking model changes.

Opal CRM

Role Permissions (per-user)

maps to

Twenty CRM

WorkspaceMember access configuration

lossy
Fully supported

Opal CRM role assignments (Admin, Manager, Sales Rep) are attached to team member records but do not export as structured permission data. We list every user's assigned role during discovery and produce a role-mapping table that the Twenty admin uses to configure workspace-level access in Twenty's member settings post-migration. We do not set permissions programmatically because Twenty's permission model operates at the workspace and object level rather than role-based groups.

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.

Opal CRM logo

Opal CRM gotchas

High

No publicly documented API for bulk data export

Medium

Tour Plan expense data may flatten during export

Medium

Quotation workflow state is not a standard CRM field

Low

Free tier limits and trial expiry not visible in export

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

  • No public API on Opal CRM requires manual export coordination

    Opal CRM does not publish REST API documentation or a bulk export endpoint in its public-facing resources. The docs.opal.dev domain resolves to Optimizely Opal, a separate product unrelated to Opal CRM. Data extraction relies on a manual CSV or database export coordinated directly with Opal support or the customer's account access. We scope the export format during discovery, validate record counts against the Opal UI before migration begins, and flag any truncation or flattening in the source export that affects Tour Plan expense line items or quotation workflow state.

  • Tour Plan expense data may flatten in the source export

    Opal CRM Tour Plans store itinerary records plus individual expense line items. If Opal's export mechanism produces a flat CSV row per Tour Plan rather than a row per expense entry, the line items collapse into a single notes field and require reconstruction. We decompress any structured export we receive, reconstruct expense entries as individual records, and cross-reference totals against the parent Tour Plan during reconciliation to catch missing or truncated expense data before it reaches Twenty.

  • Quotation workflow state has no direct Twenty equivalent

    Opal CRM quotations pass through an internal approval workflow with platform-specific status values. Twenty's Opportunity object has StageName (open/closed won/closed lost) but not a native approval-state field. We capture the Opal workflow state as a custom picklist field workflow_state__c on the migrated Opportunity and document it in the handover notes. The customer's admin decides whether to rebuild the approval logic as a Twenty workflow (which Twenty calls 'Automations') using Twenty's no-code automation builder in Settings.

  • Custom field schema is not documented in Opal CRM

    Opal CRM supports custom fields on Leads and possibly other objects, but the schema is not publicly documented and cannot be discovered via API. We identify custom fields during discovery by examining the actual export file structure. Any field whose type cannot be inferred from the export data (for example, a picklist with unknown allowed values) lands as a text field in Twenty with a flag for the admin to re-type and configure in Twenty's field settings post-migration.

Migration approach

Six steps for a successful Opal CRM to Twenty CRM data migration

  1. Discovery and export feasibility assessment

    We audit the source Opal CRM account across all tiers, identifying Lead records, Sales Representatives, Tour Plans, Quotations, and any custom field schemas visible in the export. Because Opal CRM has no public API, we coordinate a manual export file with the customer—typically CSV or a platform-generated backup—and validate record counts against the Opal UI before committing to the migration scope. This step also includes a Twenty environment review to confirm the target workspace is set up and the customer's admin has verified access.

  2. Schema design in Twenty CRM

    We design the destination schema in Twenty before any data loads. This includes creating the custom TourPlan and TourPlanExpense objects via Twenty's Settings UI and metadata API, adding custom fields (workflow_state__c on Opportunity, lead_source__c on Person, activity_type__c on Task, and performance/reward number fields), and configuring workspace member access based on the role-mapping table from discovery. Twenty's flexible data model means we build the schema to fit Opal's field-sales structure rather than forcing Opal data into a fixed Twenty template.

  3. Export coordination and data extraction

    We work with the customer to extract a full data export from Opal CRM. The export format depends on what Opal exposes at the time of engagement—typically CSV with one row per object type. We inspect the export for structural issues: flattened Tour Plan expense entries, quotation line items in a separate sheet, and custom field values that require type inference. Any issues are flagged and resolved with the customer before transformation begins.

  4. Transformation and sandbox validation

    We transform the Opal export into Twenty's API-compatible format: Person records from Leads with all fields mapped, Opportunities from Quotations with line items, custom TourPlan records with related expense child records, Tasks for activity history, and WorkspaceMember records for each Sales Representative. We run the full migration into Twenty's test environment first and reconcile record counts (Person count, Opportunity count, TourPlan count, Task count) against the source export before any production load.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Workspace Members first (so owner resolution works), then Person records, then Opportunities with workflow_state__c preserved, then TourPlan custom records with expense children, then Tasks for activity history. Each phase emits a row-count reconciliation report. Any Opal export row that cannot be loaded (missing required field, malformed date) is logged to an exceptions sheet for the customer's admin to review and resolve before cutover.

  6. Cutover, validation, and workflow handoff

    We freeze Opal CRM writes during cutover, run a final delta migration of any records modified during the migration window, then designate Twenty as the system of record. We deliver a written inventory of Opal quotation workflow states, Tour Plan structures, and role assignments that the customer's admin uses to configure Twenty Automations and workspace permissions. We support a one-week hypercare window for reconciliation issues. We do not rebuild automations, approval workflows, or reporting as part of the migration scope; these are documented separately for the admin to configure in Twenty's no-code automation builder.

Platform deep dives

Context on both ends of the pair

Opal CRM logo

Opal CRM

Source

Strengths

  • Free tier for up to two users provides a genuine no-cost entry point for very small teams.
  • Native Tour Planning module handles field-sales route and expense tracking without third-party add-ons.
  • Quotation workflow with approval steps is included at Basic tier pricing.
  • Lead capture from multiple channels (forms, uploads, manual) is built into the core workflow.
  • Affordable fixed monthly pricing at $220 and $350 for two tiers is predictable for small-business budgets.

Weaknesses

  • No publicly documented REST API or bulk export mechanism, making programmatic data extraction uncertain.
  • Small review sample on G2 (2 reviews) and limited third-party coverage makes platform reliability hard to verify independently.
  • Integration approach described as 'two lines of code' is vague and suggests limited connector ecosystem.
  • Pricing is per-organization not per-user, which may become cost-inefficient as team size grows.
  • No public roadmap, community forum, or status page to assess long-term platform health.
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 Opal CRM 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

    Opal CRM: Not publicly documented..

  • Data volume sensitivity

    B

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

Estimator

Estimate your Opal CRM 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 Opal CRM to Twenty CRM data migrations

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

Can't find your answer?

Walk through your Opal CRM 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 three and five weeks for accounts with up to 10,000 Leads, 2,000 Quotations, and a straightforward Tour Plan structure. Migrations involving extensive custom field schema discovery, multi-entry Tour Plan expense line items, or a parallel self-hosted Twenty deployment move to eight to twelve weeks because the schema design and reconciliation require additional cycles. The manual export coordination with Opal CRM also adds time on the front end compared to migrations from platforms with documented APIs.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Opal CRM.
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