CRM migration
Field-level mapping, validation, and rollback between Oncourse CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Oncourse CRM
Source
Twenty CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Oncourse CRM and Twenty CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Oncourse CRM to Twenty CRM is a schema simplification and ownership transfer. Oncourse CRM stores organization names as a Contact property rather than a distinct Account object, so we extract those values, create Company records in Twenty, and link Contacts to them during import. Oncourse CRM records activity history as notes rather than structured engagement objects, which we migrate as Note records in Twenty. Pipeline stages map to Opportunity stages; deal values and names transfer without transformation. Custom fields on Contacts, Leads, and Deals migrate to Twenty custom fields of equivalent type. We do not migrate Attachments because Oncourse CRM does not expose a file export via its standard tooling. Workflows, automations, drip sequences, and custom reporting configurations do not migrate; we deliver a written inventory of these for your admin to rebuild in Twenty's workflow engine.
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 Oncourse 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.
Oncourse CRM
Lead
Twenty CRM
Person (People)
1:1Oncourse CRM Leads are distinct source-stage records with lead source and status properties. We migrate them 1:1 to Twenty's Person object, preserving the lead source as a custom field on Person and the lead status as a custom picklist field. If the customer uses Twenty's optional CRM extension (opportunity-based selling), we flag whether the Lead should instead land as a Company-less Person pending qualification.
Oncourse CRM
Contact
Twenty CRM
Person (People)
1:1Oncourse CRM Contacts carry name, email, phone, and address fields that map directly to Twenty's Person standard fields. We apply duplicate detection by email during import. The original Oncourse CRM contact ID is preserved in a custom field for audit traceability.
Oncourse CRM
Contact organization property
Twenty CRM
Company
1:manyOncourse CRM stores organization names as a Contact property rather than a distinct Account object. We extract every distinct organization value from the Contact export, deduplicate, create a Company record in Twenty for each unique organization, and link the Contact (now Person) to the corresponding Company via Twenty's Person-Company relation field. This is the primary schema transformation step and must complete before Person import to satisfy the foreign-key relationship.
Oncourse CRM
Deal
Twenty CRM
Opportunity
1:1Oncourse CRM Deals carry a name, monetary value, stage, and optional owner assignment. We map them directly to Twenty's Opportunity object, preserving the deal name as Opportunity name, monetary value as amount, and stage name as the Opportunity stage. Owner assignment migrates by resolving Oncourse CRM owner email to a provisioned Twenty User record. If the deal references a Contact without an extracted Company, we create a placeholder Company or attach the Opportunity to a Person directly depending on Twenty's current relation model.
Oncourse CRM
Pipeline Stages
Twenty CRM
Opportunity Stage
lossyOncourse CRM pipelines are customizable per account with varying stage names. We extract the customer's active stage names from the Oncourse CRM export, create corresponding Opportunity stages in Twenty's Data Model, and map each Deal's stage to its Twenty equivalent. Probability percentages from Oncourse CRM (if available in the export) map to stage probability in Twenty. We flag any Oncourse CRM stages that have no clear Twenty equivalent for customer confirmation before import.
Oncourse CRM
Task
Twenty CRM
Task
1:1Oncourse CRM associates actionable tasks with Deals. We migrate task records as standalone Task objects in Twenty, linking each to the corresponding migrated Opportunity via Twenty's OpportunitiesTasks relation. Task status, priority, due date, and description migrate directly. Task assignment resolves Oncourse CRM owner email to Twenty User ID.
Oncourse CRM
Note (activity history)
Twenty CRM
Note
1:1Oncourse CRM stores activity history as notes rather than structured activity records (calls, emails, meetings as separate objects). We migrate Oncourse CRM notes as Twenty Note records, linking them via ContentDocumentLink to the parent Person, Company, or Opportunity depending on what entity the note was associated with in Oncourse CRM. Note body migrates as plain text. We flag any notes with attachment references for customer awareness that file attachments cannot migrate.
Oncourse CRM
Custom Field (Contacts)
Twenty CRM
Custom Field on Person
1:1Oncourse CRM custom fields on Contacts are exposed via the onCourse DSL export. We map them to equivalent custom properties in Twenty, applying the correct data type (text, number, date, checkbox, picklist). Type mapping follows: Oncourse CRM text becomes Twenty text, number becomes number, date becomes date, checkbox becomes boolean, and picklist becomes select. Custom fields must exist in Twenty before CSV import; we pre-create them via the Twenty Data Model API.
Oncourse CRM
Custom Field (Leads)
Twenty CRM
Custom Field on Person
1:1Oncourse CRM custom fields on Leads migrate to Twenty Person custom fields of the same type. If the customer's Twenty workspace uses a separate CRM extension for Lead tracking, we align field creation to the appropriate object. Any Oncourse CRM lead-specific fields (lead score, qualification status) that have no direct Twenty equivalent are flagged for customer decision during scoping.
Oncourse CRM
Custom Field (Deals)
Twenty CRM
Custom Field on Opportunity
1:1Oncourse CRM custom fields on Deals map to Twenty Opportunity custom fields. We preserve field type during transformation and pre-create fields in Twenty's Data Model before the Opportunity import phase. Deal-level custom properties (closed-lost reason, expected close date, renewal flag) are mapped with customer confirmation on the target field name in Twenty.
Oncourse CRM
Owner (user)
Twenty CRM
User
1:1Oncourse CRM owner assignments on Deals and Contacts are resolved by email match against Twenty User records. We extract every distinct owner email referenced in the Oncourse CRM export and check for a matching User in the destination. Any Oncourse CRM owner without a Twenty User match enters a reconciliation queue for the customer to provision before record import resumes, as Twenty's documentation explicitly requires users to exist before owner lookups can be mapped.
Oncourse CRM
Custom Object
Twenty CRM
Custom Object
1:1If Oncourse CRM exposes any custom object types beyond Leads, Contacts, Deals, and Tasks via its DSL export, we map them to Twenty Custom Objects using the /metadata API. We pre-create the custom object schema in Twenty (DataSource, Object, Field metadata tables) before importing any records. Custom object records with lookup relationships to standard objects (Person, Company, Opportunity) must import after those standard objects exist to satisfy foreign-key constraints.
| Oncourse CRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Lead | Person (People)1:1 | Fully supported | |
| Contact | Person (People)1:1 | Fully supported | |
| Contact organization property | Company1:many | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Pipeline Stages | Opportunity Stagelossy | Mapping required | |
| Task | Task1:1 | Fully supported | |
| Note (activity history) | Note1:1 | Fully supported | |
| Custom Field (Contacts) | Custom Field on Person1:1 | Fully supported | |
| Custom Field (Leads) | Custom Field on Person1:1 | Fully supported | |
| Custom Field (Deals) | Custom Field on Opportunity1:1 | Fully supported | |
| Owner (user) | User1:1 | Fully supported | |
| Custom Object | Custom Object1: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.
Oncourse CRM gotchas
Attachments are not exportable via the standard import/export tooling
Activity history lives in notes, not structured records
Pipeline stages are tenant-defined free text
Voice and SMS allowances cap at 400 each on Standard
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
Source data extraction and scoping
We extract the full Oncourse CRM dataset via the onCourse DSL export, including Leads, Contacts, Deals, Tasks, and custom fields. We audit the export for record volume, completeness, duplicate rates, and data freshness. We identify the distinct organization values stored in the Contact organization property and confirm whether any Oncourse CRM custom objects are present in the export. We review pipeline stage names and any Oncourse CRM-specific field types (phone formatting, date formats) that require normalization during transformation.
Twenty workspace preparation and field pre-creation
We provision the custom fields required for migration in Twenty's Data Model (Settings → Data Model) before any CSV import runs. This includes custom fields on Person for Oncourse CRM Lead and Contact properties, custom fields on Company for extracted organization metadata, custom fields on Opportunity for Deal properties and deal-level custom fields, and any custom picklist options referenced in the Oncourse CRM export. Twenty requires fields to exist before import; we create them via the API to match the migration field map.
Company extraction and Person-Company linking
We extract every distinct organization value from Oncourse CRM Contacts, deduplicate, create Company records in Twenty, and build a lookup table mapping each Oncourse CRM Contact to its corresponding Twenty Company. This step must complete before Person import so that the Person-Company relation field is satisfied at insert time. We run a deduplication pass on both the organization list and the Contact list to prevent duplicate Companies and duplicate Persons from entering Twenty.
Record migration in dependency order
We migrate in record-dependency order: Companies first (from extracted organization names), then People (Contacts and Leads with CompanyId resolved), then Opportunities (Deals with CompanyId and OwnerId resolved), then Tasks (linked to Opportunities), then Notes (linked to Person, Company, or Opportunity). Owner resolution matches Oncourse CRM owner email to a provisioned Twenty User. Any Owner without a matching Twenty User enters a reconciliation queue for the customer to provision before that phase resumes.
Sandbox reconciliation and sign-off
We run a trial migration into a Twenty Sandbox or staging instance using production data volume. The customer reconciles record counts across all object types, spot-checks 25-50 records against the Oncourse CRM source, and validates that Company-Person linking is correct and that Opportunity stage names match the source pipeline. Any mapping corrections happen at this stage. The customer signs off the sandbox run before production migration begins.
Production cutover and automation handoff
We freeze Oncourse CRM writes during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty as the system of record. We deliver the workflow and sequence inventory document to the customer's admin team. We support a one-week hypercare window where we resolve reconciliation issues raised by the team. We do not rebuild Oncourse CRM workflows or sequences as Twenty workflow rules inside the migration scope; that is a separate engagement.
Platform deep dives
Oncourse CRM
Source
Strengths
Weaknesses
Twenty CRM
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 Oncourse CRM and Twenty CRM.
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
Oncourse CRM: Not publicly documented.
Data volume sensitivity
Oncourse CRM 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 Oncourse CRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Oncourse CRM 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 Oncourse CRM
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.