Skip to main content

Połącz Heilo z CRM-em

Cztery kroki, by połączyć Heilo z dowolnym CRM-em — przez Zapier, Make lub inne narzędzie obsługujące webhooki.

Po każdej rozmowie Heilo wysyła powiadomienie z jej danymi na wskazany przez Ciebie adres. Ten przewodnik pokazuje, jak połączyć Heilo z dowolnym CRM-em za pomocą Zapiera lub Make — bez programowania, w 15–20 minut.

To uniwersalna ścieżka, która działa z każdym CRM-em obsługiwanym przez Zapier lub Make. Gotowe przepisy krok po kroku dla Pipedrive, HubSpot i Zoho CRM znajdziesz poniżej. Szablony „jednym kliknięciem” (Zapier/Make) są nadal w planach — do tego czasu każdy przepis przeprowadza Cię ręcznie przez ostatni krok (zapis do Twojego CRM-u).

1Utwórz nowy Zap w Zapier

Wyzwalacz „Webhooks by Zapier (Catch Hook)” wygeneruje adres, na który Heilo będzie wysyłać zdarzenia.

  1. Zaloguj się do panelu Zapier
  2. Create Zap → Choose Trigger → „Webhooks by Zapier”
  3. Event = „Catch Hook” → Continue
  4. Zapier pokaże adres w stylu https://hooks.zapier.com/hooks/catch/… — skopiuj go

2Wklej adres do Heilo jako subskrypcję webhooka

Heilo sprawdzi adres — Zapier odpowie automatycznie. Po aktywacji każda rozmowa trafia na ten adres.

  1. Wróć do Ustawienia → Integracje w Heilo
  2. Kliknij „Dodaj subskrypcję”
  3. Wklej adres z Zapier w pole „Adres URL do odbioru danych”, zaznacz typy zdarzeń (zakończona rozmowa + próba połączenia wychodzącego) i kliknij „Utwórz i sprawdź adres”
  4. Status powinien zmienić się na „Aktywna”. Skopiuj sekret podpisu HMAC (pokażemy go tylko raz)

3Wyślij zdarzenie testowe

Heilo wyśle zdarzenie testowe z pełnym zestawem danych zakończonej rozmowy (przykład: Jan Kowalski / tynki / Warszawa) — w Zapier zobaczysz wszystkie pola, które otrzymasz w prawdziwych zdarzeniach. Mapujesz raz i działa zarówno dla testu, jak i dla realnych rozmów.

  1. W Heilo kliknij ikonę „Test” przy swojej subskrypcji
  2. W Zapier wróć do kroku wyzwalacza → „Test trigger” → powinieneś zobaczyć pełne dane
  3. Sprawdź, że widzisz dane rozmowy — numer dzwoniącego, imię, podsumowanie i link do nagrania
  4. Continue → przejdź do kroku akcji (Twój CRM)

4Skonfiguruj zapis w swoim CRM-ie

W swoim narzędziu (Zapier lub Make) dodaj akcje dla swojego CRM-u — na przykład Pipedrive, Zoho CRM, Notion czy Airtable. Dla sprzedaży zwykle są to trzy kroki: (1) znajdź lub utwórz kontakt po numerze telefonu, (2) utwórz albo zaktualizuj lead/deal, (3) dopnij aktywność, zadanie lub notatkę.

Pole HeiloZmapuj do CRM
data.call_idPole identyfikatora / referencji
data.customer_phone_e164Telefon kontaktu („Phone” / „Primary Phone”)
data.transcript_processed.caller_nameImię i nazwisko kontaktu (jeśli Heilo je rozpoznało)
data.transcript_processed.summaryTreść notatki lub opis aktywności
data.transcript_processed.service_neededTemat aktywności lub tytuł szansy sprzedaży
data.transcript_processed.subjectTytuł leada/deala (najlepszy fallback dla service_needed)
data.transcript_processed.lead_scorePriorytet, etykieta lub filtr kwalifikacji
data.transcript_processed.preferred_dateTermin follow-up albo expected close date
data.transcript_processed.client_cityMiasto kontaktu / pole adresu
data.transcript_processed.client_addressAdres kontaktu (ulica)
data.transcript_processed.services_matchCzy zapytanie pasuje do oferty (true/false) — do kwalifikacji
data.transcript_processed.additional_detailsDodatkowe ustalenia → notatka / opis
data.recording_urlPole na adres URL (np. „Link do nagrania”)
data.durationCzas trwania aktywności (w sekundach)

