CRM migration

Migrate from Open Dental to Freshsales

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

Open Dental logo

Open Dental

Source

Freshsales

Destination

Freshsales logo

Compatibility

90%

9 of 10

objects map 1:1 between Open Dental and Freshsales.

Complexity

BStandard

Timeline

3–5 days

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Open Dental and Freshsales serve fundamentally different functions: Open Dental is a patient-practice-management system centered on the PatNum patient record, with appointments, procedure logs, insurance plans, providers, and family guarantor relationships. Freshsales is a sales CRM built around Leads, Contacts, Accounts, and Deals, with no native equivalent for clinical data or insurance hierarchies. FlitStack AI maps Open Dental patient records into Freshsales Contacts (for active patients) or Leads (for prospects), pulling name, address, phone, email, and original create dates. Provider records resolve to Freshsales users by email match. Appointment dates and procedure codes migrate as custom fields or Events on the contact record. Insurance plan details, claims status, and referral sources store as custom fields since no native Freshsales object exists. We use Open Dental's REST API (one request per five-second minimum with read-only access), paginated at 100 records per call, writing into Freshsales via its CRM API respecting plan-tier rate limits. Automations, recall reminders, treatment plans, and imaging are not migratable and must be rebuilt or abandoned.

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

Freshsales logo

Freshsales

What's pulling them in

  • Lowest barrier to entry among major CRMs — the free tier supports up to 3 users and includes core CRM functionality before committing to per-seat pricing.
  • Built-in chat, email, and phone reduce reliance on third-party integrations for basic sales communication and contact management.
  • Freddy AI contact scoring and deal insights are included on Pro plans at a lower price than comparable HubSpot tiers.
  • Kanban pipeline views across Contacts, Accounts, and Deals provide visual deal management without requiring custom configuration.
  • Integration with the broader Freshworks ecosystem (Freshdesk, Freshchat, Freshservice) reduces tool sprawl for teams already using Freshworks.

Object mapping

How Open Dental objects map to Freshsales

Each row shows how a Open Dental object lands in Freshsales, 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

Freshsales

Contact

1:1
Fully supported

Open Dental patients with Active status map to Freshsales Contacts. Name, address, phone, email, birthdate, and original create date transfer directly via field-level mapping. Inactive or deceased patients flag for manual review before migration commits. The original PatNum is preserved as a custom field (Source_PatNum__c) on each Contact for traceability and future delta-run de-duplication. All patient demographics align with Freshsales standard Contact fields without transformation.

Open Dental

Patient (Prospect / New Patient)

maps to

Freshsales

Lead

1:many
Fully supported

Open Dental patients in 'New Patient' or 'Prospect' status — those with no treatment records — route to Freshsales Leads. Active patients with completed procedures land as Contacts. The split is based on presence of ProcedureLog records linked to the PatNum.

Open Dental

Appointment

maps to

Freshsales

Event

1:1
Fully supported

Open Dental appointments map to Freshsales Events with the contact linked by email match. Event Subject holds appointment type (e.g., Hygiene, Recall, Consultation), StartDateTime and EndDateTime preserve the original time slot, and appointment notes transfer to the Event Description field. The original AptNum is stored as Source_AptNum__c on the Event for audit traceability. All appointments for the same contact appear on the contact timeline in Freshsales.

Open Dental

Provider

maps to

Freshsales

User

1:1
Fully supported

Open Dental provider records (dentists, hygienists, assistants) map to Freshsales Users by email address match. FlitStack validates email existence in Freshworks before assigning OwnerId to Contact and Event records. Unmatched providers flag for admin action before migration runs — a pre-migration report lists all unresolved providers with their Open Dental FName, LName, and email for manual user creation or email correction in Open Dental.

Open Dental

ProcedureLog

maps to

Freshsales

Custom Field (Contact)

1:1
Fully supported

Open Dental procedure history — treatment codes, descriptions, dates, fees — stores as a series of custom fields on the Freshsales Contact record. Each procedure is a separate field group: ProcCode__c, ProcDescription__c, ProcDate__c, ProcAmount__c. Clinical notes map to a long-text custom field.

Open Dental

InsurancePlan / PatPlan

maps to

Freshsales

Custom Field (Contact)

1:1
Fully supported

Open Dental's insurance plan hierarchy (primary, secondary, tertiary) has no Freshsales equivalent. Plan name, group number, subscriber ID, subscriber name, effective date, and BlueBook percentage each become a custom field on the Contact. Tertiary plan data stores in a secondary field set.

Open Dental

Family Guarantor Relation

maps to

