Skip to content

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

  1. ContactsMoreFind Duplicates
  2. GoHighLevel skanuje według:
    • Email (główne kryterium)
    • Phone number
    • First + Last name combination
  3. Zobacz listę potencjalnych duplikatów

Metoda 2: Manualne wyszukiwanie

  1. Contacts → Search bar
  2. Wpisz email/telefon/nazwisko
  3. 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: 27

Które dane zachować?

  • Starszy kontakt (więcej historii)
  • Więcej opportunities/value
  • Bogatsze custom fields
  • Recent activity

Krok 3: Łączenie kontaktów (Merge)

  1. Zaznacz oba duplikaty (checkbox)
  2. Bulk ActionsMerge Contacts
  3. Wybierz Primary Contact (główny - który zachować)
  4. Zobacz preview:
    • Co zostanie zachowane
    • Co zostanie usunięte
    • Jakie dane zostaną połączone
  5. 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:

  1. ContactsFind Duplicates
  2. 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)
  1. Dla każdej grupy:
    • Wybierz primary (najczęściej oldest lub z most data)
    • Merge others into primary
  2. Bulk Merge (jeśli dostępne)

Krok 5: Zapobieganie duplikatom

Ustawienia automatyczne:

  1. SettingsContactsDuplicate Prevention
  2. 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:

  1. ContactsImport
  2. Upload CSV
  3. 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
  1. 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.com

Rozwią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