CRM migration
Field-level mapping, validation, and rollback between Open Dental and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Open Dental
Source
Freshsales
Destination
Compatibility
9 of 10
objects map 1:1 between Open Dental and Freshsales.
Complexity
BStandard
Timeline
3–5 days
Overview
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.
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 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
Freshsales
Contact
1:1Open 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)
Freshsales
Lead
1:manyOpen 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
Freshsales
Event
1:1Open 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
Freshsales
User
1:1Open 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
Freshsales
Custom Field (Contact)
1:1Open 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
Freshsales
Custom Field (Contact)
1:1Open 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
Freshsales
Account Contact Relationship
1:1Open 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
Freshsales
Lead Source (Contact)
1:1Open 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
Freshsales
Custom Field (Contact)
1:1Open 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
Freshsales
Custom Field (Contact)
1:1Open 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.
| Open Dental | Freshsales | Compatibility | |
|---|---|---|---|
| Patient | Contact1:1 | Fully supported | |
| Patient (Prospect / New Patient) | Lead1:many | Fully supported | |
| Appointment | Event1:1 | Fully supported | |
| Provider | User1:1 | Fully supported | |
| ProcedureLog | Custom Field (Contact)1:1 | Fully supported | |
| InsurancePlan / PatPlan | Custom Field (Contact)1:1 | Fully supported | |
| Family Guarantor Relation | Account Contact Relationship1:1 | Fully supported | |
| Referral | Lead Source (Contact)1:1 | Fully supported | |
| Claim | Custom Field (Contact)1:1 | Fully supported | |
| TreatmentPlan | Custom Field (Contact)1: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
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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
Open Dental
Source
Strengths
Weaknesses
Freshsales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Freshsales.
Object compatibility
2 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 Freshsales migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Open Dental
Other ways to arrive at Freshsales
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.