Freshsales

Account Contact Relationship

1:1
Fully supported

Open Dental family groups with a guarantor head-of-household collapse to individual Contact records in Freshsales. The guarantor PatNum becomes a custom field referencing the head-of-household ContactId. Sibling and child relations surface as a JSON-serialized list in a custom notes field.

Open Dental

Referral

maps to

Freshsales

Lead Source (Contact)

1:1
Fully supported

Open Dental referral sources (Direct, SEO, Partner, Insurance, etc.) map to Freshsales Lead Source pick-list values. Referral source data transfers as the lead_source field on the Contact or Lead record. Custom referral codes added in Open Dental become custom pick-list values in Freshsales before migration runs, ensuring all referral attribution maps correctly without losing source tracking data.

Open Dental

Claim

maps to

Freshsales

Custom Field (Contact)

1:1
Fully supported

Open Dental insurance claim records — claim status, claim number, and date filed — store as custom fields on the Contact record. Claim statuses (Sent, Received, Approved, Rejected, Appealed) become a custom pick-list. Full claim ledger history is not migratable and is documented for manual reference.

Open Dental

TreatmentPlan

maps to

Freshsales

Custom Field (Contact)

1:1
Fully supported

Open Dental treatment plans — proposed procedures, case values, and case status — have no Freshsales equivalent. Case value migrates as a custom currency field; treatment plan notes store as a long-text custom field. Acceptance workflow must be rebuilt in Freshsales Deals.

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

Freshsales logo

Freshsales gotchas

Medium

Freddy AI is Pro-tier only despite heavy marketing

High

Post-migration emails and sequences are disabled

Medium

Bot session credits are a one-time 500-session allocation

Medium

Phone credits charged per minute with no cap

Low

File storage limits scale with plan tier

Pair-specific challenges

  • Patient-to-Lead/Contact split requires lifecycle-stage value mapping

    Open Dental stores patient status as a single PatStatus field ('I' for inactive, 'A' for active, 'P' for patient). Freshsales splits records into Leads and Contacts with separate lifecycle stages. FlitStack routes Open Dental 'Patient' status records to Freshsales Contacts and 'New Patient' or 'Prospect' status records to Freshsales Leads. Records with no treatment history but an active status require a pre-migration rule to determine the correct split. If Open Dental PatStatus is null or custom, all records default to Leads and Contacts are created after manual classification. This split affects every downstream object mapping — appointments and procedures attach to the wrong record type if the split rule is wrong.

  • Open Dental API rate limits require staggered read cycles

    Open Dental's API enforces a strict one-request-per-five-second minimum for read-only access and one-request-per-second with full API permissions. Large practices with 10,000+ patient records need approximately 100 API calls at the five-second rate — roughly eight minutes just to read the patient table before appointments, procedures, and insurance data are queried. Freshsales throttles incoming writes at 1,000–5,000 requests per hour depending on plan tier. FlitStack paces writes at 80% of the destination tier limit and implements exponential backoff on HTTP 429 responses. A migration plan that ignores Open Dental's five-second floor will produce incomplete dataset reads or authentication errors that halt the migration mid-run.

  • Insurance plan hierarchy has no native Freshsales equivalent

    Open Dental supports primary, secondary, and tertiary insurance plans per patient with subscriber assignment rules, BlueBook fee schedule percentages, and claim aging. Freshsales has no insurance model. FlitStack stores primary insurance carrier, plan name, group number, subscriber ID, effective date, relationship, and BlueBook percentage as custom fields on the Contact. Secondary and tertiary plans require additional custom field sets. The claim aging logic — how long a claim has been pending — cannot be represented in Freshsales without a custom date-tracking workflow. Insurance plan dropdowns in Open Dental map to flat text fields in Freshsales, removing the ability to filter contacts by insurance carrier in the same way.

  • Family guarantor grouping collapses to a single guarantor reference

    Open Dental's Family module links multiple patients (spouse, children, dependents) to a single guarantor head-of-household via the Guarantor field. Freshsales has no family or guarantor object — a Contact has one Account and no native family-grouping mechanism. FlitStack maps the guarantor PatNum to a custom text field on each family member's Contact record. The full family tree (which patients share the same guarantor) is reconstructed post-migration by querying Guarantor_PatNum__c. Multi-generational family records where a guarantor is also a patient collapse to a single Contact with the family_gurantor field pointing to itself — this edge case requires manual cleanup.

  • Claim data and clinical treatment history require custom field setup

    Open Dental claim records track claim number, status, date sent, date received, and insurance payment amounts. Freshsales has no native claims object. FlitStack migrates claim status and claim number as custom fields on the Contact record, with date-sent and date-received stored as custom date fields. However, the full claim ledger — adjustment amounts, write-offs, and payment plans — cannot map cleanly to Freshsales without extensive custom field proliferation. Treatment plans (proposed procedures, estimated costs, case values) are stored as custom text fields at best. The clinical depth that Open Dental captures has no meaningful CRM counterpart in Freshsales — the data migrates for reference but cannot drive Freshsales workflows.

