CRM migration
Field-level mapping, validation, and rollback between Oracle CRM On Demand and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Oracle CRM On Demand
Source
Twenty CRM
Destination
Compatibility
8 of 10
objects map 1:1 between Oracle CRM On Demand and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Oracle CRM On Demand to Twenty CRM is a migration from a deprecated enterprise platform to a modern open-source CRM. Oracle CRM On Demand has been effectively sunset in favor of Oracle Sales Cloud, leaving organizations on an unsupported trajectory with dated tooling and high total cost of ownership. Twenty CRM, built on TypeScript and NestJS with a Next.js frontend, offers a self-hosted model with no per-seat licensing and a modern interface that development teams can contribute to directly. The migration requires resolving Oracle's 30 requests per minute API rate limit through batch sequencing, respecting the 168-hour window for list export file downloads, and mapping Oracle's Accounts, Contacts, Leads, Opportunities, and Activities to Twenty's Companies, People, and Opportunities objects. Custom objects require schema reverse-engineering from the source tenant before mapping. Workflow Rules, Assignment Rules, and Oracle Migration Tool configurations do not migrate; we deliver written documentation for the customer's admin to rebuild these in Twenty's settings. We do not provide post-migration workflow rebuild or training as standard scope.
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 Oracle CRM On Demand 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.
Oracle CRM On Demand
Account
Twenty CRM
Company
1:1Oracle Account records map directly to Twenty Company records. We normalize the Account Name, extract and structure address records (address fields from Oracle's location structure map to Twenty's address compound fields), and assign the Owner to the corresponding Twenty User resolved by email match. Oracle Account Type (Customer, Prospect, Partner, Competitor, etc.) maps to a Twenty custom field since Twenty's standard Company model uses a single Companies object without a built-in type classification.
Oracle CRM On Demand
Contact
Twenty CRM
Person
1:1Oracle Contact records map to Twenty Person records. We preserve name fields (first, last, title), email (used as dedupe key during import), phone, and any custom fields. Contact-to-Account linking is preserved by resolving the Oracle AccountId to the corresponding Twenty Company record on the Person's company_id field. Email deduplication runs against the Person table to prevent duplicate Person records for shared email addresses across the organization.
Oracle CRM On Demand
Lead
Twenty CRM
Person (or Lead)
1:manyOracle Leads require a split decision during migration scoping. If the source tenant is on the Enterprise Lead Referral tier, lead records are create-only via API with no edit or convert capability, meaning historical lead data may be limited. For standard tier tenants, we assess the Lead record state: Leads that are unqualified prospects map to Twenty Person records in a 'Lead' context; Leads that have been worked and contain sales activity may be converted in Oracle and migrate as Person records with opportunity associations. The Oracle Lead_Source and Lead_Status fields map to Twenty Person custom fields for attribution and status tracking.
Oracle CRM On Demand
Opportunity
Twenty CRM
Opportunity
1:1Oracle Opportunity records map directly to Twenty Opportunity records. StageName, Amount, Probability, Close_Date, and Description transfer directly. Oracle's Opportunity-to-Account association maps to Twenty's opportunity.company_id pointing to the migrated Company. Opportunity-to-Contact associations map via Twenty's opportunity.personId pointing to the migrated Person. We flag Opportunity records with no associated Account for admin reconciliation before production import.
Oracle CRM On Demand
Activity: Task
Twenty CRM
Task
1:1Oracle Task records map to Twenty Task records with Status, Priority, Subject, and due date preserved. Task assignment migrates by resolving Oracle's OwnerId to the Twenty User mapping table. Oracle's Task types (Call, Follow-up, Email, etc.) map to a Twenty custom task_type field since Twenty's standard Task model does not enforce a TaskSubtype enumeration. Activity ordering is preserved by setting Task due_date to the original Oracle timestamp.
Oracle CRM On Demand
Activity: Call
Twenty CRM
Task (task_type = Call)
1:1Oracle Call records map to Twenty Task records with task_type set to Call. Oracle call disposition, duration (Call_Duration_Secs), and notes migrate to Twenty custom fields on the Task. The WhoId (Contact or Lead reference) resolves to the corresponding Twenty Person. The WhatId (Opportunity or Account reference) resolves to the corresponding Twenty Opportunity or Company. Call recording URLs stored in Oracle custom fields migrate as Task attachment references if Twenty's attachment model supports URL-based linking.
Oracle CRM On Demand
Activity: Appointment
Twenty CRM
Task (task_type = Meeting)
1:1Oracle Appointment records map to Twenty Task records with task_type set to Meeting. Oracle's Start_Time and End_Time map to Twenty's due_date and due_date (or separate meeting_start and meeting_end custom fields if configured). Location migrates to a custom field. Attendee associations (Contact and Lead attendees) migrate to a meeting_attendees relationship if Twenty supports multi-person meeting records; otherwise, individual Task records are created per attendee with meeting metadata preserved.
Oracle CRM On Demand
Custom Object
Twenty CRM
Custom Object (or related Company/Person)
lossyOracle Custom Objects vary per tenant and require schema reverse-engineering from the source API before mapping. We extract the custom object definition (field names, types, relationships) via Oracle's REST API during discovery. Custom objects that reference standard objects (Account, Contact, Opportunity) map to Twenty custom objects with corresponding relationship fields. Custom objects that represent denormalized data (address lists, product catalogs) may be consolidated into a single Twenty custom object or linked via the company_id relationship depending on the data model intent.
Oracle CRM On Demand
User/Owner
Twenty CRM
User
1:1Oracle Named Users map to Twenty User accounts. We resolve by email match during migration. Any Oracle Owner referenced on a record but without a corresponding Twenty User is placed in a reconciliation queue for the customer's admin to provision. OwnerId references on Account, Contact, Opportunity, and Activity records are resolved at migration time against the User mapping table.
Oracle CRM On Demand
Attachment
Twenty CRM
Attachment
1:1Oracle record attachments export via Oracle's bulk export or API. We map file name, content type, and blob data to Twenty's attachment model if the target instance supports blob attachments. URL-based attachments (links to Oracle document management) migrate as URL fields on the target record. Large attachment volumes (thousands of files) require separate scoping because storage provisioning on the self-hosted Twenty instance is a customer infrastructure decision.
| Oracle CRM On Demand | Twenty CRM | Compatibility | |
|---|---|---|---|
| Account | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Lead | Person (or Lead)1:many | Fully supported | |
| Opportunity | Opportunity1:1 | Fully supported | |
| Activity: Task | Task1:1 | Fully supported | |
| Activity: Call | Task (task_type = Call)1:1 | Fully supported | |
| Activity: Appointment | Task (task_type = Meeting)1:1 | Fully supported | |
| Custom Object | Custom Object (or related Company/Person)lossy | Fully supported | |
| User/Owner | User1:1 | Fully supported | |
| Attachment | Attachment1: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.
Oracle CRM On Demand gotchas
REST API rate limit of 30 req/min is a migration bottleneck
List exports expire after 168 hours
Migration Tool requires identical release versions
Enterprise Lead Referral tier limits lead functionality
Export field access gated by user role privileges
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 source tenant audit
We audit the Oracle CRM On Demand tenant across API endpoint accessibility, installed modules (Standard CRM On Demand vs. Enterprise Lead Referral), custom object count, record volume per object, user role structure (to identify export privilege restrictions), active Workflow Rules and Assignment Rules, and any Oracle Desktop sync configurations. We run export tests under an administrator account with List - Export All Fields privilege to confirm complete field extraction capability. The discovery output is a written migration scope with record counts, custom object schema, and a Twenty deployment recommendation (self-hosted Docker, Railway, or PikaPods).
Twenty instance provisioning and schema design
We assist with provisioning the Twenty CRM instance on the customer's chosen hosting target (Docker Compose, Railway, PikaPods, or Kubernetes). We extract Oracle's custom object definitions via the API, reverse-engineer field types, and design the corresponding Twenty schema including custom fields, relationship fields (Company and Person lookups for custom objects), and any picklist values. Twenty's schema is configured via the settings UI and stored in the database; we document all field mappings in a schema design document before migration begins.
User mapping and Owner reconciliation
We extract every distinct Oracle Owner referenced on Account, Contact, Opportunity, and Activity records and match by email against the Twenty User table. Owners without a matching Twenty User go to a reconciliation queue. The customer's admin provisions any missing Twenty Users before record import resumes. OwnerId references on records are resolved at migration time against this User mapping table; unresolved owners cause record-level import failures that we surface in the reconciliation report.
Test migration into staging Twenty instance
We run a test migration using a subset of Oracle data (typically 100-500 records per object) into the staging Twenty instance to validate field mapping, object relationships, and dedupe behavior. We surface any field type mismatches (Oracle date formats vs. Twenty's expected format, picklist value gaps, required field violations) and correct the mapping document before production migration. This step also validates that the Twenty Docker or Kubernetes deployment handles the migration workload without the v1.0 database migration failures documented in GitHub issue #12936.
Production migration in dependency order
We run production migration in record-dependency order: Companies (from Oracle Accounts), Persons (from Oracle Contacts and Leads with the Lead Referral tier limitation flagged), Opportunities (with company_id and person_id lookups resolved), Tasks (from Oracle Tasks, Calls, and Appointments), Custom Objects (last, with all parent lookups resolved). Each phase emits a row-count reconciliation report. We honor Oracle's 30 req/min rate limit with batch sequencing and exponential backoff on 429 responses. Export files from Oracle are downloaded immediately upon job completion and stored in our migration workspace. Parallel to data migration, we document every Oracle Workflow Rule, Assignment Rule, and custom field for the customer's admin to rebuild in Twenty's settings.
Cutover, validation, and handoff
We freeze Oracle CRM On Demand writes during cutover, run a final delta migration of any records modified during the migration window, then designate Twenty CRM as the system of record. We validate record counts, spot-check 25-50 records against the Oracle source for field accuracy, and deliver the Workflow and Assignment Rule inventory document. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild Oracle Workflow Rules as Twenty workflow configurations inside the migration scope; that work is a separate configuration engagement. Twenty hosting maintenance (backups, TLS renewal, compute scaling) remains the customer's ongoing responsibility.
Platform deep dives
Oracle CRM On Demand
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 Oracle CRM On Demand and Twenty CRM.
Object compatibility
3 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
Oracle CRM On Demand: 30 requests per minute per user session, counter resets at the end of each 1-minute period (not rolling).
Data volume sensitivity
Oracle CRM On Demand 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 Oracle CRM On Demand to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Oracle CRM On Demand 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 Oracle CRM On Demand
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.