Skip to main content

Połącz Heilo z CRM-em

Osiem kroków, 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).

1Zanim zaczniesz: czego wymagają plany Zapiera i Make

Wyzwalacz „Webhooks by Zapier” jest aplikacją premium i na planie Free nie działa — Free daje 100 zadań miesięcznie i Zapy dwukrokowe, czyli jeden wyzwalacz i jedną akcję. Przepis z tego przewodnika ma po wyzwalaczu co najmniej trzy akcje, więc potrzebujesz planu Professional albo wyższego; próg wejściowy Professional to 19,99 USD miesięcznie przy płatności rocznej i 29,99 USD przy miesięcznej, za 750 zadań. Zadanie zużywa tylko udana akcja — wyzwalacz, Filter i Formatter nie liczą się do limitu. Cennik i plany Zapiera

Make nie stawia progu planu przed webhookami — moduł „Custom webhook” działa także na planie Free, który daje do 1000 kredytów miesięcznie i dwa aktywne scenariusze. Jednostką rozliczeniową w Make są kredyty, nie operacje; jedno uruchomienie modułu to jeden kredyt, a moduł wyzwalacza też się liczy. Nie przeliczaj tego na liczbę rozmów: po pierwszym prawdziwym zdarzeniu otwórz historię scenariusza i odczytaj kredyty zużyte przez ten jeden przebieg. Cennik i plany Make

Ceny i limity dostawców sprawdziliśmy na ich stronach 9 września 2026. Zmieniają się bez naszego udziału, więc przed decyzją potwierdź je pod powyższymi linkami.

2Utwó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

3Wklej 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”. Sekret podpisu pokażemy tylko raz — zapisz go teraz, nawet jeśli na razie zostajesz przy wariancie podstawowym, bo bez niego nie sprawdzisz podpisu później

4Wyślij zdarzenie testowe z Heilo

Zdarzenie testowe niesie dokładnie tę samą strukturę co prawdziwa zakończona rozmowa, więc mapowanie zrobione na nim zadziała później bez zmian. Jedno zastrzeżenie: link do nagrania w tym zdarzeniu jest przykładem, a nie plikiem — jego otwarcie nie dowodzi, że prawdziwe audio będzie dostępne.

  1. W Heilo kliknij ikonę „Test” przy swojej subskrypcji
  2. Zdarzenie idzie tą samą kolejką dostaw co każde inne — jeśli odbiornik go nie przyjmie, zobaczysz to w historii dostaw w Heilo

5Odczytaj pełną strukturę danych

Zapier proponuje do mapowania wyłącznie te pola, które faktycznie zobaczył. Dlatego strukturę odczytujesz po wysłaniu testu, a nie przed nim — inaczej połowa pól nie pojawi się na liście.

  1. W Zapier wróć do kroku wyzwalacza i uruchom „Test trigger”
  2. Sprawdź, że widzisz dane rozmowy: numer dzwoniącego, imię, podsumowanie i link do nagrania
  3. Continue → przejdź do kroku akcji (Twój CRM)

6Skonfiguruj 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ę.

Zanim opublikujesz automatyzację, ustaw filtr na polu event_type. Przepuszczaj wybrany typ biznesowy, a odrzucaj webhook.test oraz potwierdzenie adresu — bez tego Twoje własne testy będą tworzyć rekordy w CRM-ie. Podczas mapowania możesz test dopuścić; przed publikacją musisz go odciąć. Dokładne miejsce filtra dla każdego z trzech przepisów opisuje sekcja z przepisami niżej.

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.

7Opublikuj automatyzację

Do tego momentu wszystko działo się w trybie edycji i nic nie reagowało na prawdziwe rozmowy. Włącz automatyzację w swoim narzędziu — w Zapierze publikujesz Zapa, w Make włączasz scenariusz. Zanim to zrobisz, upewnij się, że filtr z poprzedniego kroku jest zapisany: publikacja bez niego oznacza, że kolejne zdarzenie testowe też coś w CRM-ie utworzy.

8Sprawdź prawdziwą rozmowę w swoim CRM-ie

