Motyw
23. Zarządzanie duplikatami kontaktów
Poziom trudności: Łatwy
Czas: 15 minut
Wprowadzenie
Duplikaty kontaktów to częsty problem w CRM - powstają przez wielokrotne formularze, importy CSV, integracje. Dowiedz się jak je znajdować, łączyć i zapobiegać.
Dlaczego duplikaty to problem?
- Chaos w danych: Nieaktualne informacje
- Złe doświadczenie: Klient dostaje 2x to samo
- Marnowanie budżetu: Płacisz za SMS/email 2x
- Błędna analityka: Zniekształcone statystyki
Krok 1: Znajdowanie duplikatów
Metoda 1: Wbudowane narzędzie
- Contacts → More → Find Duplicates
- GoHighLevel skanuje według:
- Email (główne kryterium)
- Phone number
- First + Last name combination
- Zobacz listę potencjalnych duplikatów
Metoda 2: Manualne wyszukiwanie
- Contacts → Search bar
- Wpisz email/telefon/nazwisko
- Zobacz czy są multiple results
Krok 2: Przeglądanie duplikatów
Co sprawdzić:
Kontakt A: jan.kowalski@example.com
- Created: 2025-01-15
- Tags: lead, website
- Last activity: 2 days ago
- Opportunities: 0
- Emails sent: 5
Kontakt B: jan.kowalski@example.com
- Created: 2024-11-20
- Tags: customer, vip
- Last activity: 15 days ago
- Opportunities: 1 ($5,000)
- Emails sent: 27Które dane zachować?
- Starszy kontakt (więcej historii)
- Więcej opportunities/value
- Bogatsze custom fields
- Recent activity
Krok 3: Łączenie kontaktów (Merge)
- Zaznacz oba duplikaty (checkbox)
- Bulk Actions → Merge Contacts
- Wybierz Primary Contact (główny - który zachować)
- Zobacz preview:
- Co zostanie zachowane
- Co zostanie usunięte
- Jakie dane zostaną połączone
- Confirm Merge
Co się dzieje przy merge:
Zachowane z obydwu:
- ✅ Wszystkie tags (combined)
- ✅ Wszystkie notatki (merged)
- ✅ Historia aktywności (combined timeline)
- ✅ Opportunities (wszystkie przeniesione)
- ✅ Custom fields (z primary, jeśli puste to z secondary)
Usunięte:
- ❌ Secondary contact zostaje usunięty
- ❌ Duplikat email/phone (pozostaje 1)
Krok 4: Masowe łączenie
Jeśli masz wiele duplikatów:
- Contacts → Find Duplicates
- Zobacz grouped duplicates:
excel
Group 1: jan.kowalski@example.com (3 contacts)
Group 2: anna.nowak@example.com (2 contacts)
Group 3: piotr@firma.pl (2 contacts)- Dla każdej grupy:
- Wybierz primary (najczęściej oldest lub z most data)
- Merge others into primary
- Bulk Merge (jeśli dostępne)
Krok 5: Zapobieganie duplikatom
Ustawienia automatyczne:
- Settings → Contacts → Duplicate Prevention
- Włącz opcje:
☑ Prevent duplicate emails
☑ Prevent duplicate phones
☑ Merge on import (automatic)
☐ Allow multiple contacts per company (jeśli B2B)Validation rules na formularza:
javascript
// Sprawdź czy email już istnieje przed dodaniem
async function checkDuplicate(email) {
const response = await fetch(
`https://rest.gohighlevel.com/v1/contacts/lookup?email=${email}`,
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
if (response.ok) {
const contact = await response.json();
// Email już istnieje - update zamiast create
return update Contact(contact.id, newData);
} else {
// Email nie istnieje - create new
return createContact(newData);
}
}Krok 6: Deduplication podczas importu
CSV import z inteligentnym merge:
- Contacts → Import
- Upload CSV
- Duplicate Handling:
Opcja A: Skip duplicates
- Nowe kontakty: dodaj
- Duplikaty: ignoruj (nie importuj)
- Use case: Nie chcesz nadpisywać istniejących danych
Opcja B: Update duplicates
- Nowe kontakty: dodaj
- Duplikaty: zaktualizuj pola z CSV
- Use case: Masz nowsze dane w CSV
Opcja C: Merge duplicates
- Nowe kontakty: dodaj
- Duplikaty: połącz dane (combine tags, notes, etc.)
- Use case: Chcesz wzbogacić istniejące kontakty
- Import
Krok 7: API deduplication
Sprawdzanie przed dodaniem:
javascript
async function addContactSafe(contactData) {
// 1. Sprawdź czy email już istnieje
const existing = await fetch(
`https://rest.gohighlevel.com/v1/contacts/lookup?email=${contactData.email}`,
{ headers: { 'Authorization': `Bearer ${apiKey}` } }
);
if (existing.ok) {
const contact = await existing.json();
// 2. Update istniejącego kontaktu
return await fetch(
`https://rest.gohighlevel.com/v1/contacts/${contact.id}`,
{
method: 'PUT',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
...contactData,
tags: [...new Set([...contact.tags, ...contactData.tags])] // Merge tags
})
}
);
} else {
// 3. Create nowego
return await fetch(
'https://rest.gohighlevel.com/v1/contacts/',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(contactData)
}
);
}
}Krok 8: Regular audits (przeglądy)
Miesięczny cleanup checklist:
Week 1:
- [ ] Run duplicate finder
- [ ] Export duplicates report
- [ ] Review top 20 groups
Week 2:
- [ ] Merge obvious duplicates (same email)
- [ ] Flag uncertain cases for manual review
Week 3:
- [ ] Manual review flagged contacts
- [ ] Decide: merge or keep separate
- [ ] Document decision logic
Week 4:
- [ ] Update duplicate prevention rules
- [ ] Train team on best practices
- [ ] Monitor new duplicates creation rate
Best practices
✅ DO:
- Zawsze sprawdzaj przed merge
- Zachowuj kontakt z więcej historią jako primary
- Backup przed bulk merge
- Document merge decisions
- Train team aby zapobiegać
❌ DON'T:
- Nie merguj bez review
- Nie usuwaj - zawsze merge (zachowaj historię)
- Nie ignoruj małych różnic (Jan vs. Janek może być różne osoby)
- Nie automatyzuj 100% (human review is important)
Edge cases
Case 1: Ta sama osoba, różne firmy
Jan Kowalski - Firma A (old employer)
Jan Kowalski - Firma B (current employer)Rozwiązanie: Merge, ale zaktualizuj company field
Case 2: Różne osoby, ta sama firma email
jan@firma.pl (Jan Kowalski - Sales)
jan@firma.pl (Jan Nowak - IT)Rozwiązanie: NIE merguj - dodaj personal email field
Case 3: Email różnie napisany
Jan.Kowalski@Example.com
jan.kowalski@example.comRozwiązanie: Merguj - to ta sama osoba
Metryki do śledzenia
- Duplicate rate: % duplikatów vs total contacts
- Merge frequency: Ile merge per tydzień?
- Source of duplicates: Skąd powstają? (forms, imports, API?)
- Time to resolve: Jak szybko wykrywasz i mergeujesz?
Podsumowanie
✅ Nauczyłeś się:
- Znajdować duplikaty wbudowanym narzędziem
- Łączyć kontakty (merge) poprawnie
- Zapobiegać duplikatom w importach
- Implementować deduplication w API
- Prowadzić regular cleanup
Następny krok: 24. Notatki i historia kontaktów
