CRM migration

Migrate from Core Practice to Twenty CRM

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

Core Practice logo

Core Practice

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

13 of 13

objects map 1:1 between Core Practice and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Core Practice organizes dental practice data around Practices, Patients, Appointments, Treatment Plans, and Invoices. Each object carries patient-facing clinical and administrative data but no native CRM concept of Leads, Opportunities, or Sales Pipelines. Twenty CRM stores People, Companies, Opportunities, Notes, Tasks, and supports custom objects. The migration translates Core Practice's patient records into Twenty People, Core Practice's practice entities into Twenty Companies, appointment timestamps into Twenty Tasks, and treatment-plan data into Twenty custom objects. Workflows, automations, and billing logic in Core Practice have no native equivalent in Twenty — those must be rebuilt as Twenty Workflows or exported as reference documents for your admin. We read Core Practice's export API or CSV output, normalize the schema, and push into Twenty via its REST or GraphQL API using the correct import order: Companies first, then People (with companyId lookups), then Opportunities, then custom objects with their relations last. During import, FlitStack AI runs validation checks to confirm field mappings and record counts match the source. After the initial load, a delta‑pickup window captures any new or updated Core Practice records, ensuring the Twenty instance stays current until the cutover moment.

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

Core Practice logo

Core Practice

What's pushing teams away

  • Excessive clicks and overcomplicated workflows frustrate staff and slow down appointment booking.
  • Patients are reported lost due to poor data integrity and unreliable patient record management.
  • The platform scores poorly on ease of use, value for money, and customer service compared to competitors.
  • Low review volume (6 verified reviews) suggests limited adoption and a lack of community resources.
  • Users report the software is useless at making appointments, directly undermining core dental practice operations.

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

Each row shows how a Core Practice 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.

Core Practice

Patient

maps to

Twenty CRM

People

1:1
Fully supported

Core Practice Patient records migrate as Twenty People. The email address (if present) becomes the unique identifier for People import. Patients without emails are imported with a generated placeholder and flagged for review. Name, phone, address, and DOB map directly; Core Practice patient_id stored as source_patient_id__c for traceability.

Core Practice

Patient.first_address + patient_city + patient_state + patient_postal_code

maps to

Twenty CRM

People

1:1
Fully supported

Core Practice stores address components as separate fields. These combine into a structured address block in Twenty People. We validate state abbreviations and postal code formats before import to prevent malformed address records in Twenty. For international addresses, we also normalize country names and apply the appropriate Two‑letter ISO code, ensuring consistency across all address records in Twenty.

Core Practice

Practice

maps to

Twenty CRM

Company

1:1
Fully supported

Core Practice Practice entity (clinic name, address, phone) migrates as a Twenty Company record. For multi-location dental groups, each Core Practice location becomes a separate Company record. If the group name is needed as a parent, we use Twenty's parent_company_id field to build the hierarchy.

Core Practice

Appointment

maps to

Twenty CRM

Task

1:1
Fully supported

Core Practice Appointments with status Scheduled, Completed, Cancelled, or No-Show become Twenty Tasks. The appointment datetime maps to dueDate and dueStatus on the Task. The associated patient and doctor link via their Twenty record IDs. We also capture appointment_type and procedure codes as custom fields on the Task for audit continuity.

Core Practice

Doctor / Provider

maps to

Twenty CRM

People

1:1
Fully supported

Core Practice Doctor records (name, specialization, email) migrate as People records in Twenty with a custom Doctor_Specialization__c field. Doctor email resolves against Twenty Workspace Members — if a match is found, the doctor gets a Twenty user account and ownership of their associated appointment Tasks.

Core Practice

TreatmentPlan

maps to

Twenty CRM

Custom Object

1:1
Fully supported

Core Practice Treatment Plans (procedures, estimated cost, status: Proposed, In-Progress, Completed) have no direct equivalent in Twenty's standard objects. We create a TreatmentPlan custom object in Twenty with fields for procedure_name, treatment_status, estimated_cost, and associated Patient via a relation field. This is the most common schema extension for dental-to-Twenty migrations.

Core Practice

Invoice

maps to

Twenty CRM

Custom Object or Note

1:1
Fully supported

Core Practice Invoices carry line items, totals, and payment status (Paid, Outstanding, Overdue) with no native equivalent in Twenty. We migrate Invoice records as a custom Invoice object in Twenty for reference — actual payment processing must remain in Core Practice or move to a dedicated billing tool post-migration.

Core Practice

Insurance Claim

maps to

Twenty CRM