Ostatni krok nie jest formalnością. Zdarzenie testowe dowodzi, że przewód jest podłączony, a nie że zapis powstał tam, gdzie ma być. Odbierz albo wykonaj jedną prawdziwą rozmowę, poczekaj na jej zakończenie i otwórz kontakt w swoim CRM-ie. Sprawdź trzy rzeczy: aktywność istnieje i jest dokładnie jedna, ma zapisane Heilo Call ID, a podsumowanie odpowiada temu, co faktycznie padło w rozmowie. Dopiero to jest odbiór integracji.

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 → Search Activities po własnym polu Heilo Call ID = data.call_id. Ten krok decyduje, czy dalej aktualizujesz, czy tworzysz — bez niego ponowienie dopisze drugą aktywność do tej samej rozmowy.
  5. Znaleziona aktywność → Update Activity; brak wyniku → Create Activity podpięta pod osobę. W obu przypadkach zapisz Heilo Call ID = data.call_id oraz summary, recording_url i transcript_original. Deala tu nie tworzymy — reguła dla szans sprzedaży jest w osobnej sekcji niżej.
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 Activities po własnym polu Heilo Call ID = data.call_id. Ustaw scenariusz na przetwarzanie po jednym, żeby dwa równoległe przebiegi nie minęły się na tym wyszukiwaniu.
  5. Router: gdy aktywność istnieje → Update an Activity; gdy nie → Create an Activity podpięta pod osobę. Zapisz Heilo Call ID = data.call_id, summary i recording_url. Szansy sprzedaży ten przepis nie tworzy.
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

  • Przy potwierdzaniu adresu nie włączaj trybu ścisłego — webhooki Zapiera i Make potwierdzają odbiór, ale nie odsyłają pola challenge. Dotyczy to wyłącznie jednorazowego potwierdzenia adresu, a nie podpisu przy zwykłych dostawach.
  • Nie mieszaj eventów bez filtra: call.outbound.attempted nie ma pełnej transkrypcji ani nagrania.
  • Załóż w Pipedrive własne pole Heilo Call ID i zapisuj w nim data.call_id. To po nim wyszukujesz przed każdym zapisem — bez niego nie masz na czym oprzeć deduplikacji.
  • Numer zastrzeżony albo brak numeru: nie twórz z takiej wartości osoby. Skieruj takie zdarzenie do ręcznej obsługi, inaczej wszystkie takie rozmowy trafią do jednego fikcyjnego kontaktu.
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 → Find Engagement po własnej właściwości Heilo Call ID = data.call_id. Nie włączaj tu tworzenia przy braku wyniku — o tym decyduje następny krok.
  5. Znaleziona notatka → zaktualizuj ją; brak wyniku → Create Engagement (typ Note) powiązana z kontaktem. Zapisz Heilo Call ID = data.call_id oraz summary, recording_url i transcript_original. Create Deal nie jest częścią domyślnego przepisu.
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 → Search for Engagements po właściwości Heilo Call ID = data.call_id. Scenariusz ustaw na przetwarzanie po jednym.
  5. Router: notatka istnieje → zaktualizuj ją; nie istnieje → Create an Engagement (typ Note) powiązana z kontaktem. Zapisz Heilo Call ID = data.call_id, summary i recording_url. Deala ten przepis nie tworzy.
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

  • Przy potwierdzaniu adresu nie włączaj trybu ścisłego — webhooki Zapiera i Make potwierdzają odbiór, ale nie odsyłają pola challenge. Dotyczy to wyłącznie jednorazowego potwierdzenia adresu, a nie podpisu przy zwykłych dostawach.
  • 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.
  • Numer zastrzeżony albo brak numeru: nie twórz z takiej wartości osoby. Skieruj takie zdarzenie do ręcznej obsługi, inaczej wszystkie takie rozmowy trafią do jednego fikcyjnego kontaktu.
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 → Find Module Entry w module Notes, z wyszukiwaniem po własnym polu Heilo Call ID = data.call_id. Nie włączaj tworzenia przy braku wyniku.
  5. Znaleziona notatka → zaktualizuj Note Content; brak wyniku → Create Module Entry w module Notes, powiązana z kontaktem. Zapisz Heilo Call ID = data.call_id oraz summary, recording_url i transcript_original. Modułu Deals domyślny przepis nie dotyka.
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 → Search Objects w module Notes z kryterium Heilo Call ID = data.call_id. Scenariusz ustaw na przetwarzanie po jednym.
  5. Router: notatka istnieje → zaktualizuj ją; nie istnieje → Create an Object w module Notes, powiązana z kontaktem. Zapisz Heilo Call ID = data.call_id, summary i recording_url. Szansy sprzedaży ten przepis nie tworzy.
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

  • Przy potwierdzaniu adresu nie włączaj trybu ścisłego — webhooki Zapiera i Make potwierdzają odbiór, ale nie odsyłają pola challenge. Dotyczy to wyłącznie jednorazowego potwierdzenia adresu, a nie podpisu przy zwykłych dostawach.
  • 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.
  • Numer zastrzeżony albo brak numeru: nie twórz z takiej wartości osoby. Skieruj takie zdarzenie do ręcznej obsługi, inaczej wszystkie takie rozmowy trafią do jednego fikcyjnego kontaktu.

Trzy różne klucze — nie mieszaj ich

event_id identyfikuje jedno konkretne powiadomienie. Ta sama rozmowa może wysłać kilka powiadomień, a to samo powiadomienie może przyjść dwa razy przy ponowieniu. Zapisuj event_id, żeby rozpoznać powtórkę.

