CRM migration

Migrate from Dentally to Twenty CRM

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

Dentally logo

Dentally

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between Dentally and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Dentally logo

Dentally

What's pushing teams away

  • Multi-site practices report hitting API rate limit ceilings that are not publicly documented and require raising a support ticket to negotiate higher thresholds.
  • Tier-gated advanced features such as full imaging integration and enhanced NHS workflows push growing practices toward the highest pricing tier sooner than expected.
  • Limited public API documentation makes it difficult to scope custom integrations or assess data portability before committing to the platform.
  • Dentally's own migration team manages inbound data transfers, meaning practices cannot self-service an export or cross-check their data independently.
  • Smaller practices on the starter tier report that the 5-user cap becomes restrictive as the team grows, creating pressure to upgrade before the software justifies the cost.

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

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

maps to

Twenty CRM

Person

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

Person.address

1:1
Fully supported

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

maps to

Twenty CRM

Person (custom fields)

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

Company

1:1
Fully supported

Referring 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

maps to

Twenty CRM

Custom Object: TreatmentPlan

1:1
Fully supported

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

maps to

Twenty CRM

TreatmentPlan (custom fields)

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

Custom Object: ClinicalNote

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

Task

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

Custom Object: Invoice

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

Dentally 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

maps to

Twenty CRM

File (Twenty native)

1:1
Fully supported

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

maps to

Twenty CRM

Workspace Settings

1:1
Fully supported

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

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.

Dentally logo

Dentally gotchas

High

API rate limits are undocumented and require a support request

High

Dentally manages inbound migrations rather than offering self-service export

Medium

Final migration runs the day before go-live, leaving a narrow correction window

Medium

Dentally Vision imaging requires separate product setup

Low

Tier-gated features may be inactive in the migrated environment

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 CRM has no native dental schema — the entire clinical data model must be engineered

    Twenty CRM's standard object model (People, Companies, Opportunities, Tasks, Notes) contains no fields for treatment plans, tooth numbers, NHS band allocations, recall intervals, or clinical notes. Every clinical concept that Dentally stores natively requires a Twenty custom object or custom field created in Settings → Data Model before data lands. FlitStack AI delivers a dental schema design plan as part of discovery: custom objects for TreatmentPlan and ClinicalNote, and custom fields on Person for band_allocation__c, medical_history__c, alert_notes__c, recall_date__c, and NHS_number__c. If the schema is not pre-created in Twenty before migration runs, the clinical fields will land as plain text with no structure.

  • Dentally's API is designed for real-time integrations, not bulk data extraction

    Dentally exposes a REST API that supports real-time patient lookups and appointment retrieval, but the API is rate-limited per application and does not expose a purpose-built bulk export endpoint for full database dumps. Practices with large patient volumes may need to export data via Dentally's backup-and-review workflow (typically handled by a Dentally account manager when moving TO Dentally) or through a multi-step paginated API export. FlitStack AI engineers the export path during the discovery phase, determining whether the Dentally API supports the record volume in a single migration window or requires a staged export approach with delta captures.

  • Recall date and NHS band allocation require explicit pick-list mapping or data loss

    Dentally stores recall_date as a date field and band_allocation as a structured value (Band 1, Band 2, Band 3, Exempt, Not applicable). These are not free-text fields — Dentally enforces the pick-list at the application level. When migrating to Twenty, these must be mapped to a custom pick-list (select field) in Settings → Data Model with matching values. If the custom field is created as a plain text field instead, the band values will import but future filtering and segmentation in Twenty will not respect the pick-list structure. We validate pick-list values during the test migration before the full run.

  • Appointment history export requires explicit request from Dentally or API pagination

    Dentally's primary appointment export mechanism is designed for active and upcoming appointments rather than full historical appointment logs. Practices that need multi-year appointment history to preserve patient engagement records must either request a historical data export through Dentally support or implement paginated API calls spanning the full date range. The Twenty Task object will receive the historical appointments, but only if the source data is accessible. We confirm the appointment export scope during the data audit phase before the migration plan is finalised.

  • Attachments and X-rays do not carry clinical metadata during re-upload

    Dentally stores X-ray images, intra-oral photographs, and document attachments linked to patient records. When these files are exported and re-uploaded to Twenty, the file itself transfers but clinical metadata (tooth number, imaging type, associated treatment plan) does not. Twenty Files attach to records but have no native dental imaging schema. FlitStack AI exports the file list and original metadata separately, and documents which Person or TreatmentPlan record each file was associated with, so the relinking can be completed manually or via a follow-up script after the migration.

Migration approach

Six steps for a successful Dentally to Twenty CRM data migration

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

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

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

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

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

Context on both ends of the pair

Dentally logo

Dentally

Source

Strengths

  • Strong UK market presence with over 12,000 subscribed practices providing peer credibility and local support networks.
  • Consolidates appointment scheduling, clinical records, NHS referrals, and payments in a single cloud-based platform without on-premise hardware.
  • Native integrations with Xero, DenGro, and NHS e-referrals reduce the need for middleware or manual data re-entry.
  • Patient-facing Dentally Portal and integrated Dentally Vision imaging add capability without requiring separate vendor contracts.

Weaknesses

  • API rate limits are not publicly documented and practices with multi-site or high-volume integrations report needing to request increases through support.
  • Public API documentation is limited, making custom development and third-party integration scoping difficult before commitment.
  • Advanced features including full imaging and enhanced NHS workflows are gated behind higher pricing tiers, increasing cost as practices grow.
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 Dentally 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

    Dentally: Not publicly documented; practices requiring higher limits must request them via Dentally support.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

A Dentally-to-Twenty migration for a practice with up to 10,000 patient records typically completes in 48–72 hours of clock time. The planning and schema design phase takes 3–5 days, and the test migration adds another 1–2 days. Practices with over 50,000 records or complex treatment plan histories (custom fields on Treatment Items, multi-year appointment logs) extend to 5–10 days. The dominant time variable is how much clinical data requires custom object creation in Twenty before import can begin.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Dentally.
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