Custom Object

1:1
Fully supported

Core Practice Insurance Claim records (claim_id, status, amount, patient) migrate as a custom InsuranceClaim object in Twenty. This captures the financial context of each patient relationship without requiring a billing module in Twenty. The custom InsuranceClaim object stores claim_date, provider_name, service_code, and payer as custom fields, and maps Core Practice claim status to a pick‑list (Submitted, Pending, Approved, Denied, Paid).

Core Practice

Note / Clinical Note

maps to

Twenty CRM

Note

1:1
Fully supported

Core Practice clinical notes and free-text observations migrate as Twenty Notes attached to the corresponding Patient record. Original note timestamps and doctor attribution are preserved as custom fields on the Note object in Twenty. We preserve the full note body as plain text, set the note's visibility to the assigned doctor and relevant staff, and include a reference to the original Core Practice note ID for audit traceability.

Core Practice

Document / Attachment (X-rays, forms)

maps to

Twenty CRM

Twenty Files / Attachment

1:1
Fully supported

File attachments stored in Core Practice (X-ray images, signed forms, treatment PDFs) are downloaded and re-uploaded to Twenty's file storage. File associations to Patient records are preserved. Maximum file size limits from Twenty's storage backend apply — large imaging files may require compression or separate cloud storage with a link stored in Twenty.

Core Practice

Patient relationship to Practice

maps to

Twenty CRM

People.companyId relation

1:1
Fully supported

Core Practice patients belong to a Practice entity. After the Practice migrates to a Twenty Company, we link each Patient to that Company via the companyId field on the People record. Multi-location patients (seen across practices) require the patient's primary practice to be designated for the companyId lookup.

Core Practice

Workflow / Recall Automation

maps to

Twenty CRM

No equivalent

1:1
Fully supported

Core Practice workflows (appointment reminders, patient recall sequences, insurance expiration alerts) do not migrate. These automations must be rebuilt in Twenty's Workflow builder. We export workflow definitions as JSON reference files so your admin can recreate the logic step-by-step in Twenty.

Core Practice

Billing / Payment Records

maps to

Twenty CRM

No native equivalent

1:1
Fully supported

Core Practice invoice and payment tracking is a billing construct with no Twenty CRM equivalent. We preserve invoice number, status, and outstanding balance as custom fields on a reference Invoice custom object in Twenty, but actual payment processing, line-item billing, and insurance claim adjudication must continue in a dedicated billing tool.

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.

Core Practice logo

Core Practice gotchas

High

No publicly documented public API for direct data extraction

High

Proprietary patient archiving logic can silently drop records

Medium

Appointment booking reliability is a documented weakness

Medium

Limited review volume limits migration confidence

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

  • Workflows and recall automations have no native migration path

    Core Practice appointment-reminder rules, patient-recall sequences, and insurance-expiration alerts are defined in Core Practice's proprietary automation model. Twenty CRM has its own Workflow builder with a different trigger-action architecture. There is no automated conversion — every automation must be audited in Core Practice and rebuilt manually in Twenty. We export the full automation definition set (workflow name, trigger conditions, action sequence, timing rules) as a JSON reference document so your Twenty admin has a step-by-step rebuild guide. Budget 1–3 days of admin time for this step.

  • TreatmentPlan and Invoice objects require custom object creation before import

    Core Practice natively stores Treatment Plans and Invoices as structured objects, but Twenty CRM's standard schema has no equivalent — these must be created as custom objects before any data lands. Twenty's Settings → Data Model UI allows admins to create custom objects and fields, but the CSV import documentation explicitly warns that Fields must exist before import. We deliver a custom-object setup plan (object name, field names, field types, relation to People) as part of the pre-migration deliverable so your Twenty workspace is schema-ready before we begin the import sequence.

  • Appointment-to-Task status mapping can lose clinical context

    Core Practice appointment statuses include Scheduled, Completed, Cancelled, and No-Show. Twenty Task status options are fewer and designed for sales follow-up context, not clinical visit tracking. A Cancelled dental appointment and a Cancelled sales follow-up share the same status label but carry different business meaning. We create a custom appointment_status__c pick-list on the Twenty Task that preserves Core Practice's full status vocabulary alongside Twenty's native status so reporting remains accurate for both operational and clinical audit purposes.

  • Core Practice has no Lead concept — all patients route to People

    Unlike CRMs that distinguish Leads from Customers, Core Practice treats every Patient record as a unified record regardless of where they are in the care lifecycle. Twenty CRM splits its object model into People (existing relationships) and Opportunities (pipeline deals). There is no native Lead concept in Twenty v1/v2. All Core Practice patients land as Twenty People — the distinction between a prospective new patient and an active patient is preserved as a custom patient_status__c field rather than a native Lead/Contact split.

  • Core Practice's export API may chunk large record sets, requiring paginated retrieval

    Core Practice's data export mechanism does not publish a guaranteed per-export record ceiling. For large dental practices with 100,000+ patient records and multi-year appointment histories, the export may need to be paginated across multiple API calls or CSV files. Twenty's CSV import allows up to 20,000 records per operation. We handle the pagination logic on the source side and batch the load into Twenty in chunked import runs with validation between each batch. Large migrations may require 2–3 import runs to move all records.