Pole data.outbound_lifecycle pojawia się tylko w zdarzeniach call.outbound.attempted i call.failed — nie ma go w call.completed.

Gotowe przepisy dla popularnych CRM-ów

Poniżej znajdziesz konfiguracje dla konkretnych CRM-ów. Ogólny webhook daje dane rozmowy; ta sekcja pokazuje, jak zamienić je w kontakt, lead/deal i aktywność w konkretnym systemie.

Pipedrive: kontakt + lead/deal + aktywność

Docelowy efekt: po zakończonej rozmowie Pipedrive ma znaleźć albo utworzyć osobę, utworzyć lead/deal sprzedażowy i dopiąć aktywność z podsumowaniem oraz linkiem do nagrania.

Użyj Lead, jeśli rozmowy mają najpierw trafić do Leads Inbox i przejść kwalifikację. Użyj Deal, jeśli każda zakwalifikowana rozmowa ma od razu wejść do pipeline'u.

Zapier
  1. Trigger: Webhooks by Zapier → Catch Hook. W Heilo zostaw domyślny tryb prosty.
  2. Filter by Zapier: przepuszczaj event_type = call.completed; na czas testu dopuść też webhook.test (albo filtruj po data._test = true).
  3. Pipedrive → Find or Create Person. Szukaj po Phone Numbers = data.customer_phone_e164, a Person Name ustaw z caller_name albo z numeru telefonu.
  4. Pipedrive → Create Lead albo Find or Create Deal. Tytuł ustaw z subject, z fallbackiem do service_needed.
  5. Pipedrive → Create Activity. Podepnij ją pod Lead ID albo Deal ID, a w Note/Public Description dodaj summary, recording_url, transcript_original i call_id.
Make
  1. Trigger: Webhooks → Custom webhook. Scenariusz musi być włączony i ustawiony na uruchamianie po przyjściu danych.
  2. Dodaj filtr za webhookiem: event_type = call.completed; podczas mapowania testowego dopuść także webhook.test (albo filtruj po data._test = true).
  3. Pipedrive CRM → Search Persons po data.customer_phone_e164. Jeśli brak wyniku, utwórz Person z tym telefonem i nazwą caller_name albo numerem.
  4. Pipedrive CRM → Search Leads albo Search Deals dla tej osoby. Jeśli brak otwartej szansy, utwórz Lead albo Deal.
  5. Pipedrive CRM → Create Activity albo Create Note. Podepnij rekord do lead/deal/person i zapisz summary, recording_url oraz call_id.
Pole HeiloPole / akcja PipedriveZastosowanie
event_typeFilter / RouterPrzetwarzaj call.completed; webhook.test tylko do mapowania pól.
data.customer_phone_e164Person → Phone NumbersGłówne pole do wyszukiwania i deduplikacji kontaktu.
data.transcript_processed.caller_namePerson → Person NameJeśli puste, użyj numeru telefonu jako nazwy awaryjnej.
data.transcript_processed.subjectLead/Deal → TitleNajlepszy tytuł szansy; fallback do service_needed.
data.transcript_processed.service_neededLead/Deal → Title albo custom fieldKategoria zapytania, przydatna też do pipeline'u lub etykiety.
data.transcript_processed.summaryActivity/Note → Note lub Public DescriptionKrótki opis rozmowy widoczny przy szansie.
data.transcript_processed.lead_scoreLead label / priority / filterNp. twórz lead/deal tylko od 7/10 albo oznacz niższe jako review.
data.transcript_processed.preferred_dateExpected close date albo activity due dateUżyj, jeśli klient podał termin lub preferowaną datę kontaktu.
data.transcript_processed.client_cityPerson → Address (miasto) albo custom fieldMiasto klienta; przydatne do segmentacji albo pipeline’u regionalnego.
data.transcript_processed.client_addressPerson/Organization → AddressUzupełnij adres osoby/organizacji, jeśli klient go podał.
data.transcript_processed.services_matchFilter / Lead labelfalse = zapytanie poza ofertą; nie twórz dealu albo oznacz do odrzucenia.
data.transcript_processed.additional_detailsActivity/Note → NoteDodatkowe ustalenia z rozmowy; dopisz do treści aktywności.
data.recording_urlActivity/Note → Recording linkLink do odsłuchu; może wygasnąć po usunięciu rozmowy zgodnie z RODO.
data.call_idCustom field → Heilo Call IDKlucz idempotencji. Pomaga nie tworzyć drugiego wpisu dla tej samej rozmowy.
data.durationActivity durationHeilo wysyła sekundy; w razie potrzeby przekonwertuj na format czasu wymagany przez Pipedrive.

