Función para automatizar mensajes de WhatsApp desde una Workflow Rule

Función para automatizar mensajes de WhatsApp desde una Workflow Rule

En Zoho CRM podemos generar functions para ejecutar un API. Además, estas functions las podemos utilizar junto a las Workflows Rules para realizar acciones automatizadas. En este artículo vamos a ver cómo construir una función de Zoho CRM y el API de WOZTELL para enviar mensajes de WhatsApp. Para ello veremos los siguientes puntos:
  1. Generar un Access Token
  2. Construir la función

Generar un Access Token

La API de WOZTELL necesita un Access Token para verificar la identidad del usuario. Por ello, antes de empezar a usar nuestra API debemos generarnos un token. Para ello podemos usar la documentación de la plataforma para generar un token.

Recuerda que el API para enviar mensajes utiliza los Scopes: bot:sendResponses, bot:admin

Pulsa AQUÍ para ir directamente al artículo para generar los tokens.

Construir la función

En Zoho CRM podemos crear una función siguiendo los siguientes pasos:

1. Accedemos a nuestra cuenta de Zoho CRM

2. Accedemos a Settings


3. En el apartado AUTOMATION accedemos a Workflow Rules


4. Creamos una nueva regla mediante el botón + Create Rule:


5. Seleccionamos contra qué módulo va a ir enlazada la regla, el nombre que le daremos y una descripción:

6. Una vez se han definido las condiciones que queremos que se apliquen en la regla, pasamos a elegir que la acción que queremos que se ejecute sea una función:


Una vez ya lo hemos configurado, podremos añadir código a la función creada. A continuación se muestra el código a añadir:

// Standard parameters
token = "your-WOZTELL-token";
phone = "your-destination-phone";
channelId = "your-WOZTELL-channel-id";
templateName = "your-whatsapp-template-name";
templateLanguage = "your-whatsapp-language-code";

if(phone.startsWith("00")){
      phone = phone.removeFirstOccurence("00");
}else if(phone.startsWith("+")){
      phone = phone.removeFirstOccurence("+");
}

// Function tag is used in the Zoho CRM logs and Zoho Cliq integration
// It is saved in the Woztell Logs Module and Zoho Cliq message
function_tag = "your-function-tag";

// You can decide if you want to post the message in Zoho Cliq or not.
// Set true to publish or false to not publish it
// post_in_zoho_cliq = true;
// or
// post_in_zoho_cliq = false;
post_in_zoho_cliq = false;

// Body template parameters
// Don't remove bodyParameterList = List();
bodyParameterList = List();
// Comment this code if the template doesn't have parameters
bodyParameter1 = Map();
bodyParameter1.put("type","text");
bodyParameter1.put("text","parameter-1-value");
bodyParameterList.add(bodyParameter1);

// DON'T MODIFY THE FOLLOWING CODE !!
postMessage = Map();
postMessage.put("channelId",channelId);
postMessage.put("recipientId",phone);
responseMap = Map();
responseMap.put("type","TEMPLATE");
responseMap.put("elementName",templateName);
responseMap.put("languageCode",templateLanguage);
componentsList = list();

if(!bodyParameterList.isEmpty())
{
      bodyComponent = Map();
      bodyComponent.put("type","body");
      bodyComponent.put("parameters",bodyParameterList);
      componentsList.add(bodyComponent);
}

responseMap.put("components",componentsList);
responseList = List();
responseList.add(responseMap);
postMessage.put("response",responseList);
message_meta = Map();
message_meta_zoho = Map();
message_meta_zoho.put("user",function_tag);
message_meta_zoho.put("cliq",post_in_zoho_cliq);
// module: Leads or Contacts
message_meta_zoho.put("record",{"id":"XXXXX".toString(),"name": "XXXX","module":"Leads"});
message_meta.put("zoho",message_meta_zoho);
postMessage.put("meta",message_meta);

response = invokeurl
[
      url :PostURL
      type :POST
      parameters:postMessage.toString()
];

info response;

Este código permite que se puedan realizar modificaciones de forma que se pueda automatizar el envío. A continuación se indican las variables que pueden recibir modificaciones:

  1. token = "your-WOZTELL-token"; 
      Para esta variable debemos generar un token desde la plataforma de Woztell como ya se indica al inicio de este artículo.

  1. Para la variable phone, podemos eliminar esa línea y añadir un argumento como se muestra a continuación:


Para añadir el argumento y que este pueda tener un valor dinámico dependiendo de cada cliente, podemos usar # y seleccionar el módulo que queremos (por ejemplo, #Leads o #Contactos). Una vez seleccionado el módulo contra el que va relacionado, podemos elegir sobre qué campo. En nuestro caso, hemos seleccionado el campo Phone del módulo Leads.




  1. Para la variable channelId, podemos obtener este valor siguiendo los pasos explicados en este otro artículo. Cabe destacar que cada número de teléfono de WhatsApp está activado en un channel distinto en la plataforma de Woztell.

  1. Las variables templateName templateLanguage se refieren al nombre de la plantilla que queremos que se envíe y al idioma de la misma, pues una plantilla puede ser creada en distintos idiomas. Esta información puede ser recogida de la plataforma de Woztell, en el apartado Channels, al pulsar sobre el botón Edit del canal y dirigirnos a Platform.






  1. A continuación, la siguiente variable que podemos modificar es la llamada function_tag. Con esta variable podemos indicar, para que quede constancia, el nombre de la regla que activa el envío o, por ejemplo, qué usuario envía el mensaje. Es decir, podemos añadir un identificador que nos proporcione información para cuando el mensaje se publique en Zoho Cliq o lo veamos en el módulo "Woztell logs".

  1. La siguiente variable se llama post_in_zoho_cliq. Con esta variable podemos decidir si queremos que los mensajes que envíen las automatizaciones se publiquen en Zoho Cliq o si, por el contrario, no queremos que se vean en Zoho Cliq. Para ello únicamente debemos establecerla como true (los mensajes se publican en Zoho Cliq) o false (los mensajes NO se publican en Zoho Cliq).

Cabe destacar que, si la plantilla NO cuenta con parámetros, deberemos comentar la sección añadiendo // en cada línea
bodyParameter1 = Map();
bodyParameter1.put("type","text");
bodyParameter1.put("text","parameter-1-value");
bodyParameterList.add(bodyParameter1);

Si la plantilla contara con más de 1 parámetro, deberemos duplicar esta sección tantas veces como parámetros contenga la plantilla e ir modificando el nombre de cada uno de ellos:
bodyParameter1 = Map();
bodyParameter1.put("type","text");
bodyParameter1.put("text","parameter-1-value");
bodyParameterList.add(bodyParameter1);

bodyParameter2 = Map();
bodyParameter2.put("type","text");
bodyParameter2.put("text","parameter-2-value");
bodyParameterList.add(bodyParameter2);
...

Una vez ya hemos configurado todas estas variables, el resto de código no es necesario modificarlo.

A continuación se presenta el código de la función como ejemplo utilizando una plantilla de WhatsApp con un documento en el HEADER y un parámetro en el BODY:
// Standard parameters
token = "your-WOZTELL-token";
phone = "your-destination-phone";
channelId = "your-WOZTELL-channel-id";
templateName = "template-name";
templateLanguage = "template-language";

if(phone.startsWith("00")){
      phone = phone.removeFirstOccurence("00");
}else if(phone.startsWith("+")){
      phone = phone.removeFirstOccurence("+");
}

// Function tag is used in the Zoho CRM logs and Zoho Cliq integration
// It is saved in the Woztell Logs Module and Zoho Cliq message
function_tag = "automated message sample";

// You can decide if you want to post the message in Zoho Cliq or not.
// Put true to publish or false to not publish
// post_in_zoho_cliq = true;
// or
// post_in_zoho_cliq = false;
post_in_zoho_cliq = true;
//
// Header files
// Don't remove headerParameterList = List();
headerParameterList = List();
// If the template has a file (document, image, video) in the header
// Comment this code if the template doesn't have header or header is text
headerParameter1 = Map();
headerParameter1.put("type","document");
headerParameter1.put("document", {"link":"url of the file"});
headerParameterList.add(headerParameter1);
//
// Body template parameters
// Don't remove bodyParameterList = List();
bodyParameterList = List();
// Comment this code if the template doesn't have parameters
bodyParameter1 = Map();
bodyParameter1.put("type","text");
bodyParameter1.put("text","test Woztell");
bodyParameterList.add(bodyParameter1);

//
//
//
// DON'T MODIFY THE FOLLOWING CODE !!
postMessage = Map();
postMessage.put("channelId",channelId);
postMessage.put("recipientId",phone);
responseMap = Map();
responseMap.put("type","TEMPLATE");
responseMap.put("elementName",templateName);
responseMap.put("languageCode",templateLanguage);
componentsList = list();

if(!headerParameterList.isEmpty())
{
headerComponent = Map();
headerComponent.put("type","header");
headerComponent.put("parameters",headerParameterList);
componentsList.add(headerComponent);
}

if(!bodyParameterList.isEmpty())
{
bodyComponent = Map();
bodyComponent.put("type","body");
bodyComponent.put("parameters",bodyParameterList);
componentsList.add(bodyComponent);
}

responseMap.put("components",componentsList);
responseList = List();
responseList.add(responseMap);
postMessage.put("response",responseList);
message_meta = Map();
message_meta_zoho = Map();
message_meta_zoho.put("user",function_tag);
message_meta_zoho.put("cliq",post_in_zoho_cliq);
// module: Leads or Contacts
message_meta_zoho.put("record",{"id":"XXXXX".toString(),"name": "XXXX","module":"Leads"});
message_meta.put("zoho",message_meta_zoho);
postMessage.put("meta",message_meta);

response = invokeurl
[
url :PostURL
type :POST
parameters:postMessage.toString()
];

info response;