Migration approach

Six steps for a successful Core Practice to Twenty CRM data migration

  1. Audit Core Practice schema and export structure

    FlitStack AI reads Core Practice's export API output or generated CSV files to enumerate every object, field, and relationship currently in use. We identify which custom fields are actively populated (not just defined), flag duplicate-prone fields, and document which workflows and automations are active. This audit produces the field-mapping spreadsheet and the automation reference document that drives every subsequent step.

  2. Build Twenty custom objects and fields before data lands

    Before any data moves, we create the TreatmentPlan and Invoice custom objects in Twenty, add all custom fields identified in the audit, and configure pick-list values for appointment_status, treatment_status, and invoice_status. Twenty's Settings → Data Model requires fields to exist before the CSV import creates records — this step is sequenced first so the schema is ready when the import runs.

  3. Export and sequence Core Practice records for import order compliance

    Twenty requires a strict import sequence: Companies first (to establish parent records), then People (with companyId lookups resolved), then Opportunities, then custom objects with relations last. We extract Core Practice data in the correct order, validate record counts at each stage, and flag any orphaned patient records (patients without a practice_id) for manual resolution before the People import runs. We also check for duplicate records, enforce data type constraints, and log each batch to a migration audit table. Any discrepancies trigger a pause and require admin sign‑off before proceeding to the next stage.

  4. Resolve doctor records by email against Twenty Workspace Members

    Core Practice Doctor records are matched to Twenty users by email address. If a doctor email matches a Twenty Workspace Member, their Twenty user account receives ownership of associated appointment Tasks. Unmatched doctor emails are flagged and assigned to a fallback owner. This step ensures accountability for appointment history is preserved in Twenty's permission model. All matches and fallbacks are recorded in the migration audit log for future reference and compliance review.

  5. Run a test migration with field-level diff on a representative slice

    A sample of 100–500 records — covering a mix of patients, appointments, treatment plans, and invoices — migrates first. We generate a field-level diff between the source Core Practice export and the resulting Twenty records so you can verify that appointment timestamps, treatment-plan statuses, and patient addresses arrived correctly. Custom field creation and value mapping are validated at this stage before the full run commits.

  6. Execute full migration with delta-pickup window and rollback capability

    The full migration runs against Twenty's API or CSV import endpoints. A delta-pickup window (typically 24–48 hours after cutover) captures any Core Practice records modified during the migration run — new appointments, updated patient records, or newly created treatment plans. FlitStack AI maintains an audit log of every record created and modified. One-click rollback is available if reconciliation against the Core Practice source reveals unexpected gaps.

Platform deep dives

Context on both ends of the pair

Core Practice logo

Core Practice

Source

Strengths

  • Cloud-based with no server maintenance or upfront capital costs.
  • No lock-in contracts allow month-to-month commitment.
  • Australian-hosted infrastructure for local data residency compliance.
  • All-in-one bundling of commercial, clinical, and clerical functions.
  • Real-time access from any device for multi-location practices.

Weaknesses

  • Extremely low review rating (2.7/5) indicating widespread user dissatisfaction.
  • Only 6 verified reviews exist, making independent evaluation difficult.
  • Poor ease-of-use scores (3.0/5) reflect overcomplicated workflows.
  • Weak customer service ratings (2.6/5) from the small reviewer base.
  • Minimal third-party integrations and limited API documentation published.
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 Core Practice 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

    Core Practice: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

Walk through your Core Practice to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most Core Practice to Twenty migrations complete in 48–72 hours of clock time for under 50,000 total records. Larger dental practices with 500k+ records or complex multi-location setups requiring treatment-plan and invoice custom-object creation extend to 5–7 days. The pre-migration schema setup phase — creating Twenty custom objects and fields before data lands — typically takes 1–2 days and must complete before the first import run begins.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Core Practice.
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