Warunki poprawnego parowania

  • Nie włączaj trybu zaawansowanego dla Zapier/Make — ich webhooki potwierdzają odbiór, ale nie odsyłają pola challenge.
  • Nie mieszaj eventów bez filtra: call.outbound.attempted nie ma pełnej transkrypcji ani nagrania.
  • Dodaj w Pipedrive własne pole Heilo Call ID i zapisuj tam data.call_id, żeby unikać duplikatów.
  • Jeśli aktualizujesz istniejący lead/deal, najpierw wyszukaj otwartą szansę dla osoby, a dopiero gdy jej nie ma, twórz nową.
HubSpot: kontakt + deal + notatka

Docelowy efekt: po zakończonej rozmowie HubSpot ma znaleźć albo utworzyć kontakt po numerze telefonu, utworzyć deal i dodać notatkę z podsumowaniem oraz linkiem do nagrania.

Pułapka deduplikacji: akcja Create or Update Contact w Zapierze paruje istniejące kontakty wyłącznie po e-mailu. Zdarzenia Heilo niosą numer telefonu i często nie mają e-maila, więc ta akcja utworzy duplikat kontaktu przy każdej rozmowie. Zawsze najpierw wyszukuj po polu telefonu, a kontakt twórz dopiero wtedy, gdy wyszukiwanie nic nie znajdzie.

Zapier
  1. Trigger: Webhooks by Zapier → Catch Hook. W Heilo zostaw domyślny tryb prosty.
  2. Filter by Zapier: przepuszczaj event_type = call.completed; na czas testu dopuść też webhook.test (albo filtruj po data._test = true).
  3. HubSpot → Find Contact. Jako pole wyszukiwania ustaw Phone Number i zmapuj data.customer_phone_e164; włącz opcję utworzenia kontaktu przy braku wyniku, z caller_name albo numerem telefonu jako nazwą. Nie używaj tu Create or Update Contact — ta akcja paruje po e-mailu.
  4. HubSpot → Create Deal. Deal Name ustaw z subject (z fallbackiem do service_needed), wybierz Pipeline i Deal Stage, a deal powiąż z kontaktem.
  5. HubSpot → Create Engagement (typ Note). Powiąż ją z kontaktem i dealem, a w treści notatki dodaj summary, recording_url, transcript_original i call_id.
Make
  1. Trigger: Webhooks → Custom webhook. Scenariusz musi być włączony i ustawiony na uruchamianie po przyjściu danych.
  2. Dodaj filtr za webhookiem: event_type = call.completed; podczas mapowania testowego dopuść także webhook.test (albo filtruj po data._test = true).
  3. HubSpot CRM → Search for Contacts po polu telefonu = data.customer_phone_e164. Jeśli brak wyniku, utwórz kontakt akcją Create a Contact (ten telefon oraz caller_name albo numer jako nazwa).
  4. HubSpot CRM → Create a Deal. Deal Name ustaw z subject, wybierz Pipeline i Deal Stage, a deal powiąż z kontaktem.
  5. HubSpot CRM → Create an Engagement (typ Note). Podepnij ją pod kontakt i deal i zapisz summary, recording_url oraz call_id.
