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.
- Zaloguj się do panelu Zapier
- Create Zap → Choose Trigger → „Webhooks by Zapier”
- Event = „Catch Hook” → Continue
- 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.
- Wróć do Ustawienia → Integracje w Heilo
- Kliknij „Dodaj subskrypcję”
- 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”
- 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.
- W Heilo kliknij ikonę „Test” przy swojej subskrypcji
- W Zapier wróć do kroku wyzwalacza → „Test trigger” → powinieneś zobaczyć pełne dane
- Sprawdź, że widzisz dane rozmowy — numer dzwoniącego, imię, podsumowanie i link do nagrania
- 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 Heilo | Zmapuj do CRM |
|---|---|
| data.call_id | Pole identyfikatora / referencji |
| data.customer_phone_e164 | Telefon kontaktu („Phone” / „Primary Phone”) |
| data.transcript_processed.caller_name | Imię i nazwisko kontaktu (jeśli Heilo je rozpoznało) |
| data.transcript_processed.summary | Treść notatki lub opis aktywności |
| data.transcript_processed.service_needed | Temat aktywności lub tytuł szansy sprzedaży |
| data.transcript_processed.subject | Tytuł leada/deala (najlepszy fallback dla service_needed) |
| data.transcript_processed.lead_score | Priorytet, etykieta lub filtr kwalifikacji |
| data.transcript_processed.preferred_date | Termin follow-up albo expected close date |
| data.transcript_processed.client_city | Miasto kontaktu / pole adresu |
| data.transcript_processed.client_address | Adres kontaktu (ulica) |
| data.transcript_processed.services_match | Czy zapytanie pasuje do oferty (true/false) — do kwalifikacji |
| data.transcript_processed.additional_details | Dodatkowe ustalenia → notatka / opis |
| data.recording_url | Pole na adres URL (np. „Link do nagrania”) |
| data.duration | Czas 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
- Trigger: Webhooks by Zapier → Catch Hook. W Heilo zostaw domyślny tryb prosty.
- Filter by Zapier: przepuszczaj event_type = call.completed; na czas testu dopuść też webhook.test (albo filtruj po data._test = true).
- Pipedrive → Find or Create Person. Szukaj po Phone Numbers = data.customer_phone_e164, a Person Name ustaw z caller_name albo z numeru telefonu.
- Pipedrive → Create Lead albo Find or Create Deal. Tytuł ustaw z subject, z fallbackiem do service_needed.
- 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
- Trigger: Webhooks → Custom webhook. Scenariusz musi być włączony i ustawiony na uruchamianie po przyjściu danych.
- Dodaj filtr za webhookiem: event_type = call.completed; podczas mapowania testowego dopuść także webhook.test (albo filtruj po data._test = true).
- 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.
- Pipedrive CRM → Search Leads albo Search Deals dla tej osoby. Jeśli brak otwartej szansy, utwórz Lead albo Deal.
- Pipedrive CRM → Create Activity albo Create Note. Podepnij rekord do lead/deal/person i zapisz summary, recording_url oraz call_id.
| Pole Heilo | Pole / akcja Pipedrive | Zastosowanie |
|---|---|---|
| event_type | Filter / Router | Przetwarzaj call.completed; webhook.test tylko do mapowania pól. |
| data.customer_phone_e164 | Person → Phone Numbers | Główne pole do wyszukiwania i deduplikacji kontaktu. |
| data.transcript_processed.caller_name | Person → Person Name | Jeśli puste, użyj numeru telefonu jako nazwy awaryjnej. |
| data.transcript_processed.subject | Lead/Deal → Title | Najlepszy tytuł szansy; fallback do service_needed. |
| data.transcript_processed.service_needed | Lead/Deal → Title albo custom field | Kategoria zapytania, przydatna też do pipeline'u lub etykiety. |
| data.transcript_processed.summary | Activity/Note → Note lub Public Description | Krótki opis rozmowy widoczny przy szansie. |
| data.transcript_processed.lead_score | Lead label / priority / filter | Np. twórz lead/deal tylko od 7/10 albo oznacz niższe jako review. |
| data.transcript_processed.preferred_date | Expected close date albo activity due date | Użyj, jeśli klient podał termin lub preferowaną datę kontaktu. |
| data.transcript_processed.client_city | Person → Address (miasto) albo custom field | Miasto klienta; przydatne do segmentacji albo pipeline’u regionalnego. |
| data.transcript_processed.client_address | Person/Organization → Address | Uzupełnij adres osoby/organizacji, jeśli klient go podał. |
| data.transcript_processed.services_match | Filter / Lead label | false = zapytanie poza ofertą; nie twórz dealu albo oznacz do odrzucenia. |
| data.transcript_processed.additional_details | Activity/Note → Note | Dodatkowe ustalenia z rozmowy; dopisz do treści aktywności. |
| data.recording_url | Activity/Note → Recording link | Link do odsłuchu; może wygasnąć po usunięciu rozmowy zgodnie z RODO. |
| data.call_id | Custom field → Heilo Call ID | Klucz idempotencji. Pomaga nie tworzyć drugiego wpisu dla tej samej rozmowy. |
| data.duration | Activity duration | Heilo 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
- Trigger: Webhooks by Zapier → Catch Hook. W Heilo zostaw domyślny tryb prosty.
- Filter by Zapier: przepuszczaj event_type = call.completed; na czas testu dopuść też webhook.test (albo filtruj po data._test = true).
- 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.
- HubSpot → Create Deal. Deal Name ustaw z subject (z fallbackiem do service_needed), wybierz Pipeline i Deal Stage, a deal powiąż z kontaktem.
- 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
- Trigger: Webhooks → Custom webhook. Scenariusz musi być włączony i ustawiony na uruchamianie po przyjściu danych.
- Dodaj filtr za webhookiem: event_type = call.completed; podczas mapowania testowego dopuść także webhook.test (albo filtruj po data._test = true).
- 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).
- HubSpot CRM → Create a Deal. Deal Name ustaw z subject, wybierz Pipeline i Deal Stage, a deal powiąż z kontaktem.
- HubSpot CRM → Create an Engagement (typ Note). Podepnij ją pod kontakt i deal i zapisz summary, recording_url oraz call_id.
| Pole Heilo | Pole / akcja HubSpot | Zastosowanie |
|---|---|---|
| event_type | Filter / Router | Przetwarzaj call.completed; webhook.test tylko do mapowania pól. |
| data.customer_phone_e164 | Contact → Phone Number | Głó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_name | Contact → First Name / Last Name | Jeśli puste, użyj numeru telefonu jako nazwy awaryjnej. |
| data.transcript_processed.subject | Deal → Deal Name | Najlepszy tytuł szansy; fallback do service_needed. |
| data.transcript_processed.service_needed | Deal → Deal Name albo custom property | Kategoria zapytania, przydatna też do pipeline'u lub etykiety. |
| data.transcript_processed.summary | Note → Note body | Krótki opis rozmowy widoczny przy szansie. |
| data.transcript_processed.lead_score | Custom property / filter | Np. twórz lead/deal tylko od 7/10 albo oznacz niższe jako review. |
| data.transcript_processed.preferred_date | Deal → Close Date albo termin zadania | Użyj, jeśli klient podał termin lub preferowaną datę kontaktu. |
| data.transcript_processed.client_city | Contact → City | Miasto klienta; przydatne do segmentacji albo pipeline’u regionalnego. |
| data.transcript_processed.client_address | Contact → Street Address | Uzupełnij adres osoby/organizacji, jeśli klient go podał. |
| data.transcript_processed.services_match | Filter / deal tag | false = zapytanie poza ofertą; nie twórz dealu albo oznacz do odrzucenia. |
| data.transcript_processed.additional_details | Note → Note body | Dodatkowe ustalenia z rozmowy; dopisz do treści aktywności. |
| data.recording_url | Note → Recording link | Link do odsłuchu; może wygasnąć po usunięciu rozmowy zgodnie z RODO. |
| data.call_id | Custom property → Heilo Call ID | Klucz idempotencji. Pomaga nie tworzyć drugiego wpisu dla tej samej rozmowy. |
| data.duration | Custom property albo notatka | Heilo 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
- Trigger: Webhooks by Zapier → Catch Hook. W Heilo zostaw domyślny tryb prosty.
- Filter by Zapier: przepuszczaj event_type = call.completed; na czas testu dopuść też webhook.test (albo filtruj po data._test = true).
- 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.
- 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.
- 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
- Trigger: Webhooks → Custom webhook. Scenariusz musi być włączony i ustawiony na uruchamianie po przyjściu danych.
- Dodaj filtr za webhookiem: event_type = call.completed; podczas mapowania testowego dopuść także webhook.test (albo filtruj po data._test = true).
- 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).
- Zoho CRM → Create an Object w module Deals. Deal Name ustaw z subject, wybierz Stage i powiąż deal z kontaktem.
- 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 Heilo | Pole / akcja Zoho CRM | Zastosowanie |
|---|---|---|
| event_type | Filter / Router | Przetwarzaj call.completed; webhook.test tylko do mapowania pól. |
| data.customer_phone_e164 | Contact → Phone | Głó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_name | Contact → Last Name | Zoho wymaga Last Name; jeśli caller_name jest puste, użyj numeru telefonu jako nazwy awaryjnej. |
| data.transcript_processed.subject | Deal → Deal Name | Najlepszy tytuł szansy; fallback do service_needed. |
| data.transcript_processed.service_needed | Deal → Deal Name albo custom field | Kategoria zapytania, przydatna też do pipeline'u lub etykiety. |
| data.transcript_processed.summary | Note → Note Content | Krótki opis rozmowy widoczny przy szansie. |
| data.transcript_processed.lead_score | Custom field / filter | Np. twórz lead/deal tylko od 7/10 albo oznacz niższe jako review. |
| data.transcript_processed.preferred_date | Deal → Closing Date albo termin zadania | Użyj, jeśli klient podał termin lub preferowaną datę kontaktu. |
| data.transcript_processed.client_city | Contact → Mailing City | Miasto klienta; przydatne do segmentacji albo pipeline’u regionalnego. |
| data.transcript_processed.client_address | Contact → Mailing Street | Uzupełnij adres osoby/organizacji, jeśli klient go podał. |
| data.transcript_processed.services_match | Filter / tag | false = zapytanie poza ofertą; nie twórz dealu albo oznacz do odrzucenia. |
| data.transcript_processed.additional_details | Note → Note Content | Dodatkowe ustalenia z rozmowy; dopisz do treści aktywności. |
| data.recording_url | Note → Note Content (link) | Link do odsłuchu; może wygasnąć po usunięciu rozmowy zgodnie z RODO. |
| data.call_id | Custom field → Heilo Call ID | Klucz idempotencji. Pomaga nie tworzyć drugiego wpisu dla tej samej rozmowy. |
| data.duration | Custom field albo notatka | Heilo 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.