37 000 rekordów przeniesionych na 3 platformy w 2 tygodnie — zero danych
Pełna migracja danych CRM dla biura ubezpieczeń Medicare: RadiusBob → GoHighLevel + HealthSherpa
---
Sytuacja
Biuro ubezpieczeń Medicare z ~1,600 klientami prowadziło działalność w trzech odłączonych systemach: RadiusBob (stare CRM), GoHighLevel (nowe CRM) i HealthSherpa Medicare (platforma rejestracyjna). Agenci codziennie ręcznie porównywali wszystkie trzy systemy — brak jednego źródła prawdy, brak możliwości automatyzacji.
Problem
Lata historii klientów znajdowały się w RadiusBob: 1,593 kontakty, 1,222 polisy ubezpieczeniowe, 32,507 notatek interakcji i 793 relacje między kontaktami. To nie był eksport CSV — to była pełna rekonstrukcja przez trzy API z różnymi autoryzacjami, limitami prędkości i formatami danych.
Każdy utracony rekord oznaczał ryzyko zgodności. Ręczna migracja zajęłaby miesiące i wprowadziłaby błędy na każdym etapie.
Rozwiązanie
Zbudowałem wznowialny pipeline migracyjny w Pythonie (Docker + Supabase jako śledzenie stanu synchronizacji). Status każdego rekordu był śledzony indywidualnie — jeśli proces zatrzymał się na rekordzie 500, wznowił się na 501 bez duplikacji.
Usuwanie duplikatów kontaktów: GoHighLevel wymusza unikalne numery telefonów/adresy e-mail, ale RadiusBob pozwalał na współdzielone numery (małżeństwa). Pipeline wychwytywał duplikaty z odpowiedzi błędów API, aktualizował istniejące rekordy i generował raport (163 grupy duplikatów) do przeglądu przez klienta.
Dopasowanie HealthSherpa: Strategia trzech przejść — najpierw według ID beneficjenta Medicare (najwyższa pewność), następnie według imienia + daty urodzenia/adresu e-mail/telefonu, a następnie tworzenie nowych rekordów dla niedopasowanych kontaktów. Każde dopasowanie zapisywało bezpośredni URL rejestracji do jednego kliknięcia z GHL.
Rekordy polis: Schemat obiektu niestandardowego w GHL z 15 polami. Odkryto i obsłużono nieudokumentowane dziwactwa API poprzez systematyczne testowanie.
32,507 notatek: Równoległe przetwarzanie z 8 równoczesnymi żądaniami API skróciło czas importu z ponad 9 godzin do około 1 godziny, pozostając w ramach limitów prędkości.
793 relacje: Zmapowano 10 typów relacji obsługujących zarówno relacje dwukierunkowe (małżonek), jak i jednokierunkowe (rodzic-dziecko). 260 niezmapowanych typów udokumentowano do przeglądu przez klienta.
Stos technologiczny: Python 3.11, Docker, Supabase (PostgreSQL), API GoHighLevel, API HealthSherpa Medicare, asyncio
Wyniki
- ~37,000 łącznych rekordów przeniesionych na 3 platformy
- 100% kontaktów zaimportowanych (1,593/1,593)
- 100% notatek zachowanych (32,507/32,507)
- 99.3% polis zaimportowanych (1,214/1,222)
- 8x szybszy import notatek dzięki równoległemu przetwarzaniu
- Zero utraty danych — każdy importowalny rekord przeniesiony z pełną historią
- 2-tygodniowa dostawa od rozpoczęcia do zakończenia
- Linki do rejestracji Medicare w jednym kliknięciu na każdym rekordzie klienta
Jak to działa
1. Ekstrakcja — Pobierz wszystkie dane z API RadiusBob
2. Transformacja — Normalizuj formaty, oczyść dane, zweryfikuj pola, usuń duplikaty
3. Ładowanie — Prześlij kontakty do GHL, dopasuj do HealthSherpa za pomocą strategii 3-przejść
4. Łączenie — Utwórz rekordy polis, dołącz notatki, zbuduj powiązania relacyjne
5. Weryfikacja — Zgody na liczenie, raport duplikatów, audyt ścieżki walidacji
Każdy krok jest idempotentny i wznowialny. Pipeline może być uruchamiany ponownie bez duplikatów lub utraty postępu.
---
Sytuacja
Biuro ubezpieczeń Medicare z ~1,600 klientami prowadziło działalność w trzech odłączonych systemach: RadiusBob (stare CRM), GoHighLevel (nowe CRM) i HealthSherpa Medicare (platforma rejestracyjna). Agenci codziennie ręcznie porównywali wszystkie trzy systemy — brak jednego źródła prawdy, brak możliwości automatyzacji.
Problem
Lata historii klientów znajdowały się w RadiusBob: 1,593 kontakty, 1,222 polisy ubezpieczeniowe, 32,507 notatek interakcji i 793 relacje między kontaktami. To nie był eksport CSV — to była pełna rekonstrukcja przez trzy API z różnymi autoryzacjami, limitami prędkości i formatami danych.
Każdy utracony rekord oznaczał ryzyko zgodności. Ręczna migracja zajęłaby miesiące i wprowadziłaby błędy na każdym etapie.
Rozwiązanie
Zbudowałem wznowialny pipeline migracyjny w Pythonie (Docker + Supabase jako śledzenie stanu synchronizacji). Status każdego rekordu był śledzony indywidualnie — jeśli proces zatrzymał się na rekordzie 500, wznowił się na 501 bez duplikacji.
Usuwanie duplikatów kontaktów: GoHighLevel wymusza unikalne numery telefonów/adresy e-mail, ale RadiusBob pozwalał na współdzielone numery (małżeństwa). Pipeline wychwytywał duplikaty z odpowiedzi błędów API, aktualizował istniejące rekordy i generował raport (163 grupy duplikatów) do przeglądu przez klienta.
Dopasowanie HealthSherpa: Strategia trzech przejść — najpierw według ID beneficjenta Medicare (najwyższa pewność), następnie według imienia + daty urodzenia/adresu e-mail/telefonu, a następnie tworzenie nowych rekordów dla niedopasowanych kontaktów. Każde dopasowanie zapisywało bezpośredni URL rejestracji do jednego kliknięcia z GHL.
Rekordy polis: Schemat obiektu niestandardowego w GHL z 15 polami. Odkryto i obsłużono nieudokumentowane dziwactwa API poprzez systematyczne testowanie.
32,507 notatek: Równoległe przetwarzanie z 8 równoczesnymi żądaniami API skróciło czas importu z ponad 9 godzin do około 1 godziny, pozostając w ramach limitów prędkości.
793 relacje: Zmapowano 10 typów relacji obsługujących zarówno relacje dwukierunkowe (małżonek), jak i jednokierunkowe (rodzic-dziecko). 260 niezmapowanych typów udokumentowano do przeglądu przez klienta.
Stos technologiczny: Python 3.11, Docker, Supabase (PostgreSQL), API GoHighLevel, API HealthSherpa Medicare, asyncio
Wyniki
- ~37,000 łącznych rekordów przeniesionych na 3 platformy
- 100% kontaktów zaimportowanych (1,593/1,593)
- 100% notatek zachowanych (32,507/32,507)
- 99.3% polis zaimportowanych (1,214/1,222)
- 8x szybszy import notatek dzięki równoległemu przetwarzaniu
- Zero utraty danych — każdy importowalny rekord przeniesiony z pełną historią
- 2-tygodniowa dostawa od rozpoczęcia do zakończenia
- Linki do rejestracji Medicare w jednym kliknięciu na każdym rekordzie klienta
Jak to działa
1. Ekstrakcja — Pobierz wszystkie dane z API RadiusBob
2. Transformacja — Normalizuj formaty, oczyść dane, zweryfikuj pola, usuń duplikaty
3. Ładowanie — Prześlij kontakty do GHL, dopasuj do HealthSherpa za pomocą strategii 3-przejść
4. Łączenie — Utwórz rekordy polis, dołącz notatki, zbuduj powiązania relacyjne
5. Weryfikacja — Zgody na liczenie, raport duplikatów, audyt ścieżki walidacji
Każdy krok jest idempotentny i wznowialny. Pipeline może być uruchamiany ponownie bez duplikatów lub utraty postępu.