CRM migration

Migrate from Open Dental to Twenty CRM

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

Open Dental logo

Open Dental

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

13 of 13

objects map 1:1 between Open Dental and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Open Dental and Twenty CRM share an open-source philosophy, but their data models are fundamentally different. Open Dental is a dental practice management system storing patients (PatNum, demographics), providers, appointments, clinical procedures, insurance plans, claims, payments, and PatFields — a set of custom fields scoped per patient. Twenty CRM uses a standard CRM object model: People, Companies, Opportunities, Notes, Tasks, and WorkspaceMembers, with support for custom objects and custom fields. There is no native dental-equivalent object in Twenty. FlitStack AI sequences the migration so Companies load first, then People (with companyId linking), then Opportunities and custom objects last. We extract Open Dental data via its REST API (Patients, PatFields, Documents, Procedures, InsPlans, Claims, Payments, Referrals), transform PascalCase source fields into Twenty-compatible formats, and import via CSV following Twenty's documented import order. Custom objects for Procedures, Insurance, Claims, and Referrals must be pre-created in Twenty's Settings → Data Model before import. Original timestamps, PatNum identifiers, and SecDateEdit audit fields are preserved as custom fields. Workflows, appointment reminder rules, recall systems, and automation sequences do not have a direct equivalent in Twenty — these must be rebuilt manually using Twenty's workflow engine. Open Dental has no native CRM pipeline or opportunity concept, so deal tracking must be designed from scratch in Twenty if needed. A 24–48 hour delta-pickup window captures records modified during the cutover before the final cut.

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

Open Dental logo

Open Dental

What's pushing teams away

  • Open Dental runs on a local Windows server that the practice must maintain; offices without dedicated IT staff experience server crashes, slowdowns, and update failures as operational risk.
  • The interface and feature set have a dated UX that newer staff find unintuitive compared to cloud-first alternatives, leading to training overhead and reduced staff satisfaction.
  • Scaling beyond two or three locations requires significant configuration work (Replication, CEMT, Enterprise features) that demands technical expertise most solo or small-group practices lack.
  • Performance degrades with large patient bases and years of transaction history stored in the same database, causing slow queries and screen delays during peak hours.

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

Each row shows how a Open Dental 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.

Open Dental

Patient

maps to

Twenty CRM

People

1:1
Fully supported

Open Dental patients map directly to Twenty People records. PatNum is preserved as a custom field (OpenDentalPatNum__c) for traceability. FirstName, LastName, Email, Phone, Address map directly. Open Dental does not have a native Email field — email addresses sourced from patient forms or imaging modules are migrated as a custom field. Email must be validated before import because source data quality varies.

Open Dental

Provider

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

Open Dental providers (ProvNum, FName, LName) map to Twenty WorkspaceMembers. Provider email is used for the Twenty user account match. Providers without email addresses in Open Dental are flagged before migration — the team must decide whether to create placeholder accounts or assign records to an admin WorkspaceMember. Provider specialty (Endo, Perio, Ortho) migrates as a custom select field on the WorkspaceMember.

Open Dental

Appointment

maps to

Twenty CRM

Task

1:1
Fully supported

Open Dental appointments (AptNum, AptDateTime, AptLength, Confirmed, AptStatus) become Twenty Tasks linked to the People record via the provider's WorkspaceMember. AptStatus values (Scheduled, Confirmed, Broken, Complete, Unscheduled) map via value-mapping to Twenty Task status options. The task title uses the appointment type description. Original appointment time is preserved in a custom datetime field.

Open Dental

ProcedureLog

maps to

Twenty CRM

Custom Object: Procedures

1:1
Fully supported

Open Dental clinical procedures (ProcNum, ProcCode, ProcFee, ToothNum, Surf, ProcStatus) have no CRM equivalent in Twenty's standard object model. A custom Procedures object is pre-created in Twenty with fields for procedure code, description, tooth number, surface, fee, status, and provider. Each procedure record is linked to the People record via a custom PeopleId relation field on the custom object.

