Make en n8n
Make en n8n ontvangen webhooks en praten met duizenden apps. Daarmee koppel je Yarla zonder code aan je CRM, Slack of spreadsheet. Dit artikel bevat recepten in twee richtingen: gegevens ontvangen na het gesprek, en klantgegevens teruggeven vóór het gesprek.
Alle recepten gebruiken de actie HTTP-verzoek. De veldnamen zijn die van de webhook na het gesprek en de inkomende webhook.
Make
Recept 1: na het gesprek naar Google Sheets
- Maak in Make een nieuw scenario en kies als eerste module Webhooks → Custom webhook. Klik op Add, geef de webhook een naam en kopieer de URL.
- Ga in Yarla naar Assistenten → Taken van je assistent en klik op de kaart Acties op Nieuw toevoegen. Kies HTTP-verzoek. Geef de actie een naam, kies bij Wanneer de optie Na het gesprek, plak de URL en laat de Methode op
POSTen het Body-sjabloon leeg. De actie wordt automatisch opgeslagen zodra ze een naam en een geldig webadres heeft. - Klik in Make op Run once en bel het nummer van de assistent. Na het gesprek ontvangt Make het verzoek en toont "Successfully determined"; de datastructuur is nu bekend.
- Voeg de module Google Sheets → Add a Row toe. Kies je spreadsheet en werkblad en sleep de velden naar de kolommen:
startTimestamp,personNumber,outcome,summary,conversationLink. - Sla het scenario op en zet het aan. Kies bij de planning Immediately.
Vanaf nu verschijnt elk gesprek van deze assistent als rij. De Custom webhook antwoordt direct met "Accepted", dus je zit nooit tegen de time-out van 8 seconden aan.
Ook afgeronde sms-, WhatsApp- en webchatgesprekken komen binnen. Bij webchat kan personNumber leeg zijn, en bij een oproep van een afgeschermd nummer kan het veld leeg zijn of geen telefoonnummer bevatten. Wil je alleen telefoongesprekken, zet dan een filter op channel gelijk aan voice.
Datastructuur opnieuw bepalen
Voeg je later bij Extra variabelen om te extraheren variabelen toe aan de actie, klik dan in de webhookmodule op Detect new values en voer opnieuw een gesprek waarin die variabelen gevuld worden. Anders ziet Make de nieuwe velden niet in het mappingpaneel.
Recept 2: na het gesprek een Slack-bericht
Begin net als in recept 1 met een Custom webhook en voeg de module Slack → Create a Message toe. Kies het kanaal en bouw de tekst op uit de velden outcome, personNumber, summary en conversationLink, bijvoorbeeld:
Nieuw gesprek (resolved) van +31612345678
Jan de Vries meldt een lekkende keukenkraan en wil een offerte.
Bekijk gesprek: https://<dashboard-domein>/nl/inbox/<gespreks-id>Het veld outcome is altijd een Engelse code, zoals resolved. Wil je alleen bepaalde gesprekken melden, zet dan tussen de modules een filter op outcome, bijvoorbeeld alleen callback_requested.
Recept 3: na het gesprek een HubSpot-contact en -ticket
- Zet na de Custom webhook een filter dat
personNumbermet+moet beginnen en voeg daarna HubSpot CRM → Search for Contacts toe met als filter telefoonnummer gelijk aanpersonNumber. Het eerste filter houdt gesprekken zonder bruikbaar nummer tegen, zoals een webchat zonder nummer of een oproep van een afgeschermd nummer. Die leveren dus geen contact en geen ticket op. - Voeg een Router toe. Tak "niet gevonden": HubSpot CRM → Create a Contact met
personNumberals telefoonnummer encontact.nameals naam (leeg als de naam niet bekend is). Tak "gevonden": gebruik het bestaande contact. - Voeg in beide takken HubSpot CRM → Create a Ticket toe met als onderwerp de eerste regel van
summaryen als inhoudsummaryplusconversationLink. Koppel het ticket aan het contact.
n8n
- Maak een workflow met als eerste node Webhook. Zet HTTP Method op
POSTen kies een pad. Zet Respond op Immediately voor de webhook na het gesprek, of op Using 'Respond to Webhook' Node voor de inkomende webhook (zie verderop). - Kopieer de Test URL, zet die in je HTTP-verzoek-actie en klik in n8n op Listen for test event. Bel de assistent; na het gesprek zie je de gegevens in de node. n8n luistert maar 120 seconden, dus houd het gesprek waarmee je test kort. Draai je n8n zelf, dan moet de URL publiek bereikbaar zijn: interne en privé-adressen worden geweigerd.
- Voeg de vervolgnodes toe, bijvoorbeeld Google Sheets → Append row, Slack → Send message of HubSpot → Ticket → Create.
- Verwijs in die nodes naar de velden met expressies. Direct achter de Webhook-node staat de payload onder
body. Eigen variabelen staan daarin direct onder hun eigen naam, hierissueType:
{{ $json.body.summary }}
{{ $json.body.personNumber }}
{{ $json.body.issueType }}Zet je er eerst een Edit Fields (Set)-node tussen die de velden overneemt, dan wordt het {{ $json.summary }}.
- Publiceer de workflow met Publish (in oudere n8n-versies: activeren) en vervang in de actie de Test URL door de Production URL. De Test URL werkt alleen terwijl je in de editor luistert.
JSON teruggeven voor de inkomende webhook
Bij de inkomende webhook stuurt Yarla het telefoonnummer van de beller in personNumber en verwacht binnen 3 seconden een JSON-object terug, het liefst plat. Make en n8n kunnen dat allebei. Bij een afgeschermd nummer kan personNumber leeg zijn of geen telefoonnummer bevatten. Behandel dat als een onbekend nummer en geef {} terug.
Kies in de actie HTTP-verzoek bij Wanneer de optie Vóór het gesprek en laat het Body-sjabloon leeg. Dit verzoek loopt alleen bij inkomende telefoongesprekken, dus test het met een echte oproep.
Make
- Webhooks → Custom webhook als eerste module, in een nieuw scenario met een nieuwe webhook. Zo komen deze verzoeken niet terecht in je scenario voor na het gesprek.
- Een opzoekmodule, bijvoorbeeld HubSpot CRM → Search for Contacts op
personNumber, of Google Sheets → Search Rows in een klantenlijst. - Als laatste module Webhooks → Webhook response met Status
200, bij Custom headers de headerContent-Typemet waardeapplication/json, en als Body JSON waarin je de velden uit de opzoekmodule invoegt:
{
"customerName": "Jan de Vries",
"customerId": "C-1042"
}Levert de opzoekmodule niets op, geef dan {} terug. Gebruik daarvoor een router met een filter, of de functie ifempty() in de body.
n8n
- Webhook-node met Respond op Using 'Respond to Webhook' Node.
- Een opzoeknode, bijvoorbeeld HubSpot → Contact → Search of Google Sheets → Get Row(s) met een filter op de telefoonkolom.
- Respond to Webhook-node met Respond With op JSON en bij Response Body:
{
"customerName": "{{ $json.properties.firstname }} {{ $json.properties.lastname }}",
"customerId": "{{ $json.id }}"
}Zet bij de opzoeknode Always Output Data aan, zodat de workflow ook bij een onbekend nummer doorloopt en {} of lege velden teruggeeft.
Drie seconden
De hele keten moet binnen 3 seconden antwoorden, anders begint de assistent zonder context. Beperk je tot één opzoekactie. Is je CRM te traag, houd dan een kopie van je klantenlijst bij in een Make Data store of een Google Sheet en zoek daarin.
Zapier
Voor de webhook na het gesprek werkt Zapier prima: gebruik Webhooks by Zapier → Catch Hook, plak de URL in de actie en bouw je Zap. Voor de inkomende webhook is Zapier minder geschikt: een Catch Hook antwoordt direct met zijn eigen bevestiging en kan niet eenvoudig binnen hetzelfde verzoek je eigen JSON teruggeven. Gebruik daarvoor Make, n8n of een eigen endpoint.
Handtekening controleren
Het controleren van de header X-Yarla-Signature is in Make en n8n optioneel; de webhook-URL's van Make en de paden die n8n zelf genereert zijn lang en niet te raden. Wil je het toch, dan gebruik je je webhookgeheim als sleutel. Dat staat onder Instellingen → Koppelingen, op de kaart Webhookgeheim, die alleen een Beheerder ziet.
- n8n: zet in de Webhook-node de optie Raw Body aan en bereken in een Code-node de HMAC-SHA256 over
t + "." + body, zoals beschreven in Webhooks. De payload komt dan ongeparst binnen, dus zet je die daarna zelf om naar JSON. Headers staan onder$json.headers['x-yarla-signature'](kleine letters). - Make: zet in de Custom webhook onder Advanced settings de optie Get request headers aan om de header te kunnen lezen, en JSON pass-through om de body als tekst te krijgen. Bereken de HMAC met de functie
sha256()en het geheim als sleutel, overt, een punt en die tekst. De losse velden krijg je daarna terug met een Parse JSON-module.
Een eenvoudiger alternatief: voeg in de HTTP-verzoek-actie bij Headers een eigen header toe met een lang, willekeurig token en controleer die met een filter in Make (ook daarvoor moet Get request headers aan staan) of een IF-node in n8n.