CRM migration
Field-level mapping, validation, and rollback between Practice by Numbers and HighLevel. We move data and schema; workflows are rebuilt natively in HighLevel.
Practice by Numbers
Source
HighLevel
Destination
Compatibility
10 of 10
objects map 1:1 between Practice by Numbers and HighLevel.
Complexity
BStandard
Timeline
48–72 hours
Overview
Practice by Numbers stores dental-practice data across patient contacts, practice entities, appointments, treatment records, and custom KPI dashboards built from practice-specific properties. HighLevel models everything in its own Contact–Company–Opportunity graph, supplemented by custom objects for non-standard fields. The migration carries patient records, practice/facility data, appointment timestamps, and treatment history into HighLevel's corresponding objects, while custom dental properties (production metrics, case-type fields, insurance carrier data) require pre-creation of custom fields or a dedicated custom object in HighLevel before data lands. We surface dental KPI structure and patient cohort tags as reference exports for rebuilding HighLevel dashboards after migration. Workflows, automation sequences, and patient-communication templates in Practice by Numbers have no HighLevel equivalent — those get documented and rebuilt in HighLevel's Workflow Builder. The migration runs via Practice by Numbers API export combined with HighLevel's bulk import endpoints, sequenced so contact-to-company lookups resolve before deal/pipeline records are created. A delta-capture window of 24–48 hours after initial load captures any new or updated records from Practice by Numbers, ensuring HighLevel reflects the final state at cutover. All steps are logged and reversible, with rollback capability if reconciliation identifies unexpected gaps.
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 Practice by Numbers object lands in HighLevel, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Practice by Numbers
Patient / Contact
HighLevel
Contact
1:1Direct 1:1 mapping for all active patient records. HighLevel Contact stores name, email, phone, and address fields natively. Original patient create date and last-modified date are preserved as custom datetime fields since HighLevel's CreatedDate reflects migration time. All fields are validated for format and completeness before insertion.
Practice by Numbers
Practice / Office
HighLevel
Company
1:1Practice-by-Numbers practice or office entity maps to HighLevel Company. Practice name becomes Company name, and address data maps to the standard Company address fields. Multi-location setups produce multiple Company records linked to the same contact roster. Each Company record retains the original office identifier for reporting clarity.
Practice by Numbers
Appointment / Scheduling Record
HighLevel
Custom Object: Appointment
1:1Appointment data has no native HighLevel equivalent. We create an Appointments custom object with fields for appointment date, provider, treatment type, status, and linked Contact. If HighLevel's calendar module is in use, appointments may alternatively be stored as Events linked to the Contact.
Practice by Numbers
Treatment Record / Procedure Log
HighLevel
Custom Object: Treatment History
1:1Treatment and procedure history maps to a Treatment History custom object with a lookup relationship to Contact. Each record carries procedure name, date, provider, fee, and case type. Historical treatment data that exists as notes or text blobs in Practice by Numbers gets parsed and structured into discrete rows.
Practice by Numbers
Custom KPI Property
HighLevel
Custom Field on Contact / Custom Object
1:1Each Practice by Numbers custom property that doesn't match a HighLevel standard field is created as a custom field before migration. Dental-specific fields like production per hour, case acceptance rate, or insurance carrier are pre-created with the correct type — pick-list, number, date, or text — and then populated during the migration run.
Practice by Numbers
Insurance Carrier / Payer Data
HighLevel
Custom Object: Insurance
1:1Insurance carrier, policy type, and coverage details stored as a separate custom object with a lookup to Contact. HighLevel's data model doesn't have a native insurance object, so we create one with the fields needed for dental insurance tracking and link it to the patient Contact.
Practice by Numbers
Patient Owner / Assigned Staff
HighLevel
User / Contact assigned via custom field
1:1The staff member assigned to the patient in Practice by Numbers is resolved by email against HighLevel users. Unmatched staff are flagged before migration — your team can invite them to HighLevel or assign records to a fallback user so no contact lands without an owner.
Practice by Numbers
Patient Communication Log
HighLevel
Activity Log / Custom Object
1:1HighLevel stores communication activity as Tasks and Events on Contact records, but the depth of Practice by Numbers' patient communication history — SMS, reminders, recall messages — may exceed what fits cleanly into the activity model. We map what we can to Tasks and preserve the full log as a JSON blob in a custom long-text field for reference.
Practice by Numbers
Opportunity / Deal Pipeline
HighLevel
Opportunity (Pipeline)
1:1If Practice by Numbers tracks case or treatment pipelines as deal records, those map directly to HighLevel Opportunities. Pipeline stages map to HighLevel stage names, and probability percentages are applied per stage. Each pipeline in Practice by Numbers becomes a separate HighLevel pipeline view.
Practice by Numbers
Patient Form Submission
HighLevel
Custom Object: Form Submission
1:1Patient intake forms and consent documents stored in Practice by Numbers have no native HighLevel equivalent. We export form submission records as a structured dataset and attach them as a JSON payload in a custom long-text field on the Contact record so the data is accessible without rebuilding the original form.
| Practice by Numbers | HighLevel | Compatibility | |
|---|---|---|---|
| Patient / Contact | Contact1:1 | Fully supported | |
| Practice / Office | Company1:1 | Fully supported | |
| Appointment / Scheduling Record | Custom Object: Appointment1:1 | Fully supported | |
| Treatment Record / Procedure Log | Custom Object: Treatment History1:1 | Fully supported | |
| Custom KPI Property | Custom Field on Contact / Custom Object1:1 | Fully supported | |
| Insurance Carrier / Payer Data | Custom Object: Insurance1:1 | Fully supported | |
| Patient Owner / Assigned Staff | User / Contact assigned via custom field1:1 | Fully supported | |
| Patient Communication Log | Activity Log / Custom Object1:1 | Fully supported | |
| Opportunity / Deal Pipeline | Opportunity (Pipeline)1:1 | Fully supported | |
| Patient Form Submission | Custom Object: Form Submission1: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.
Practice by Numbers gotchas
No publicly documented API for automated migration
Dental EHR data is inherently messy during extraction
Goal management metrics require explicit field mapping
HighLevel gotchas
Sub-account architecture creates isolated data silos per client
Usage-based telecom and AI costs are not in the subscription price
Workflows have no native equivalent in most destination CRMs
API rate limits cap bulk migration throughput at 100 requests per 10 seconds per sub-account
White-label configuration and branding assets do not export via API
Pair-specific challenges
Migration approach
Audit Practice by Numbers data inventory and export structure
We connect to Practice by Numbers via scoped read access to enumerate all patient records, appointment records, treatment history entries, custom properties, and practice/facility entities. We identify which fields are standard versus custom, flag any multi-value fields or unstructured data (notes, communication logs), and assess the total record count per object. This inventory drives the HighLevel schema setup checklist and migration mapping document.
Create HighLevel schema: custom fields, custom objects, and pipeline stages
Before any data moves, we deliver a schema setup plan specifying every custom field and custom object that needs to exist in HighLevel — including field name, data type, pick-list values, and object assignment. Your HighLevel admin (or our team) creates the fields so that the migration load can write directly to them. We also map Practice by Numbers case or deal pipelines to HighLevel Opportunity pipeline stages and configure stage probabilities per pipeline.
Export from Practice by Numbers and transform to HighLevel format
We export patient, practice, appointment, and treatment data from Practice by Numbers via the platform's export interfaces. Each record is transformed to match HighLevel's field schema — email addresses resolved to user lookups, date formats standardized, multi-value fields flattened, and communication log data structured into JSON. A pre-flight validation checks for missing required fields and duplicate records before the load begins.
Run sample migration with field-level diff
A representative slice — typically 100–300 records spanning patients, appointments, and treatment history — migrates first into a staging HighLevel sub-account. We generate a field-level diff between the source export and the destination records so you can verify custom property mapping, appointment date preservation, and owner resolution. You approve the sample before the full run commits. This staged approach minimizes risk and gives you confidence in data integrity before committing the full dataset.
Execute full migration with delta-pickup window
The full dataset loads into your production HighLevel account. A delta-pickup window (24–48 hours) captures any new or modified patient records created in Practice by Numbers during the cutover window. All operations are logged to an audit trail, and one-click rollback is available if reconciliation identifies unexpected gaps. After go-live, we validate record counts, field population rates, and Company-to-Contact relationship integrity.
Platform deep dives
Practice by Numbers
Source
Strengths
Weaknesses
HighLevel
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 Practice by Numbers and HighLevel.
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
Practice by Numbers: Not publicly documented.
Data volume sensitivity
Practice by Numbers 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 Practice by Numbers to HighLevel migration scoping. Not seeing yours? Book a call.
Walk through your Practice by Numbers to HighLevel migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Practice by Numbers
Other ways to arrive at HighLevel
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.