Saltar al contenido principal

Reglas de flujo de trabajo

Automatice sus procesos de Helpdesk con reglas de flujo de trabajo personalizables. Las reglas de flujo de trabajo le permiten actualizar automaticamente los atributos de tickets, enviar notificaciones y desencadenar acciones especificas basadas en eventos o condiciones definidos. Esta funcion ayuda a reducir el trabajo manual, mantener la consistencia y acelerar los tiempos de respuesta.

Despues de la instalacion, Helpdesk MX crea automaticamente la regla de flujo de trabajo predeterminada "Auto-change status to Waiting for Customer on agent reply".


Informacion general​

Informacion generalInformacion general
  • Rule Name: defina un nombre descriptivo para la regla. Una denominacion clara ayuda a su equipo a identificar facilmente lo que hace cada regla.
  • Active: habilite o deshabilite la regla. Solo se ejecutan las reglas activas cuando se cumplen su evento y condiciones.
  • Event: elija el evento que desencadena la regla.
  • Priority / Sort Order: especifique el orden de procesamiento de la regla. Los numeros mas bajos se ejecutan primero. Esto ayuda a controlar que reglas tienen precedencia cuando multiples reglas se aplican al mismo evento.
  • Stop Further Rules Processing: detener la ejecucion de reglas con menor prioridad una vez que se ha aplicado esta regla. Util cuando desea que una regla especifica tenga control total de un evento.

Eventos​

Los eventos definen cuando se evalua la regla de flujo de trabajo. Los eventos disponibles incluyen:

  • New Ticket — se activa cuando se crea un nuevo ticket.
  • New Customer Reply — se activa cuando un cliente envia una nueva respuesta.
  • New Staff Reply — se activa cuando un agente publica una respuesta.
  • New Third Party Reply — se activa cuando un tercero envia un mensaje.
  • Ticket Assigned — se activa cuando un ticket se asigna a un usuario.
  • Ticket Updated — se activa cuando se actualizan campos del ticket.
  • Cron Every Hour — activado por el sistema cada hora, permitiendo acciones basadas en tiempo.

Condiciones​

Las condiciones definen cuando debe ejecutarse una regla de flujo de trabajo. Puede usar una o multiples condiciones, combinarlas con logica ALL/ANY e incluso crear grupos anidados para filtrado avanzado. Deje esta seccion vacia para que la regla se ejecute en cada ocurrencia del evento.

CondicionesCondiciones

Campos disponibles​

Puede construir condiciones usando los siguientes campos:

  • Subject — verifica palabras o frases en el asunto del ticket.
  • Customer Email — coincide con la direccion de correo electronico del cliente.
  • Customer Name — compara el nombre del cliente.
  • Channel — filtra tickets creados desde fuentes especificas (ej., correo electronico, formulario de contacto, API).
  • Department — coincide con el departamento actual asignado al ticket.
  • Department (Before Change) — permite comparacion con el departamento antes de un evento de actualizacion.
  • Folder — verifica a que carpeta pertenece actualmente el ticket.
  • Folder (Before Change) — verifica la carpeta antes del ultimo cambio.
  • Owner — coincide con el agente asignado.
  • Owner (Before Change) — compara el propietario antes de una actualizacion.
  • Priority — verifica la prioridad actual del ticket.
  • Priority (Before Change) — compara la prioridad antes de que fuera actualizada.
  • Status — verifica el estado actual del ticket.
  • Status (Before Change) — compara el estado anterior.
  • Last Message — le permite verificar el contenido en el ultimo mensaje.
  • Last Reply By — define quien respondio ultimo (cliente, personal o tercero).
  • Hours Since Created — tiempo transcurrido desde que se creo el ticket.
  • Hours Since Last Reply — tiempo desde que se hizo la ultima respuesta.
  • Hours Since Updated — tiempo desde que se modifico el ticket por ultima vez.

Operadores de condicion​