Pole HeiloPole / akcja HubSpotZastosowanie
event_typeFilter / RouterPrzetwarzaj call.completed; webhook.test tylko do mapowania pól.
data.customer_phone_e164Contact → Phone NumberGłówny klucz wyszukiwania. Przechowuj numery w HubSpot w formacie E.164 — wyszukiwanie po telefonie dopasowuje dokładną wartość, nie warianty zapisu.
data.transcript_processed.caller_nameContact → First Name / Last NameJeśli puste, użyj numeru telefonu jako nazwy awaryjnej.
data.transcript_processed.subjectDeal → Deal NameNajlepszy tytuł szansy; fallback do service_needed.
data.transcript_processed.service_neededDeal → Deal Name albo custom propertyKategoria zapytania, przydatna też do pipeline'u lub etykiety.
data.transcript_processed.summaryNote → Note bodyKrótki opis rozmowy widoczny przy szansie.
data.transcript_processed.lead_scoreCustom property / filterNp. twórz lead/deal tylko od 7/10 albo oznacz niższe jako review.
data.transcript_processed.preferred_dateDeal → Close Date albo termin zadaniaUżyj, jeśli klient podał termin lub preferowaną datę kontaktu.
data.transcript_processed.client_cityContact → CityMiasto klienta; przydatne do segmentacji albo pipeline’u regionalnego.
data.transcript_processed.client_addressContact → Street AddressUzupełnij adres osoby/organizacji, jeśli klient go podał.
data.transcript_processed.services_matchFilter / deal tagfalse = zapytanie poza ofertą; nie twórz dealu albo oznacz do odrzucenia.
data.transcript_processed.additional_detailsNote → Note bodyDodatkowe ustalenia z rozmowy; dopisz do treści aktywności.
data.recording_urlNote → Recording linkLink do odsłuchu; może wygasnąć po usunięciu rozmowy zgodnie z RODO.
data.call_idCustom property → Heilo Call IDKlucz idempotencji. Pomaga nie tworzyć drugiego wpisu dla tej samej rozmowy.
data.durationCustom property albo notatkaHeilo wysyła sekundy; w razie potrzeby przekonwertuj na format wymagany przez pole w HubSpot.

Warunki poprawnego parowania

  • Nie włączaj trybu zaawansowanego dla Zapier/Make — ich webhooki potwierdzają odbiór, ale nie odsyłają pola challenge.
  • Nie mieszaj eventów bez filtra: call.outbound.attempted nie ma pełnej transkrypcji ani nagrania.
  • Nie opieraj parowania na Create or Update Contact — ta akcja deduplikuje wyłącznie po e-mailu; zawsze najpierw wykonaj wyszukiwanie po telefonie.
  • Dodaj w HubSpot własną właściwość (custom property) Heilo Call ID i zapisuj tam data.call_id, żeby unikać duplikatów.
  • Jeśli aktualizujesz istniejący lead/deal, najpierw wyszukaj otwartą szansę dla osoby, a dopiero gdy jej nie ma, twórz nową.
Zoho CRM: kontakt + deal + notatka

Docelowy efekt: po zakończonej rozmowie Zoho CRM ma znaleźć albo utworzyć kontakt po numerze telefonu, utworzyć deal i dopiąć notatkę z podsumowaniem oraz linkiem do nagrania.

Kontakty wyszukuj po polu Phone (albo Mobile, jeśli tam trzymasz numery). Heilo wysyła data.customer_phone_e164 w formacie E.164 — trzymaj numery w Zoho w tym samym formacie, inaczej wyszukiwanie nic nie znajdzie.

Zapier
  1. Trigger: Webhooks by Zapier → Catch Hook. W Heilo zostaw domyślny tryb prosty.
  2. Filter by Zapier: przepuszczaj event_type = call.completed; na czas testu dopuść też webhook.test (albo filtruj po data._test = true).
  3. Zoho CRM → Find Module Entry w module Contacts, z wyszukiwaniem po polu Phone = data.customer_phone_e164; włącz opcję utworzenia wpisu przy braku wyniku. Zoho wymaga Last Name — użyj caller_name albo numeru telefonu.
  4. Zoho CRM → Create Module Entry w module Deals. Deal Name ustaw z subject (z fallbackiem do service_needed), wybierz Stage i powiąż deal z kontaktem.
  5. Zoho CRM → Create Module Entry w module Notes. W Note Content zapisz summary, recording_url, transcript_original i call_id, a notatkę powiąż z dealem albo kontaktem.
