CRM migration

Migrate from Oncourse CRM to Twenty CRM

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 logo

Oncourse CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

83%

10 of 12

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

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Oncourse CRM logo

Oncourse CRM

What's pushing teams away

  • Public API documentation is limited — custom integrations are described as 'requires more technical know-how' and there is no self-service developer portal.
  • Activity history is stored as notes rather than structured Activity records, limiting reporting depth and making clean migration off the platform harder.
  • Attachment export is not supported by the standard tooling — files in the document store have to be manually backed up before migration.
  • Small market footprint and limited public review volume make peer benchmarking against established competitors (HubSpot, Pipedrive, Close) harder.
  • Voice/SMS allowances are capped (400 minutes / 400 SMS on Standard) — high-volume outbound teams hit overage or per-line surcharges quickly.

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

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

maps to

Twenty CRM

Person (People)

1:1
Fully supported

Oncourse 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

maps to

Twenty CRM

Person (People)

1:1
Fully supported

Oncourse 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

maps to

Twenty CRM

Company

1:many
Fully supported

Oncourse 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Oncourse 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

maps to

Twenty CRM

Opportunity Stage

lossy
Mapping required

Oncourse 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

maps to

Twenty CRM

Task

1:1
Fully supported

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

maps to

Twenty CRM

Note

1:1
Fully supported

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

maps to

Twenty CRM

Custom Field on Person

1:1
Fully supported

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

maps to

Twenty CRM

Custom Field on Person

1:1
Fully supported

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

maps to

Twenty CRM

Custom Field on Opportunity

1:1
Fully supported

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

maps to

Twenty CRM

User

1:1
Fully supported

Oncourse 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

maps to

Twenty CRM

Custom Object

1:1
Fully supported

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

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.

Oncourse CRM logo

Oncourse CRM gotchas

High

Attachments are not exportable via the standard import/export tooling

Medium

Activity history lives in notes, not structured records

Medium

Pipeline stages are tenant-defined free text

Low

Voice and SMS allowances cap at 400 each on Standard

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

  • Twenty requires manual field creation before CSV import

    Twenty's Person and Company objects ship with minimal standard fields. Users must create basic fields (jobTitle, department, industry on Company; phone type, address components on Person) manually via Settings → Data Model before any CSV import runs. A GitHub issue on the Twenty repository (#13953) documents that this creates onboarding friction for teams migrating from other CRMs because standard field mapping is impossible until the fields exist. We pre-create all fields required for the migration in Twenty before import begins, but any fields the customer plans to use interactively post-migration still require manual setup.

  • Oncourse CRM organization names require Company extraction before Contact import

    Oncourse CRM stores organization names as a Contact property rather than a distinct Account object, which is a flat contact model versus Twenty's Company-Person separation. We must extract every distinct organization value, deduplicate, create Company records, and link the Person to the Company before the Contact (Person) import phase. Migrations that skip this step result in Contacts with no Company association, orphaned relationship data, and account-level reporting that cannot function in Twenty.

  • Oncourse CRM attachment export is not available via standard tooling

    Oncourse CRM does not expose a public file attachment export via its standard import/export tooling. We cannot guarantee attachment migration in automated runs. Any files attached to Deals, Contacts, or Notes in Oncourse CRM require a manual backup by the customer before migration. We flag every record with an attachment reference so the customer can decide whether to download files manually and re-attach post-migration.

  • Oncourse CRM notes vs Twenty structured activities require type classification

    Oncourse CRM records activity history as notes rather than structured engagement records (calls, emails, meetings as separate objects). We migrate these as Note records in Twenty, but the customer should be aware that the activity timeline in Twenty will show a flat note list rather than a segmented call/email/meeting breakdown unless the customer rebuilds activity categorization in Twenty post-migration. We document which Oncourse CRM notes appear to be call logs, emails, or meeting notes based on content patterns so the customer can reclassify them manually if desired.

  • Drip sequences and workflow automations do not migrate to Twenty

    Oncourse CRM drip sequences and workflow automation rules do not have a direct equivalent in Twenty's current workflow engine, and we do not migrate them as code. We deliver a written inventory of every active Oncourse CRM workflow and sequence with its trigger, conditions, and actions, with a recommendation for how to rebuild equivalent logic in Twenty's workflow engine. The customer's admin handles the rebuild post-migration. Twenty's workflow engine is actively developed, so some automation patterns may have partial equivalents depending on the version deployed.

Migration approach

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

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

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

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

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

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

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

Context on both ends of the pair

Oncourse CRM logo

Oncourse CRM

Source

Strengths

  • Unified phone dialer, SMS, email sequencing and CRM in one product
  • Low entry price (Basic $14.99/user/month; Standard $49.95/user/month on annual)
  • Drag-and-drop pipeline with customisable stages tuned for small-team sales motions
  • Outlook, Gmail and Google Calendar integrations supported natively
  • Card-view pipeline and mobile CRM access for on-the-go sales teams

Weaknesses

  • Public API documentation is sparse; custom integrations require Zibtek dev work
  • Activity history stored as notes rather than structured Activity records
  • Standard attachment export is not supported — files must be backed up manually
  • Voice (400 min) and SMS (400) caps on Standard limit high-volume outbound teams
  • Small ecosystem and limited public reviews relative to HubSpot, Pipedrive, Close
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. 2 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 Oncourse CRM and Twenty CRM.

  • Object compatibility

    B

    2 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

    Oncourse CRM: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

Most migrations land between two and four weeks for accounts under 10,000 Contacts and 2,000 Deals with no custom objects and a clean Oncourse CRM export. Migrations with custom objects, large note histories (over 200,000 activity-note records), or complex organization extraction requirements move to six to eight weeks because of the Company-Person separation work, custom field pre-creation, and parent-record lookup resolution.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Oncourse 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