Cada condicion puede usar uno de los siguientes operadores para definir como se comparan los valores:

  • Equals — se activa cuando el valor del campo coincide exactamente con el valor especificado.
  • Not Equals — se activa cuando el valor del campo difiere del valor especificado.
  • Greater Than — se activa cuando el valor es mayor que el especificado (principalmente usado con campos numericos o de tiempo).
  • Greater Than or Equals — se activa cuando el valor es mayor o igual al especificado.
  • Less Than — se activa cuando el valor es menor que el especificado.
  • Less Than or Equals — se activa cuando el valor es menor o igual al especificado.
  • Between — se activa cuando el valor cae entre dos numeros especificados (util para condiciones basadas en tiempo).
  • Matches Regex — compara valores de campos usando expresiones regulares para coincidencia de patrones avanzada.
  • Starts With — se activa si el campo comienza con el texto especificado.
  • Ends With — se activa si el campo termina con el texto especificado.
  • Is Empty — se activa cuando el campo no tiene valor.
  • Is Not Empty — se activa cuando el campo contiene cualquier valor.
  • Contains — se activa cuando el campo incluye el texto especificado.
  • Does Not Contain — se activa cuando el campo no incluye el texto especificado.

Acciones​

Las acciones definen que sucede una vez que se cumplen todas las condiciones. Multiples acciones pueden combinarse dentro de una sola regla.

AccionesAcciones

Las acciones disponibles incluyen:

  • Set Status — actualizar el estado del ticket.
  • Set Priority — cambiar el nivel de prioridad.
  • Set Department — reasignar el ticket a otro departamento.
  • Set Owner — asignar a un agente especifico.
  • Change Folder — mover el ticket a una carpeta especifica.
  • Add Tags — agregar etiquetas para categorizacion.
  • Remove Tags — eliminar etiquetas existentes del ticket.
  • Send Email — enviar notificaciones por correo electronico a destinatarios especificados.
  • Run Script — ejecutar codigo JavaScript personalizado para automatizacion avanzada.

Accion Send Email​

La accion Send Email le permite enviar notificaciones automaticas por correo electronico cuando se activa una regla. Esto es util para alertar a miembros del equipo, notificar a clientes o comunicarse con partes externas.

Opciones disponibles:

  • Send to ticket owner — notificar al agente asignado.
  • Send to all department users — alertar a todos los miembros del departamento del ticket.
  • Send to customer — informar al cliente sobre actualizaciones.
  • Send to other addresses — especificar direcciones de correo electronico personalizadas.
  • Email Subject — definir la linea de asunto del correo electronico (admite variables de plantilla Liquid).
  • Email Body — componer el contenido del correo electronico (admite variables de plantilla Liquid).
  • Include attachments — adjuntar archivos del ultimo mensaje.

Variables de plantilla​

Puede usar variables de plantilla Liquid en los campos Email Subject y Email Body para insertar dinamicamente informacion del ticket, cliente y mensaje.

Variables de ticket:

VariableDescripcion
{{ ticket.code }}Codigo del ticket (ej., T-001)
{{ ticket.subject }}Linea de asunto del ticket
{{ ticket.created_at }}Marca de tiempo de creacion del ticket
{{ ticket.updated_at }}Marca de tiempo de ultima actualizacion
{{ ticket.customer_name }}Nombre completo del cliente
{{ ticket.customer_email }}Direccion de correo electronico del cliente
{{ ticket.admin_url }}Enlace directo al ticket en el panel de administracion
{{ ticket.admin_last_message_text }}Cuerpo de la ultima respuesta del agente (texto plano)
{{ ticket.admin_last_message_html }}Cuerpo de la ultima respuesta del agente (HTML)
{{ ticket.customer_last_message_text }}Cuerpo de la ultima respuesta del cliente (texto plano)
{{ ticket.customer_last_message_html }}Cuerpo de la ultima respuesta del cliente (HTML)

Variables del propietario/asignado:

VariableDescripcion
{{ owner.firstname }}Nombre del agente asignado
{{ owner.lastname }}Apellido del agente asignado
{{ owner.email }}Correo electronico del agente asignado
{{ owner.fullname }}Nombre completo del agente asignado
{{ owner.is_admin }}Si el propietario es administrador

Variables de departamento:

VariableDescripcion
{{ department.name }}Nombre del departamento
{{ department.sender_name }}Nombre del remitente del departamento

Variables de mensaje (cuando se activa por eventos de mensaje):