Migration approach

Six steps for a successful Open Dental to Freshsales data migration

  1. Extract Open Dental patient, provider, and appointment data via REST API

    FlitStack authenticates to Open Dental using the Developer Key and Customer Key via Basic Auth over HTTPS. We read Patient, Provider, Appointment, ProcedureLog, InsPlan, PatPlan, Referral, and Claim objects using Open Dental's REST endpoints with pagination at 100 records per call. Read cycles use the read-only rate limit of one request every five seconds. We capture PatNum, Guarantor, PatStatus, SecDateEntry, and all address fields in the initial read pass. Provider email addresses are extracted for Freshsales user matching.

  2. Split patients into Freshsales Leads and Contacts; resolve provider-to-user mapping

    Open Dental patient records split by PatStatus: 'Patient' or 'Active' status with at least one ProcedureLog routes to Freshsales Contacts; 'New Patient' or 'Prospect' status routes to Freshsales Leads. FlitStack validates each provider email against Freshworks user accounts by email match and assigns OwnerId accordingly. Unresolved providers are flagged in a pre-migration report and assigned to a fallback Freshsales user. The split rule and provider map are reviewed with the practice admin before the migration run.

  3. Run sample migration on a 200-record slice with field-level diff

    A representative slice of 200 patient records — including active patients, new patients, records with insurance plans, and records with appointments — migrates first. FlitStack generates a field-level diff comparing source values against Freshsales record values for every mapped field. The diff report is reviewed with the practice admin to verify lifecycle stage routing, insurance field completeness, and family guarantor mapping before the full migration commits. Any field mappings that need adjustment are corrected before the bulk run.

  4. Execute full migration with Freshsales API rate-limit pacing

    Bulk migration writes patient records, appointments, and procedure summaries into Freshsales using the CRM API. Write pacing targets 80% of the destination plan's hourly limit to avoid HTTP 429 errors. Insurance plan data writes as custom fields on each Contact after the base contact record is created. Referral source values are validated against the Freshsales lead_source pick-list; unmapped custom referral codes trigger pick-list creation before writes proceed. FlitStack maintains an audit log of every record created, updated, or skipped with the reason for any skips.

  5. Delta-pickup window captures in-flight records during cutover

    A 24–48 hour delta-pickup window runs after the full migration completes. During this window FlitStack re-queries Open Dental for records with SecDateEntry or SecDateTEdit timestamps newer than the migration start time. New records and updated records created or modified in Open Dental during the cutover window are written to Freshsales in a second pass. After delta-pickup closes, a final reconciliation report compares record counts between Open Dental and Freshsales by object type. One-click rollback reverts all Freshsales writes if the reconciliation count mismatch exceeds the agreed tolerance threshold.

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.
Freshsales logo

Freshsales

Destination

Strengths

  • Generous free tier for small teams with core CRM functionality without per-seat costs.
  • All-in-one sales CRM with built-in telephony, chat, and email reducing third-party tool dependency.
  • Freddy AI contact scoring and deal predictions available on Pro tier.
  • Multiple pipeline views with Kanban and list options across all plans.

Weaknesses

  • Reports lack depth compared to competitors like HubSpot, with limited customization options.
  • Integration setup is poorly documented with no clear guides for connecting third-party tools.
  • AI features gated behind $39/user/month Pro tier despite marketing emphasis on Freddy AI.
  • Bot sessions limited to 500 one-time allocation with no monthly refresh.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 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 Freshsales.

  • Object compatibility

    B

    2 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 Freshsales 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 Freshsales data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Small and mid-size practices with fewer than 25,000 patient records typically complete in 3–5 days of clock time. The Open Dental API enforces a one-request-per-five-second read floor which extends the data extraction phase for large databases — a 10,000-record practice needs roughly 100 API calls over eight minutes per object. Large multi-location practices with complex insurance hierarchies, provider rosters, and claims data extend to 1–3 weeks when custom field setup, provider matching, and family guarantor resolution are included. The sample migration step adds 1–2 days before the full run commits.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Open Dental.
Land in Freshsales, 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