CRM migration
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
Source
Twenty CRM
Destination
Compatibility
13 of 13
objects map 1:1 between Open Dental and Twenty CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
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.
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 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
Twenty CRM
People
1:1Open 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
Twenty CRM
WorkspaceMember
1:1Open 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
Twenty CRM
Task
1:1Open 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
Twenty CRM
Custom Object: Procedures
1:1Open 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
Twenty CRM
Custom Object: InsurancePlans
1:1Open 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
Twenty CRM
Custom Object: Claims
1:1Open 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
Twenty CRM
Custom Object: Payments
1:1Open 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
Twenty CRM
Custom Object: Referrals
1:1Open 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
Twenty CRM
Custom Fields on People
1:1Open 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
Twenty CRM
Custom Object: OpenDentalDocuments
1:1Open 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)
Twenty CRM
Custom Field on People: OpenDentalPatNum__c
1:1PatNum 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
Twenty CRM
Company (Twenty standard object)
1:1Open 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
Twenty CRM
Custom Fields on People
1:1Open 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.
| Open Dental | Twenty CRM | Compatibility | |
|---|---|---|---|
| Patient | People1:1 | Fully supported | |
| Provider | WorkspaceMember1:1 | Fully supported | |
| Appointment | Task1:1 | Fully supported | |
| ProcedureLog | Custom Object: Procedures1:1 | Fully supported | |
| InsPlan | Custom Object: InsurancePlans1:1 | Fully supported | |
| Claim | Custom Object: Claims1:1 | Fully supported | |
| PayPlan / Payment | Custom Object: Payments1:1 | Fully supported | |
| Referral | Custom Object: Referrals1:1 | Fully supported | |
| PatField | Custom Fields on People1:1 | Fully supported | |
| Document | Custom Object: OpenDentalDocuments1:1 | Fully supported | |
| PatNum (patient identifier) | Custom Field on People: OpenDentalPatNum__c1:1 | Fully supported | |
| Clinic | Company (Twenty standard object)1:1 | Fully supported | |
| AllergyDef / Medication | Custom Fields on People1: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.
Open Dental gotchas
X-ray images do not migrate between systems
Scanned documents require a separate image conversion with additional cost
Server must run MySQL with myISAM engine, not InnoDB
API pagination is limited to 100 records per request
Custom sheets use proprietary XML that only imports to Open Dental
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
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.
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.
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.
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.
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
Open Dental
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Open Dental and Twenty CRM.
Object compatibility
1 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
Open Dental: Remote mode: 1,000 elements; Local/Service mode: 10,000 elements; Enterprise tier doubles Remote mode limits.
Data volume sensitivity
Open Dental 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 Open Dental to Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Open Dental
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.