VariableDescripcion
{{ message.body_text }}Contenido del mensaje (texto plano)
{{ message.body_html }}Contenido del mensaje (HTML)
{{ message.type }}Tipo de mensaje
{{ message.created_at }}Marca de tiempo de creacion del mensaje

Variables de fecha/hora:

VariableDescripcion
{{ now }}Marca de tiempo actual (RFC3339)
{{ date }}Fecha actual (YYYY-MM-DD)
{{ time }}Hora actual (HH:MM:SS)
{{ year }}Ano actual

Ejemplo de plantilla de correo electronico:

Subject: Nueva respuesta en ticket #{{ ticket.code }}

Hola {{ owner.firstname }},

Un cliente ha respondido al ticket "{{ ticket.subject }}".

Cliente: {{ ticket.customer_name }} ({{ ticket.customer_email }})

Ultimo mensaje:
{{ ticket.customer_last_message_text }}

Ver ticket: {{ ticket.admin_url }}

Accion Run Script​

La accion Run Script le permite ejecutar codigo JavaScript personalizado para implementar logica de automatizacion compleja que va mas alla de simples asignaciones de campos. Los scripts pueden leer datos de tickets, tomar decisiones condicionales y actualizar multiples campos a la vez.

Propiedades de ticket disponibles (lectura):

PropiedadDescripcion
ticket.idIdentificador unico del ticket
ticket.subjectLinea de asunto del ticket
ticket.folderCarpeta actual (INBOX, ASSIGNED, SPAM, etc.)
ticket.tagsArreglo de etiquetas
ticket.statusObjeto con id, code y name
ticket.priorityObjeto con id y name
ticket.departmentObjeto con id y name
ticket.ownerObjeto con id, email, firstname, lastname
ticket.customerObjeto con id, email, firstname, lastname, name
ticket.<custom_field_code>Valor del campo personalizado por su codigo

Propiedades de ticket disponibles (escritura):

PropiedadValor esperado
ticket.statusCodigo de estado (string) o ID de estado
ticket.priorityNombre de prioridad (string) o ID de prioridad
ticket.departmentNombre de departamento (string) o ID de departamento
ticket.ownerCorreo electronico del usuario (string) o ID de usuario
ticket.folderNombre de carpeta: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tagsArreglo de strings de etiquetas
ticket.<custom_field_code>Valor que coincide con el tipo de campo personalizado

Funciones auxiliares:

FuncionRetorna
getStatuses()Arreglo de todos los estados disponibles
getPriorities()Arreglo de todas las prioridades disponibles
getDepartments()Arreglo de todos los departamentos disponibles
getUsers()Arreglo de todos los usuarios disponibles
fetch(url, options)Hacer solicitudes HTTP a APIs externas

Contexto de mensaje (disponible cuando la regla se activa por un evento de mensaje):

PropiedadDescripcion
message.idIdentificador unico del mensaje
message.body_textContenido del mensaje (texto plano)
message.body_htmlContenido del mensaje (HTML)
message.createdAtMarca de tiempo de creacion del mensaje

Ejemplos de scripts:

// Establecer prioridad basada en palabras clave del asunto
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
}
// Enrutar tickets a departamentos segun el contenido
if (ticket.subject.includes("billing") || ticket.subject.includes("invoice")) {
ticket.department = "Billing";
} else if (ticket.subject.includes("technical") || ticket.subject.includes("error")) {
ticket.department = "Technical Support";
}
// Manejo de clientes VIP
if (ticket.customer && ticket.customer.email.endsWith("@enterprise.com")) {
ticket.priority = "High";
ticket.tags = ["vip", "enterprise"];
}
// Establecer valor de campo personalizado
ticket.order_id = "12345";
ticket.vip_customer = true;
ticket.order_amount = 99.99;
// Obtener datos del cliente desde API externa y actualizar ticket
var response = fetch("https://api.example.com/customers/" + ticket.customer.email, {
headers: { "Authorization": "Bearer YOUR_API_KEY" }
});

if (response.ok && response.json) {
ticket.customer_tier = response.json.tier;
if (response.json.tier === "enterprise") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
}
}