Make
  1. Trigger: Webhooks → Custom webhook. Scenariusz musi być włączony i ustawiony na uruchamianie po przyjściu danych.
  2. Dodaj filtr za webhookiem: event_type = call.completed; podczas mapowania testowego dopuść także webhook.test (albo filtruj po data._test = true).
  3. Zoho CRM → Search Objects w module Contacts z kryterium Phone = data.customer_phone_e164. Jeśli brak wyniku, utwórz kontakt akcją Create an Object (Last Name z caller_name albo z numeru).
  4. Zoho CRM → Create an Object w module Deals. Deal Name ustaw z subject, wybierz Stage i powiąż deal z kontaktem.
  5. Zoho CRM → Create an Object w module Notes. W Note Content zapisz summary, recording_url oraz call_id i podepnij notatkę pod deal albo kontakt.
Pole HeiloPole / akcja Zoho CRMZastosowanie
event_typeFilter / RouterPrzetwarzaj call.completed; webhook.test tylko do mapowania pól.
data.customer_phone_e164Contact → PhoneGłówny klucz wyszukiwania. Szukaj po polu Phone (albo Mobile) i trzymaj jeden format numerów po obu stronach — wyszukiwanie dopasowuje dokładną wartość.
data.transcript_processed.caller_nameContact → Last NameZoho wymaga Last Name; jeśli caller_name jest puste, użyj numeru telefonu jako nazwy awaryjnej.
data.transcript_processed.subjectDeal → Deal NameNajlepszy tytuł szansy; fallback do service_needed.
data.transcript_processed.service_neededDeal → Deal Name albo custom fieldKategoria zapytania, przydatna też do pipeline'u lub etykiety.
data.transcript_processed.summaryNote → Note ContentKrótki opis rozmowy widoczny przy szansie.
data.transcript_processed.lead_scoreCustom field / filterNp. twórz lead/deal tylko od 7/10 albo oznacz niższe jako review.
data.transcript_processed.preferred_dateDeal → Closing Date albo termin zadaniaUżyj, jeśli klient podał termin lub preferowaną datę kontaktu.
data.transcript_processed.client_cityContact → Mailing CityMiasto klienta; przydatne do segmentacji albo pipeline’u regionalnego.
data.transcript_processed.client_addressContact → Mailing StreetUzupełnij adres osoby/organizacji, jeśli klient go podał.
data.transcript_processed.services_matchFilter / tagfalse = zapytanie poza ofertą; nie twórz dealu albo oznacz do odrzucenia.
data.transcript_processed.additional_detailsNote → Note ContentDodatkowe ustalenia z rozmowy; dopisz do treści aktywności.
data.recording_urlNote → Note Content (link)Link do odsłuchu; może wygasnąć po usunięciu rozmowy zgodnie z RODO.
data.call_idCustom field → Heilo Call IDKlucz idempotencji. Pomaga nie tworzyć drugiego wpisu dla tej samej rozmowy.
data.durationCustom field albo notatkaHeilo wysyła sekundy; w razie potrzeby przekonwertuj na format wymagany przez pole w Zoho CRM.

Warunki poprawnego parowania

  • Nie włączaj trybu zaawansowanego dla Zapier/Make — ich webhooki potwierdzają odbiór, ale nie odsyłają pola challenge.
  • Nie mieszaj eventów bez filtra: call.outbound.attempted nie ma pełnej transkrypcji ani nagrania.
  • Dodaj w Zoho CRM własne pole Heilo Call ID i zapisuj tam data.call_id, żeby unikać duplikatów.
  • Zoho odrzuci rekord bez pól wymaganych: Contacts wymaga Last Name, a Deals co najmniej Deal Name i Stage (zależnie od układu także Closing Date) — ustaw dla nich bezpieczne fallbacki.
  • Jeśli aktualizujesz istniejący lead/deal, najpierw wyszukaj otwartą szansę dla osoby, a dopiero gdy jej nie ma, twórz nową.

