CRM migration
Field-level mapping, validation, and rollback between Dentally and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Dentally
Source
Twenty CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Dentally and Twenty CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Dentally structures its data model around the dental practice workflow: Patient records hold clinical fields (band_allocation, medical_history, alert_notes), treatment plans record procedure codes and tooth numbers, and appointments carry provider and surgery associations. Twenty CRM models a standard sales CRM: People (contacts), Companies (accounts), Opportunities (deals), and Tasks — with custom objects for anything domain-specific. There is no native dental schema in Twenty, so treatment plans and clinical notes become custom objects, and clinical field values like band_allocation map to custom pick-list fields. FlitStack AI sequences the migration so Person records (from Patients) resolve first, then Company records (from referring dental practices), then custom objects and Tasks in dependency order. A scoped read on Dentally keeps the practice operational during cutover, and a 24–48-hour delta pickup captures in-flight records at the moment of switch. Workflows and recall sequences built in Dentally do not migrate — they must be rebuilt in Twenty's workflow engine or an external automation tool.
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 Dentally 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.
Dentally
Patient
Twenty CRM
Person
1:1Dentally Patient maps to Twenty Person — firstname, lastname, email, phone, and address fields translate directly. Clinical fields unique to dentistry (medical_history, alert_notes, band_allocation) require Twenty custom fields on Person. Patient ID is preserved as source_id for de-duplication on re-migration.
Dentally
Patient.address_fields
Twenty CRM
Person.address
1:1Dentally stores address components as separate fields (address_line_1, address_line_2, city, county, postcode). Twenty Person has a structured address field. We concatenate address_line_1 and address_line_2 into a single street value and map city, county, and postcode to their respective address sub-fields.
Dentally
Patient (clinical fields)
Twenty CRM
Person (custom fields)
1:1Dentally clinical fields — band_allocation, medical_history, alert_notes, medical_alerts, recall_date, preferred_provider, first_visit_date, last_visit_date — have no Twenty native equivalent. We create custom fields on Person for each: band_allocation__c as a select, medical_history__c as a long-text area, alert_notes__c as text, recall_date__c as date, preferred_provider__c as a text relation note.
Dentally
Patient.referring_dentist_name
Twenty CRM
Company
1:1Referring dentist practices stored in Dentally become Twenty Company records. The practice_name field maps to Company.name, and the practice address transforms using the same concatenation logic applied to Patient addresses. Referring dentist contact details — email and phone — become standard Company contact fields. If no explicit referring practice exists, the referral source may be captured as a free-text note on the patient record instead, though this limits ability to consolidate multiple referrals from the same practice.
Dentally
Treatment Plan
Twenty CRM
Custom Object: TreatmentPlan
1:1Dentally TreatmentPlan records do not map to any Twenty standard object. We create a Twenty custom object named TreatmentPlan with fields: procedure_name (text), treatment_date (date), tooth_number (text), quadrant (select), clinical_notes (long-text), estimated_cost (currency), and status (select: Planned, In Progress, Completed). The plan links to the Person record via a relation field.
Dentally
Treatment Plan Item (custom fields)
Twenty CRM
TreatmentPlan (custom fields)
1:1Dentally allows custom fields on Treatment Items via Settings → Treatments & Plans. Each custom field becomes a custom field on the TreatmentPlan custom object, with type mapping: text fields to text, tick boxes to boolean, preset options to select. We document every custom field name and type during the audit phase before schema creation.
Dentally
Clinical Note
Twenty CRM
Custom Object: ClinicalNote
1:1Dentally clinical notes attached to treatment plans have no standard CRM equivalent. We create a Twenty ClinicalNote custom object with: note_date (date), provider (text), tooth_reference (text), note_type (select: Examination, Treatment, Follow-up), and body (long-text). This is linked to both the Person and TreatmentPlan records.
Dentally
Appointment
Twenty CRM
Task
1:1Dentally Appointment records map to Twenty Task objects. appointment_date and appointment_time combine into Task.dueDate. appointment_status maps to Task.status (Planned → Open, Completed → Completed, Cancelled → Cancelled). appointment_type maps to a custom task_type__c field. The Task links to the Person record for the patient. Recall interval data (days_until_recall) is preserved as a custom recall_interval__c field on Person.
Dentally
Invoice
Twenty CRM
Custom Object: Invoice
1:1Dentally Invoice records (date, amount, status, items) do not exist in Twenty standard objects. We create an Invoice custom object with: invoice_date (date), total_amount (number), status (select: Paid, Outstanding, Overdue), and line_items (long-text storing item descriptions and amounts). Invoice links to the Person record for the patient who received the treatment.
Dentally
User / Team Member
Twenty CRM
WorkspaceMember
1:1Dentally team members (dentists, receptionists, hygienists) map to Twenty WorkspaceMembers. We match by email address: if a Dentally owner_email exists on a record and a matching WorkspaceMember exists in Twenty, we assign OwnerId. Unmatched owners are flagged before migration and assigned to a fallback user. WorkspaceMembers must exist in Twenty before import runs.
Dentally
Attachment / X-ray / Image
Twenty CRM
File (Twenty native)
1:1Dentally X-rays, intra-oral photos, and document attachments are stored as blobs in Dentally's file storage. Twenty has no native dental imaging schema and stores files as generic Twenty Files. We export attachments separately via Dentally's file export mechanism and re-upload them as Twenty Files linked to the relevant Person or TreatmentPlan record. No clinical metadata (tooth reference, imaging type) migrates automatically — it must be manually relinked or stored as custom text fields.
Dentally
Practice Settings (currency, region)
Twenty CRM
Workspace Settings
1:1Dentally practice-level settings — currency, timezone, and region — are configuration data rather than records and therefore do not migrate as data objects. FlitStack AI manually configures Twenty Workspace settings to match the Dentally practice configuration before any data import begins. Currency symbol and format, timezone, and locale settings are set via Twenty's Settings → Workspace area. This is a configuration step performed by the FlitStack AI team prior to import; it is not a data migration operation and does not involve record-level data transfer. Workspace configuration must be completed before Person and Company records are imported.
| Dentally | Twenty CRM | Compatibility | |
|---|---|---|---|
| Patient | Person1:1 | Fully supported | |
| Patient.address_fields | Person.address1:1 | Fully supported | |
| Patient (clinical fields) | Person (custom fields)1:1 | Fully supported | |
| Patient.referring_dentist_name | Company1:1 | Fully supported | |
| Treatment Plan | Custom Object: TreatmentPlan1:1 | Fully supported | |
| Treatment Plan Item (custom fields) | TreatmentPlan (custom fields)1:1 | Fully supported | |
| Clinical Note | Custom Object: ClinicalNote1:1 | Fully supported | |
| Appointment | Task1:1 | Fully supported | |
| Invoice | Custom Object: Invoice1:1 | Fully supported | |
| User / Team Member | WorkspaceMember1:1 | Fully supported | |
| Attachment / X-ray / Image | File (Twenty native)1:1 | Fully supported | |
| Practice Settings (currency, region) | Workspace Settings1: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.
Dentally gotchas
API rate limits are undocumented and require a support request
Dentally manages inbound migrations rather than offering self-service export
Final migration runs the day before go-live, leaving a narrow correction window
Dentally Vision imaging requires separate product setup
Tier-gated features may be inactive in the migrated environment
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
Audit Dentally data model and export scope
FlitStack AI reviews the Dentally data export — patient records, treatment plans, clinical notes, appointment history, referring dentist companies, and any custom fields on Treatment Items. We confirm the export mechanism (API pagination, backup file, or Dentally-managed data transfer), document every field name and type, and identify which clinical data will require custom objects in Twenty. The audit produces a field-level inventory that drives the Twenty schema design plan. You receive this plan before any data moves.
Design and create Twenty custom schema
Using the field-level inventory from the audit, FlitStack AI designs the Twenty custom object model: TreatmentPlan and ClinicalNote as custom objects, and custom fields on Person (band_allocation__c, medical_history__c, alert_notes__c, recall_date__c, nhs_number__c, first_visit_date__c, last_visit_date__c) and Task (appointment_type__c, provider__c). We also configure Twenty Workspace settings (currency, timezone) to match the Dentally practice configuration. WorkspaceMembers must be invited and active in Twenty before owner resolution can proceed. The schema must be live in Twenty before the import step.
Resolve owner and user relationships by email
Dentally associates patient records, appointments, and treatment plans with team members by name or user ID. FlitStack AI resolves these to Twenty WorkspaceMembers by matching owner_email to the email address on each Twenty user account. Unmatched owners are flagged in a pre-migration report — your team either invites the missing users to Twenty or assigns a fallback owner before records are imported. No record lands in Twenty without a resolved assignee or a documented fallback assigned.
Run test migration with field-level diff
A representative sample — typically 200–500 records spanning patients, treatment plans, appointments, and referring companies — migrates first. We generate a field-level diff showing every source field value alongside its Twenty destination value, including custom field populated values, pick-list mapping results, and owner resolution outcomes. You verify the treatment_plan → TreatmentPlan custom object mapping, the recall_date and band_allocation custom field population, and the appointment → Task linkage before the full run is committed.
Execute full migration with delta pickup and audit log
The full migration runs against Twenty using the validated field mapping. During the cutover window, your Dentally account remains fully operational — FlitStack AI uses scoped read access only. A 24–48-hour delta pickup window captures any records created or modified in Dentally between the migration snapshot and the go-live moment. Every operation is logged in an audit trail. One-click rollback reverts to the pre-migration state if reconciliation reveals missing records or relationship breakage. Attachment files are exported separately and re-uploaded with documented record associations.
Platform deep dives
Dentally
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 Dentally 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
Dentally: Not publicly documented; practices requiring higher limits must request them via Dentally support.
Data volume sensitivity
Dentally 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 Dentally to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Dentally 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 Dentally
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.