Notas importantes:

  • Los scripts tienen un tiempo de espera de 10 segundos para evitar bucles infinitos.
  • Los valores de campo invalidos (estado inexistente, prioridad, etc.) se ignoran de manera elegante.
  • Los errores de script no afectan a otras reglas ni bloquean el sistema.
  • Los campos personalizados se referencian por su codigo, no por su nombre.

Notificaciones​

Puede enviar notificaciones automaticas por correo electronico cuando se ejecute la regla para mantener a todas las partes informadas.

NotificacionesNotificaciones

Las opciones de notificacion incluyen:

  • Send email to ticket owner — notificar al agente asignado.
  • Send email to all department users — alertar a todos los miembros del departamento.
  • Send email to customer — informar al cliente de los cambios.
  • Send email to other addresses — enviar a destinatarios externos.
  • Email Subject — especificar la linea de asunto.
  • Email Body — componer el contenido del correo electronico.
  • Attach files previously attached to the last message — incluir archivos adjuntos anteriores para contexto.

Ejemplos de reglas de flujo de trabajo​

Cambiar estado en respuesta del cliente
Cuando un cliente responde, el sistema cambia automaticamente el estado del ticket a Waiting for Agent.

Tipo: Workflow Rule
Is Active: Si
Event: New Customer Reply
Conditions: Status Not Equals Closed
Actions: Set Status -> Waiting for Agent
Nueva respuesta de tercero
Cuando un tercero envia un mensaje, el sistema establece el estado en Waiting for Agent y agrega una etiqueta `third_party`.

Tipo: Workflow Rule
Is Active: Si
Event: New Third Party Reply
Conditions: Ninguna
Actions:
Set Status -> Waiting for Agent
Add Tags -> third_party
Ticket asignado al personal
Cuando un ticket se asigna a un miembro del personal, se mueve automaticamente a la carpeta Assigned y envia una notificacion por correo electronico.

Tipo: Workflow Rule
Is Active: Si
Event: Ticket Assigned
Conditions: Ninguna
Actions:
Change Folder -> Assigned
Send email to ticket owner
Cerrar ticket despues de 72 horas sin respuesta
Si no se recibe respuesta en 72 horas, el ticket se cierra automaticamente.

Tipo: Workflow Rule
Is Active: Si
Event: Cron Every Hour
Conditions:
Status Equals Waiting for Customer
Hours Since Last Reply Greater Than 72
Actions: Set Status -> Closed
Script: Enrutar y priorizar segun dominio de correo del cliente
Enrutar clientes empresariales a soporte dedicado y establecer alta prioridad.

Tipo: Workflow Rule
Is Active: Si
Event: New Ticket
Conditions: Ninguna
Actions: Run Script

```javascript
if (ticket.customer && ticket.customer.email) {
var domain = ticket.customer.email.split("@")[1];

if (domain === "enterprise.com" || domain === "bigcorp.com") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.tags = ["enterprise", "priority"];
}
}
```
Script: Auto-categorizar tickets por palabras clave del asunto
Categorizar automaticamente tickets y establecer campos personalizados segun el contenido del asunto.

Tipo: Workflow Rule
Is Active: Si
Event: New Ticket
Conditions: Ninguna
Actions: Run Script

```javascript
var subject = ticket.subject.toLowerCase();

if (subject.includes("refund") || subject.includes("return")) {
ticket.department = "Billing";
ticket.category = "refund_request";
} else if (subject.includes("password") || subject.includes("login")) {
ticket.department = "Technical Support";
ticket.category = "account_access";
} else if (subject.includes("order") || subject.includes("shipping")) {
ticket.department = "Orders";
ticket.category = "order_inquiry";
}
```
Script: Escalar segun analisis de contenido del mensaje
Detectar palabras clave urgentes en mensajes y auto-escalar tickets.

Tipo: Workflow Rule
Is Active: Si
Event: New Customer Reply
Conditions: Ninguna
Actions: Run Script

```javascript
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
var urgentKeywords = ["asap", "urgent", "critical", "down", "outage", "emergency"];

for (var i = 0; i < urgentKeywords.length; i++) {
if (body.includes(urgentKeywords[i])) {
ticket.priority = "High";
ticket.tags = ticket.tags.concat(["escalated"]);
break;
}
}
}
```