Open Dental

InsPlan

maps to

Twenty CRM

Custom Object: InsurancePlans

1:1
Fully supported

Open Dental insurance plans store carrier name, subscriber relationship, benefits percentages, and fee schedules. These nest under the InsPlan object, which relates to the Subscriber (Patient). A custom InsurancePlans object in Twenty holds plan name, carrier, subscriber relationship, and benefit details. The custom object is linked to the Subscriber's People record via a custom relation field.

Open Dental

Claim

maps to

Twenty CRM

Custom Object: Claims

1:1
Fully supported

Open Dental claims (ClaimNum, ClaimStatus, DateSent, DateReceived, BillAmt, InsPayAmt) are clinical-billing records with no standard CRM equivalent. A custom Claims object is created in Twenty with fields for claim number, status, date submitted, date received, billed amount, and insurance-paid amount. Each claim links to the Patient People record and the InsurancePlans custom object.

Open Dental

PayPlan / Payment

maps to

Twenty CRM

Custom Object: Payments

1:1
Fully supported

Open Dental payment records (PayNum, PayAmt, PayDate, PayType) track patient payment history. These migrate as a custom Payments object in Twenty with fields for amount, date, and payment type. The custom object links to the Patient People record. Note that Open Dental's pay-plan amortization schedule is a separate object (PayPlan) that also requires a custom object if full history must be preserved.

Open Dental

Referral

maps to

Twenty CRM

Custom Object: Referrals

1:1
Fully supported

Open Dental referral tracking stores referring dentist or physician information (ReferralNum, ReferTo, ReferFrom, RefDate). A custom Referrals object in Twenty captures referral source name, referral type (Dentist, Physician, Patient, Other), and referral date. The referral is linked to the Patient People record. If the referring entity is a known contact, a separate People record is created for them.

Open Dental

PatField

maps to

Twenty CRM

Custom Fields on People

1:1
Fully supported

Open Dental PatFields (PatFieldNum, PatNum, FieldName, FieldValue, SecDateEntry, SecDateTEdit) are per-patient custom fields supporting types: text, picklist, date, checkbox, currency. PatFieldDef.FieldName defines the field schema. FlitStack pre-creates each unique FieldName as a custom field on the People object in Twenty before import. FieldValue is migrated to the corresponding custom field. FieldType is preserved as metadata for data quality checks.

Open Dental

Document

maps to

Twenty CRM

Custom Object: OpenDentalDocuments

1:1
Fully supported

Open Dental documents (images, PDFs, radiographs) are stored as file references in the database with DocNum, DocCategory, and file path. The Document API (v24.2.32+) returns metadata but not the file content. We migrate document metadata as a custom Documents object in Twenty with fields for document name, category, and a reference note. Actual file migration requires re-upload to Twenty's storage or a linked file host.

Open Dental

PatNum (patient identifier)

maps to

Twenty CRM

Custom Field on People: OpenDentalPatNum__c

1:1
Fully supported

PatNum is Open Dental's primary patient key and has no equivalent in Twenty. We preserve it as a custom text field (OpenDentalPatNum__c) on the People record for traceability and delta-run de-duplication. This identifier also enables mapping downstream related records (appointments, procedures, claims) to the correct People record during migration.

Open Dental

Clinic

maps to

Twenty CRM

Company (Twenty standard object)

1:1
Fully supported

Open Dental multi-location setups use Clinics (ClinicNum, ClinicName, Address, Phone). If a practice uses Open Dental's Clinic feature, each clinic maps to a Twenty Company record representing the practice location. The Patient record links to its primary clinic via the clinic's CompanyId. For single-location practices, the clinic record can be skipped or mapped to a single Company.

Open Dental

AllergyDef / Medication

maps to

Twenty CRM

Custom Fields on People

1:1
Fully supported

Open Dental allergy and medication records are clinical safety data. These migrate as custom multi-select or text fields on the People record (Allergies__c, Medications__c) since Twenty's standard model has no clinical field equivalent. The data is stored for reference but is not actionable in a CRM context without additional integration.

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.