Pełna struktura danych (do wglądu)

Każde powiadomienie ma tę samą strukturę. Pola w sekcji „data” zależą od typu zdarzenia — na przykład zakończona rozmowa zawiera przetworzoną transkrypcję. Nagłówek Heilo-Signature podpisuje treść (HMAC-SHA256), więc możesz zweryfikować, że żądanie naprawdę pochodzi z Heilo.

{
  "api_version": "2026-06-15",
  "event_id": "<uuid>",
  "event_type": "call.completed",
  "resource_id": "<call_id>",
  "created_at": "2026-06-03T12:34:56Z",
  "data": {
    "call_id": "...",
    "direction": "inbound",
    "caller_phone": "+48600100200",
    "customer_phone_e164": "+48600100200",
    "duration": 87,
    "recording_url": "https://heilo.io/api/v1/calls/.../recording.mp3?token=...",
    "transcript_processed": {
      "caller_name": "Jan Kowalski",
      "client_address": "ul. Przykladowa 10",
      "client_city": "Warszawa",
      "summary": "...",
      "service_needed": "Tynki gipsowe w mieszkaniu 65m2",
      "subject": "Wycena tynkow - Warszawa, 65m2",
      "lead_score": 7,
      "preferred_date": "2026-06-10",
      "services_match": true,
      "additional_details": "Klient wspomnial o terminie do konca czerwca."
    },
    "transcript_original": "..."
  }
}

Najczęstsze problemy

Weryfikacja adresu nie powiodła się po dodaniu subskrypcji
Twój adres nie potwierdził się w ciągu 10 sekund. W Zapier dzieje się to automatycznie; w Make scenariusz musi być włączony. Jeśli używasz trybu zaawansowanego, potrzebujesz też modułu „Webhook response”, który odsyła challenge. Sprawdź, czy w adresie nie ma spacji ani znaku „&”, popraw go i kliknij „Ponów weryfikację” przy wstrzymanej subskrypcji.
W CRM-ie tworzą się zduplikowane kontakty
Narzędzia łączące nie ujednolicają formatu numerów — „+48 600 100 200” i „+48600100200” widzą jako dwa różne numery. Heilo wysyła numer już w formacie E.164 (pole customer_phone_e164), więc to jego używaj do wyszukiwania kontaktu. W Zapier możesz dodatkowo dodać krok „Formatter → Phone Number → E.164” przed wyszukiwaniem.
Link do nagrania przestaje działać po jakimś czasie
Link działa tak długo, jak rozmowa istnieje i nie została zaplanowana do usunięcia (RODO). Jeśli rozmowę usunięto, link zwraca błąd 410. Tak ma być.
Komunikat o przekroczeniu limitu operacji
Jedna rozmowa Heilo to zwykle ok. 3 operacje w narzędziu (znajdź + utwórz + ewentualnie zaktualizuj). Darmowe plany wystarczają do testów; przy większej liczbie rozmów rozważ płatny plan Zapiera lub Make (Make ma 1000 darmowych operacji miesięcznie ≈ 330 rozmów).

Roadmap (v1.1+)

Co planujemy w kolejnych wydaniach. Lista nie jest gwarancją — kolejność zależy od Waszego feedbacku.

  • Gotowe przepisy dla kolejnych CRM-ów: Salesforce, Bitrix24, Livespace
  • Szablony „jednym kliknięciem” (Zapier/Make) dla najpopularniejszych CRM-ów
  • Gotowe reguły deduplikacji i mapowania pól do skopiowania
  • Więcej typów zdarzeń do mapowania (np. kontakt utworzony/zaktualizowany)

Brakuje Twojego CRM-a albo scenariusza? Napisz na support@heilo.io — priorytetyzujemy na podstawie realnych potrzeb.

Zarządzaj kluczami i webhookami w panelu

Po zalogowaniu wygenerujesz klucze API, dodasz subskrypcje webhooków i sprawdzisz historię wysyłek.