call_id identyfikuje rozmowę, czyli aktywność w CRM-ie. Jedna rozmowa to jedna aktywność, niezależnie od tego, ile powiadomień o niej przyszło. To jest klucz, po którym szukasz przed zapisem.

Numer telefonu albo identyfikator kontaktu w CRM-ie identyfikuje osobę. Uwaga na trzy przypadki: numer zastrzeżony przychodzi jako wartość literalna, nie jako numer; numeru może w ogóle nie być; a do jednego numeru mogą pasować dwa kontakty. W żadnym z nich nie twórz kontaktu z takiej wartości — skieruj takie zdarzenie do ręcznej obsługi, inaczej wszystkie rozmowy z zastrzeżonych numerów skleją się w jeden fikcyjny kontakt.

Szansa sprzedaży — świadomy dodatek, nie domyślny krok

Domyślny przepis nie tworzy szansy sprzedaży, bo nie każda rozmowa nią jest, a bezwarunkowe „utwórz deal” zasypuje lejek jednym dealem na rozmowę. Jeśli chcesz je tworzyć, zrób to regułą: najpierw poszukaj otwartej szansy dla tego kontaktu i podepnij aktywność pod nią; twórz nową tylko wtedy, gdy żadnej nie ma. Gdy pasuje kilka otwartych szans, nie zgaduj — podepnij aktywność pod kontakt i zostaw wybór człowiekowi.

Powtórki, błędy częściowe i wynik nieznany

Heilo ponawia nieudaną dostawę pięć razy, w odstępach 2 minut, 5 minut, 30 minut i 2 godzin. Nie gwarantujemy kolejności: zdarzenie o nagraniu może przyjść przed zdarzeniem o zakończeniu rozmowy. Przepis musi to znieść, a nie zakładać, że pierwsze przyszło pierwsze.

Deduplikacja musi obejmować każde wywołanie, które tworzy rekord — nie tylko pierwsze. Układ „sprawdź flagę, utwórz, zapisz flagę” nie wystarcza: dwa równoległe przebiegi sprawdzą flagę zanim którykolwiek ją zapisze i utworzą dwa rekordy. Jeśli Twój CRM ma klucz unikalny albo operację upsert po Heilo Call ID, użyj jej. Jeśli nie ma, ustaw scenariusz na przetwarzanie po jednym i wyszukuj przed każdym zapisem.

Przekroczenie czasu po wysłaniu żądania tworzącego rekord nie znaczy, że rekord nie powstał — znaczy, że nie wiesz. Nie ponawiaj wtedy tworzenia. Najpierw odczytaj stan po Heilo Call ID i dopiero na tej podstawie zdecyduj. To samo dotyczy błędu w połowie: jeśli kontakt się utworzył, a notatka nie, ponowienie ma dopisać notatkę, a nie zrobić drugi kontakt.

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ę. Heilo podpisuje każdą dostawę nagłówkiem Heilo-Signature (HMAC-SHA256 z surowej treści żądania), ale sam podpis nic nie daje, dopóki odbiornik go nie sprawdzi. Catch Hook w Zapierze i Custom webhook w Make przyjmują żądanie bez sprawdzania podpisu — co to znaczy w praktyce, opisuje sekcja o dwóch wariantach zabezpieczenia.

{
  "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",
    "customer_phone_national": "600 100 200",
    "company_phone_e164": "+48222630000",
    "call_created_at": "2026-06-03T12:30:11Z",
    "app_url": "https://www.heilo.io/calls/3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "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 do nagrania jest ważny 7 dni od wygenerowania i może przestać działać wcześniej. Po wygaśnięciu tokenu dostaniesz 403, a gdy nagranie zostało usunięte — 410. Ponowna wysyłka tego samego zdarzenia nie odnawia linku, bo niesie ten sam adres. Jeśli potrzebujesz nagrania później, otwórz rozmowę w Heilo po zalogowaniu. Jeśli kopiujesz plik do CRM-u, obsłuż też zdarzenia call.deletion_scheduled i call.recording.deleted — wygaśnięcie linku nie kasuje kopii, którą masz już u siebie.
Komunikat o przekroczeniu limitu operacji
Jedna rozmowa Heilo to zwykle kilka kroków w narzędziu: znajdź kontakt, utwórz albo zaktualizuj aktywność. Nie przeliczaj tego na uniwersalną liczbę rozmów — po pierwszym prawdziwym zdarzeniu otwórz historię wykonania swojego Zapa albo scenariusza i odczytaj, ile zadań lub kredytów zużył ten jeden przebieg. Tyle będzie kosztować każda kolejna rozmowa u Ciebie.

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. zdarzenia projektów i zadań, sms.received)

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.