Open Dental logo

Open Dental gotchas

High

X-ray images do not migrate between systems

Medium

Scanned documents require a separate image conversion with additional cost

High

Server must run MySQL with myISAM engine, not InnoDB

Medium

API pagination is limited to 100 records per request

Medium

Custom sheets use proprietary XML that only imports to Open Dental

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

  • Open Dental API pagination and rate limits affect extraction timelines

    Open Dental's REST API returns up to 100 records per page (or up to 10,000 elements in Enterprise local/service mode). Practices with 50,000+ patients need paginated API loops that iterate through offset-based cursors. The API must be enabled and scoped per Open Dental version — some endpoints (PatFields in v22.4, Documents in v24.2.32) require specific API versions. If the Open Dental server is on-premises and the network path is restricted, the migration extraction step requires a Windows machine with network access to the MySQL database or the API endpoint. We assess API capability during scoping before committing to the extraction plan.

  • Appointment reminder rules and recall systems cannot migrate

    Open Dental's appointment reminders, recall intervals, and automated patient reactivation rules are workflow-level constructs with no direct equivalent in Twenty. Recall types (6-month cleaning, annual perio maintenance) and reminder schedules must be rebuilt manually in Twenty's workflow engine after migration. FlitStack exports the recall type definitions and interval settings as a configuration reference document, but the automation logic itself requires manual rebuild. This is the most common post-migration configuration task for dental practices and typically takes 4–8 hours for a Salesforce-admin-familiar team member.

  • Clinical data without CRM equivalents requires custom objects — and they must exist first

    Open Dental stores clinical data (procedure codes, tooth numbers, surfaces, insurance claim statuses) that has no standard CRM equivalent. FlitStack pre-creates custom objects for Procedures, InsurancePlans, Claims, and Referrals in Twenty's Settings → Data Model before any import runs. If a custom object is missing, Twenty's CSV import will silently skip the relation and leave the record orphaned. This is a documented Twenty behavior: the import creates records, not schema. We validate that all custom objects and custom fields are present in Twenty before the import step begins, using Twenty's /metadata API to confirm the data model state.

  • Multi-location clinic structure requires pre-planning for Company record design

    Open Dental's Clinics feature lets practices operate multiple locations from one database, with clinic-specific schedules, providers, and fee schedules. In Twenty, each location should become a Company record, but the migration must decide whether each clinic is a standalone Company or a child under a parent organization. Open Dental parent-child clinic hierarchies map to Twenty's Company.ParentId field if a parent-company relationship exists in the source. If no hierarchy exists, each clinic lands as a flat Company record. This structural decision affects how provider assignments and patient-to-location links resolve after migration.

  • Document and radiograph files require a separate re-upload step

    Open Dental stores documents and radiographs as files on the practice server or a network share, with metadata tracked in the Documents table. The Open Dental Document API (v24.2.32+) can retrieve document metadata but does not return the binary file content via the standard endpoints. We migrate document metadata (DocNum, DocCategory, file path, description) as a custom OpenDentalDocuments object in Twenty. Actual file re-upload must be handled separately — either by re-hosting files in Twenty's storage or by maintaining a reference link in the Twenty custom record pointing to the original file location.

Migration approach

