Medicare Agency Migration: 424 Hours to 4 Days with Zero Data Loss
A Medicare insurance agency needed to move their entire client database from RadiusBob CRM to GoHighLevel. 1,593 contacts, 32,508 notes, 1,222 policies, and 793 relationships. Manual re-entry would have taken 400+ hours. We did it in 4 days.
Challenge
What Made This Migration Genuinely Hard
Most business owners think data migration is copying and pasting. Export from old system, import to new one. Done in a weekend. That's the theory. Reality is messier.
The agency's data lived in RadiusBob with no direct migration path to GoHighLevel. Each contact carried 38 custom fields, thousands of timestamped notes, multiple insurance policies, and family relationships that couldn't just disappear.
Four things made this genuinely hard:
Silent API Failures
GoHighLevel's API would return "200 OK" when updating contact fields, then quietly discard the data if you used the wrong field format. Fields would appear empty after a "successful" update. No error. No warning. Just gone.
The 10-Label Limit
GoHighLevel caps contact-to-contact relationship types at 10 labels. The agency needed 14+. The API rejected anything beyond 10 with a cryptic error message that didn't explain the actual constraint.
Duplicate Contact Chaos
When contacts shared email addresses or phone numbers, GoHighLevel merged them automatically using last-record-wins logic. Rich, detailed profiles got overwritten by sparse ones that happened to be processed later.
Medicare Integration Complexity
Each contact also needed to be matched or created in HealthSherpa for enrollment workflows. That required a three-pass matching strategy: Medicare ID lookup first, then name and date-of-birth search, then create a new contact if nothing matched.
Solution
The Pipeline
A Docker-containerized Python pipeline with 7 sequential tasks, built for the edge cases rather than the demo.
Environment Preparation
Validated all API connections, created custom fields in GoHighLevel using proper field IDs (not field keys, which the docs suggested and the API silently ignored), and set up rate limiters for both platforms.
Contact Import
Migrated 1,593 contacts with all 38 custom fields. For contacts sharing emails or phone numbers, we preserved the richest data record rather than letting GoHighLevel's merge logic decide. An idempotent pipeline meant the process could be interrupted and resumed without creating duplicates.
HealthSherpa Matching
The three-pass matching strategy tried Medicare Beneficiary Identifier first, fell back to name and date-of-birth, then created new contacts if nothing matched. Matched or created 1,321 of 1,593 contacts in HealthSherpa Medicare.
Policy and Notes Import
Created 1,222 insurance policies as GoHighLevel Custom Objects with searchable fields. Imported 32,508 notes using async parallelism with 8 concurrent requests, preserving original timestamps. Processed roughly 1,000 notes every 2 minutes.
Relationships and Validation
Created 350 contact-to-contact relationships using 10 carefully prioritized association labels. Used asymmetric label pairs to work around the 10-label API restriction. Final validation cross-referenced record counts, spot-checked field mappings, and generated error reports for manual review.
Results
The Final Numbers
Four days total. The manual estimate was 400+ hours. Zero records lost. Full Supabase backup maintained throughout. The agency could start using GoHighLevel on day five with complete client history and Medicare enrollment capabilities intact.
The agency's team spent those four days serving clients instead of copy-pasting data for two and a half months. The underlying economics are explained in detail in the economics of replacing manual processes with systems. For a deeper look at platform-level risk in the same industry, see a healthcare platform rescue for the same industry.
Related: See more case studies →