Saltar al contenido

Make y n8n ​

Make y n8n reciben webhooks y se comunican con miles de aplicaciones. Con ellos conectas Yarla a tu CRM, Slack o hoja de cálculo sin escribir código. Este artículo incluye recetas en dos direcciones: recibir datos después de la conversación y devolver datos del cliente antes de la llamada.

Todas las recetas usan la acción Petición HTTP. Los nombres de los campos son los del webhook después de la llamada y del webhook entrante.

Make ​

Receta 1: después de la llamada, a Google Sheets ​

  1. En Make, crea un escenario nuevo y elige Webhooks → Custom webhook como primer módulo. Haz clic en Add, ponle un nombre al webhook y copia la URL.
  2. En Yarla, ve a Asistentes → Tareas de tu asistente y, en la tarjeta Acciones, haz clic en Añadir nuevo. Elige Petición HTTP. Ponle un nombre a la acción, elige en Cuándo la opción Después de la conversación, pega la URL y deja el Método en POST y la Plantilla del cuerpo vacía. La acción se guarda automáticamente en cuanto tiene un nombre y una dirección web válida.
  3. En Make, haz clic en Run once y llama al número del asistente. Después de la llamada, Make recibe la petición y muestra "Successfully determined"; la estructura de datos ya es conocida.
  4. Añade el módulo Google Sheets → Add a Row. Elige tu hoja de cálculo y la hoja, y arrastra los campos a las columnas: startTimestamp, personNumber, outcome, summary, conversationLink.
  5. Guarda el escenario y actívalo. En la programación, elige Immediately.

A partir de ahora, cada conversación de este asistente aparece como una fila. El Custom webhook responde de inmediato con "Accepted", así que nunca te acercas al tiempo de espera de 8 segundos.

También llegan las conversaciones terminadas por SMS, WhatsApp y chat web. En el chat web, personNumber puede estar vacío, y en una llamada de un número oculto el campo puede estar vacío o contener algo que no es un número de teléfono. Si solo quieres las llamadas, añade un filtro con channel igual a voice.

Volver a determinar la estructura de datos

Si más adelante añades variables en Variables personalizadas que extraer de la acción, haz clic en Detect new values en el módulo del webhook y ten otra conversación en la que esas variables se rellenen. Si no, Make no muestra los campos nuevos en el panel de asignación.

Receta 2: después de la llamada, un mensaje de Slack ​

Empieza con un Custom webhook como en la receta 1 y añade el módulo Slack → Create a Message. Elige el canal y compón el texto con los campos outcome, personNumber, summary y conversationLink, por ejemplo:

text
Nueva conversación (resolved) de +31612345678
Jan de Vries informa de una fuga en el grifo de la cocina y quiere un presupuesto.
Ver conversación: https://<dominio-del-panel>/es/inbox/<id-de-conversacion>

El campo outcome siempre es un código en inglés, como resolved. Si solo quieres avisar de ciertas conversaciones, añade un filtro sobre outcome entre los módulos, por ejemplo solo callback_requested.

Receta 3: después de la llamada, un contacto y un ticket en HubSpot ​

  1. Después del Custom webhook, añade un filtro para que personNumber tenga que empezar por + y luego añade HubSpot CRM → Search for Contacts con el filtro número de teléfono igual a personNumber. El primer filtro detiene las conversaciones sin un número utilizable, como un chat web sin número o una llamada de un número oculto. Por eso, esas conversaciones no generan ni contacto ni ticket.
  2. Añade un Router. Rama "no encontrado": HubSpot CRM → Create a Contact con personNumber como número de teléfono y contact.name como nombre (vacío si no se conoce el nombre). Rama "encontrado": usa el contacto existente.
  3. En ambas ramas, añade HubSpot CRM → Create a Ticket con la primera línea de summary como asunto y summary más conversationLink como contenido. Asocia el ticket al contacto.

n8n ​

  1. Crea un flujo de n8n con un nodo Webhook como primer nodo. Pon HTTP Method en POST y elige una ruta. Pon Respond en Immediately para el webhook después de la llamada, o en Using 'Respond to Webhook' Node para el webhook entrante (lo verás más abajo).
  2. Copia la Test URL, ponla en tu acción de Petición HTTP y haz clic en Listen for test event en n8n. Llama al asistente; después de la llamada verás los datos en el nodo. n8n solo escucha durante 120 segundos, así que haz una llamada de prueba corta. Si alojas n8n por tu cuenta, la URL debe ser accesible públicamente: las direcciones internas y privadas se rechazan.
  3. Añade los nodos siguientes, por ejemplo Google Sheets → Append row, Slack → Send message o HubSpot → Ticket → Create.
  4. En esos nodos, haz referencia a los campos con expresiones. Justo después del nodo Webhook, los datos están bajo body. Las variables personalizadas están ahí directamente con su propio nombre, en este caso issueType:
text
{{ $json.body.summary }}
{{ $json.body.personNumber }}
{{ $json.body.issueType }}

Si antes insertas un nodo Edit Fields (Set) que copia los campos, pasa a ser {{ $json.summary }}.

  1. Publica el flujo con Publish (en versiones antiguas de n8n: activar) y sustituye en la acción la Test URL por la Production URL. La Test URL solo funciona mientras escuchas en el editor.

Devolver JSON para el webhook entrante ​

En el webhook entrante, Yarla envía el número de teléfono de quien llama en personNumber y espera recibir en 3 segundos un objeto JSON, mejor si es plano. Tanto Make como n8n pueden hacerlo. Con un número oculto, personNumber puede estar vacío o contener algo que no es un número de teléfono. Trátalo como un número desconocido y devuelve {}.

En la acción Petición HTTP, elige en Cuándo la opción Antes de la llamada y deja la Plantilla del cuerpo vacía. Esta petición solo se ejecuta en llamadas entrantes, así que pruébala con una llamada real.

Make ​

  1. Webhooks → Custom webhook como primer módulo, en un escenario nuevo con un webhook nuevo. Así estas peticiones no llegan a tu escenario de después de la llamada.
  2. Un módulo de búsqueda, por ejemplo HubSpot CRM → Search for Contacts por personNumber, o Google Sheets → Search Rows en una lista de clientes.
  3. Como último módulo, Webhooks → Webhook response con Status 200, en Custom headers la cabecera Content-Type con el valor application/json, y como Body un JSON en el que insertas los campos del módulo de búsqueda:
json
{
  "customerName": "Jan de Vries",
  "customerId": "C-1042"
}

Si la búsqueda no devuelve nada, devuelve {}. Usa para ello un router con un filtro, o la función ifempty() en el cuerpo.

n8n ​

  1. Nodo Webhook con Respond en Using 'Respond to Webhook' Node.
  2. Un nodo de búsqueda, por ejemplo HubSpot → Contact → Search o Google Sheets → Get Row(s) con un filtro en la columna del teléfono.
  3. Nodo Respond to Webhook con Respond With en JSON y en Response Body:
json
{
  "customerName": "{{ $json.properties.firstname }} {{ $json.properties.lastname }}",
  "customerId": "{{ $json.id }}"
}

Activa Always Output Data en el nodo de búsqueda para que el flujo también continúe con un número desconocido y devuelva {} o campos vacíos.

Tres segundos

Toda la cadena debe responder en 3 segundos; si no, el asistente empieza sin contexto. Limítate a una sola búsqueda. Si tu CRM es demasiado lento, guarda una copia de tu lista de clientes en un Data store de Make o en una hoja de Google Sheets y busca ahí.

Zapier ​

Para el webhook después de la llamada, Zapier funciona bien: usa Webhooks by Zapier → Catch Hook, pega la URL en la acción y crea tu Zap. Para el webhook entrante, Zapier es menos adecuado: un Catch Hook responde de inmediato con su propia confirmación y no puede devolver fácilmente tu propio JSON dentro de la misma petición. Para eso, usa Make, n8n o tu propio endpoint.

Comprobar la firma ​

Comprobar la cabecera X-Yarla-Signature es opcional en Make y n8n; las URL de webhook de Make y las rutas que genera n8n son largas e imposibles de adivinar. Si aun así quieres hacerlo, usa tu secreto de webhook como clave. Está en Ajustes → Conexiones, en la tarjeta Secreto de webhook, que solo ve un Administrador.

  • n8n: activa la opción Raw Body en el nodo Webhook y calcula en un nodo Code el HMAC-SHA256 sobre t + "." + body, como se explica en Webhooks. Los datos llegan entonces sin procesar, así que conviértelos tú a JSON después. Las cabeceras están en $json.headers['x-yarla-signature'] (en minúsculas).
  • Make: en el Custom webhook, en Advanced settings, activa Get request headers para poder leer la cabecera y JSON pass-through para recibir el cuerpo como texto. Calcula el HMAC con la función sha256() y el secreto como clave, sobre t, un punto y ese texto. Después recuperas los campos por separado con un módulo Parse JSON.

Una alternativa más sencilla: en Cabeceras de la acción de Petición HTTP, añade una cabecera propia con un token largo y aleatorio y compruébala con un filtro en Make (para esto también debe estar activado Get request headers) o con un nodo IF en n8n.

Artículos relacionados ​

Yarla Ayuda — la guía de tu asistente telefónico.