Six steps for a successful Open Dental to Twenty CRM data migration

  1. Assess Open Dental API and schema, pre-create Twenty custom objects

    FlitStack begins by identifying the Open Dental API version in use, confirming which endpoints are available (Patients, PatFields, Procedures, InsPlans, Claims, Documents), and determining whether the server is on-premises or cloud-hosted. We pull the PatFieldDef schema to catalog every custom field in use. In parallel, we pre-create the custom objects in Twenty (Procedures, InsurancePlans, Claims, Payments, Referrals, OpenDentalDocuments) and all custom fields on the People object via Twenty's Settings → Data Model, so the schema is ready before any import runs. This step also includes inviting all workspace members to Twenty so provider-to-WorkspaceMember resolution can proceed.

  2. Profile data, resolve foreign keys, flag nulls and duplicates

    We extract patient records via Open Dental's REST API with pagination, flagging records where email is null, where the guarantor relationship is circular, or where a provider email cannot be resolved to a Twenty WorkspaceMember. We also identify duplicate patients (same name and birthdate) that may need manual merge decisions. Insurance plan records are profiled for carrier name consistency and benefit percentage completeness. This data quality report is delivered before migration commits so the practice can decide how to handle null emails, unmatched providers, and suspected duplicates.

  3. Run a sample migration of 100–500 patient records with field-level diff

    A representative slice — typically 100–500 patients spanning multiple providers and including records with and without custom PatFields — migrates first. We generate a field-level diff comparing the source Open Dental JSON response against the imported Twenty People record, flagging any field where the destination value does not match the source. This diff also validates that custom object relations (Procedures linked to People, Claims linked to InsurancePlans) resolve correctly and that the Company-to-People-to-Task import sequence holds. The practice reviews the diff output before the full run is authorized.

  4. Execute full migration with Company → People → Opportunities → custom objects sequence

    The full migration follows Twenty's import order: Companies first (one per clinic or practice), then People records with companyId linking and OpenDentalPatNum__c preserved, then Opportunities if deal tracking is in scope, then custom objects (Procedures, InsurancePlans, Claims, Payments, Referrals) with their relation fields resolved. Each batch is validated against the source record count before the next batch begins. The Open Dental PatNum is preserved as a custom field on every People record and as the relation key on all child objects.

  5. Delta-pickup window for in-flight changes during cutover, then audit and rollback

    After the full migration snapshot, a delta-pickup window of 24–48 hours captures any Open Dental records created or modified during the cutover. FlitStack re-queries the Open Dental API for records with SecDateTEdit timestamps after the migration snapshot time and imports the delta. An audit log records every insert and update operation with source record identifier and destination record id. If reconciliation fails — record counts mismatch, a field mapping error is discovered, or a custom object relation breaks — one-click rollback reverts the Twenty workspace to its pre-migration state using the pre-migration backup.

Platform deep dives

Context on both ends of the pair

Open Dental logo

Open Dental

Source

Strengths

  • One-time license fee with no per-seat recurring cost after the first year, making it the lowest total cost of ownership for stable practices.
  • Open-source codebase means the database schema is publicly documented and independent developers can build integrations without vendor dependency.
  • Multi-location support through Clinics, Replication, and CEMT scales from a single practice to a DSO with 30+ locations on a single database.
  • API with REST endpoints for Patients, Appointments, Claims, Payments, PayPlans, Documents, and Setup gives third-party tools a reliable integration surface.
  • Strong practitioner community and independent trainer ecosystem produce extensive documentation, forum support, and video walkthroughs for self-service learning.

Weaknesses

  • Server-based deployment requires the practice to own or rent server infrastructure and maintain Windows Server, MySQL, and .NET dependencies locally.
  • No cloud-hosted SaaS option built and supported directly by Open Dental Software; third-party hosting providers add variable cost and support tiers.
  • Interface design reflects its 2003 origins and has not undergone the UX modernization that cloud competitors have invested in heavily.
  • Performance degrades noticeably as the database grows to hundreds of thousands of patients and millions of procedure rows, requiring periodic database maintenance.
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 Open Dental 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

    Open Dental: Remote mode: 1,000 elements; Local/Service mode: 10,000 elements; Enterprise tier doubles Remote mode limits.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Small practices with fewer than 10,000 patient records and fewer than 10 custom PatFields typically complete in 48–72 hours of clock time for the migration run itself, with 1–3 days of setup and planning before the first record is touched. Practices with 50,000+ patients, multiple custom objects (Procedures, Insurance, Claims), and multi-location clinic structures extend to 5–10 days. The longest phase is pre-migration setup: cataloging PatFieldDefs, pre-creating Twenty custom objects, and resolving provider-to-WorkspaceMember email matches.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Open Dental.
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